Connexion S'inscrire

Connectez-vous

Login *
Mot de passe *
Se souvenir de moi

Créer un compte

Les champs marqués d'un astérisque (*) sont requis.
Nom *
Login *
Mot de passe *
Vérification mot de passe *
Email *
Vérification email *
Captcha *

Création d'un composant Joomla (partie 14) Options de publication


Dans cette partie,  nous allons, ajouter la prise en charge des options de publication qui font partie des champs standards de Joomla. Tout se passera au côté administrateur donc dans le dossier administrator. Si vous êtes arrivés directement sur cette page, peut-être que vous aimeriez commencer par le début: Partie 1 | Partie 2 | Partie 3 | Partie 4 | Partie 5 | Partie 6 | Partie 7 | Partie 8 | Partie 9 | Partie 10 | Partie 11 | Partie 12 | Partie 13

1 - Introduction

Les options de publication portera sur les champs comme la date de début publication, la date de fin de publication, la date de création, le nom de l'utilisateur qui l'a créé... Nous allons utiliser certains des champs que nous avons ajouté à notre table dans la base de données à la partie 9. Nous allons procéder exactement comme nous l'avons fait dans la partie 13.

2 - Le formulaire XML

Nous allons rajouter un nouveau fieldset dans le formulaire XML. il contiendra les options de publication. Ouvrons le fichier guitariste.xml qui se trouve dans models/forms/


<fieldset name="publishingoptions">
	<field name="created" type="calendar" label="JGLOBAL_FIELD_CREATED_LABEL"
	 description="JGLOBAL_FIELD_CREATED_DESC" class="inputbox" size="22"
	 format="%Y-%m-%d %H:%M:%S" filter="user_utc" labelclass="control-label" />

	<field name="created_by" type="user" label="JGLOBAL_FIELD_CREATED_BY_LABEL"
	 description="JGLOBAL_FIELD_CREATED_BY_DESC" labelclass="control-label" />
	 
	<field name="created_by_alias" type="text" label="JGLOBAL_FIELD_CREATED_BY_ALIAS_LABEL"
	 description="JGLOBAL_FIELD_CREATED_BY_ALIAS_DESC" class="inputbox" 
	 labelclass="control-label" size="20" />

	<field name="publish_up" type="calendar" label="JGLOBAL_FIELD_PUBLISH_UP_LABEL"
	 description="JGLOBAL_FIELD_PUBLISH_UP_DESC" class="inputbox"
	 format="%Y-%m-%d %H:%M:%S" size="22" filter="user_utc" labelclass="control-label" />
	 
	<field name="publish_down" type="calendar" label="JGLOBAL_FIELD_PUBLISH_DOWN_LABEL"
	 description="JGLOBAL_FIELD_PUBLISH_DOWN_DESC" class="inputbox"
	 format="%Y-%m-%d %H:%M:%S" size="22" filter="user_utc" labelclass="control-label" />      
</fieldset>

Maintenant le contenu du fichier devrait ressembler à ceci :


<?xml version="1.0" encoding="utf-8"?>
<form>
  <fieldset addfieldpath="/administrator/components/com_categories/models/fields">
    <field id="state" name="state" type="list"
      label="JSTATUS"
      description="JFIELD_PUBLISHED_DESC"
      class="input span12 small"
      size="1"
      default="1"
      >
        <option value="1">JPUBLISHED</option>
        <option value="0">JUNPUBLISHED</option>
        <option value="2">JARCHIVED</option>
        <option value="-2">JTRASHED</option>
      
      </field>
      
  
    <field name="id" type="text" 
      default="0" label="JGLOBAL_FIELD_ID_LABEL"
      readonly="true" class="readonly"
      description="JGLOBAL_FIELD_ID_DESC" />
      
      <field name="name" type="text" 
        label="COM_DJGUITARISTE_FIELD_NAME_LABEL"
        description="COM_DJGUITARISTE_FIELD_NAME_DESC"
        required="true"
        class="inputbox" />
      
      <field name="alias" type="text"
        label="JFIELD_ALIAS_LABEL"
        description="JFIELD_ALIAS_DESC"
        class="inputbox" />
        
      <field name="catid" type="category"
        extension="com_djguitariste"
        required="true"
        label="JCATEGORY"
        description="JFIELD_CATEGORY_DESC"
        class="inputbox" />
        
      <field name="picture" type="media" 
        directory="guitaristes" preview="true" 
        label="COM_DJGUITARISTE_FIELD_PICTURE_LABEL" 
        description="COM_DJGUITARISTE_FIELD_PICTURE_DESC" />
        
      <field name="intro" type="editor" 
        label="COM_DJGUITARISTE_FIELD_INTRO_LABEL"
        description="COM_DJGUITARISTE_FIELD_INTRO_DESC" 
        filter="safehtml" />
        
      <field name="biography" type="editor" 
        label="COM_DJGUITARISTE_FIELD_BIOGRAPHY_LABEL"
        description="COM_DJGUITARISTE_FIELD_BIOGRAPHY_DESC" 
        filter="safehtml" />
        
      <field name="youtube_video" type="text" 
        label="COM_DJGUITARISTE_FIELD_YOUTUBE_VIDEO_LABEL"
        description="COM_DJGUITARISTE_FIELD_YOUTUBE_VIDEO_DESC"
        class="inputbox" />
        
      <field name="website" type="url" 
        label="COM_DJGUITARISTE_FIELD_WEBSITE_LABEL"
        description="COM_DJGUITARISTE_FIELD_WEBSITE_DESC"
        class="inputbox" />
        
      <field name="facebook" type="url" 
        label="COM_DJGUITARISTE_FIELD_FACEBOOK_LABEL"
        description="COM_DJGUITARISTE_FIELD_FACEBOOK_DESC"
        class="inputbox" />
  </fieldset>
  <fieldset name="metadata"
        label="JGLOBAL_FIELDSET_METADATA_OPTIONS">
        
        <field name="metakey" type="textarea"
               label="JFIELD_META_KEYWORDS_LABEL"
               description="JFIELD_META_KEYWORDS_DESC"
               class="inputbox" rows="3" cols="30"
               labelclass="control-label" />
               
        <field name="metadesc" type="textarea"
               label="JFIELD_META_DESCRIPTION_LABEL"
               description="JFIELD_META_DESCRIPTION_DESC"
               class="inputbox" rows="3" cols="30"
               labelclass="control-label" />  
  </fieldset>
  
  <fieldset name="publishingoptions">
    <field name="created" type="calendar" label="JGLOBAL_FIELD_CREATED_LABEL"
     description="JGLOBAL_FIELD_CREATED_DESC" class="inputbox" size="22"
     format="%Y-%m-%d %H:%M:%S" filter="user_utc" labelclass="control-label" />
    
    <field name="created_by" type="user" label="JGLOBAL_FIELD_CREATED_BY_LABEL"
     description="JGLOBAL_FIELD_CREATED_BY_DESC" labelclass="control-label" />
     
    <field name="created_by_alias" type="text" label="JGLOBAL_FIELD_CREATED_BY_ALIAS_LABEL"
     description="JGLOBAL_FIELD_CREATED_BY_ALIAS_DESC" class="inputbox" 
     labelclass="control-label" size="20" />
    
    <field name="publish_up" type="calendar" label="JGLOBAL_FIELD_PUBLISH_UP_LABEL"
     description="JGLOBAL_FIELD_PUBLISH_UP_DESC" class="inputbox"
     format="%Y-%m-%d %H:%M:%S" size="22" filter="user_utc" labelclass="control-label" />
     
    <field name="publish_down" type="calendar" label="JGLOBAL_FIELD_PUBLISH_DOWN_LABEL"
     description="JGLOBAL_FIELD_PUBLISH_DOWN_DESC" class="inputbox"
     format="%Y-%m-%d %H:%M:%S" size="22" filter="user_utc" labelclass="control-label" />      
  </fieldset>
    
</form>

3 - Le calque de vue (Layout) 

Dans views/guitariste/tmpl, nous allons créer un layout nommé edit_publishingoptions.php. Ce fichier va parcourir la balise fieldset nommé publishingoptions et afficher les éléments qu'il contient. Voici le contenu du fichier edit_publishingoptions.php :


<?php
defined('_JEXEC') or die;

foreach($this->form->getFieldset('publishingoptions') as $field): ?>
  <div class="control-group">
    <div class="control-label"><?php echo $field->label; ?></div>
    <div class="controls"><?php echo $field->input; ?></div>
  </div>
<?php endforeach; ?>

Maintenant, nous allons apporter quelques modifications au fichier edit.php pour afficher notre nouveau layout dans un nouvel onglet. Nous allons rajouter aussi un élément li dans à balise ul portant la classe "nav-tab" pour rajouter l'entête de cet onglet. Donc juste à la fermeture du dernier li, nous ajoutons un nouveau comme dans le code suivant. La partie colorée est ce qu'il faut rajouter dans notre layout. 


<ul class="nav nav-tabs">
  <li class="active">
	<a href="#details" data-toggle="tab">
	<?php echo empty($this->item->id)? JText::_('COM_DJGUITARISTE_ADDING_NEW_GUITARISTE'): JText::sprintf('COM_DJGUITARISTE_EDIT_GUITARISTE', $this->item->id); ?>
	</a>
  </li>
  <li>
   <a href="#metadata" data-toggle="tab">
	<?php echo JText::_('JGLOBAL_FIELDSET_METADATA_OPTIONS'); ?>
   </a>
  </li>

  <li>
   <a href="#publishingoptions" data-toggle="tab">
	<?php echo JText::_('JGLOBAL_FIELDSET_PUBLISHING'); ?>
   </a>
  </li>

</ul>

 Puis à la fermeture du div portant le id metadata, nous allons ajouter un nouveau div dans lequel nous allons charger le layout edit_publishingoptions.php et l'afficher. Comme ceci :


<div class="tab-pane" id="publishingoptions">
	<fieldset>
	  <?php echo $this->loadTemplate('publishingoptions'); ?>
	</fieldset>
</div>

Le contenu du fichier edit.php au complet devrait ressembler maintenant à ceci :


<?php
defined('_JEXEC') or die;

JHtml::_('behavior.tooltip');
JHtml::_('behavior.formvalidation');
?>
<script type="text/javascript">
    Joomla.submitbutton = function(task)
    {
        if(task == 'guitariste.cancel' || document.formvalidator.isValid(document.id('djguitariste-guitariste-form'))){
            <?php //echo $this->form->getField('descrption')->save(); ?>
            Joomla.submitform(task, document.getElementById('djguitariste-guitariste-form'));
        }else{
            alert('<?php echo $this->escape(JText::_('JGLOBAL_VALIDATION_FORM_FAILED')); ?>')
        }

    }  
</script>

<form action="<?php echo JRoute::_('index.php?option=com_djguitariste&layout=edit&id='.(int)$this->item->id); ?>" 
method="post" name="adminForm" id="djguitariste-guitariste-form" class="form-validate">
  <div class="row-fluid">
    <div class="span10 form-horizontal">
      <fieldset>
        <ul class="nav nav-tabs">
          <li class="active">
            <a href="#details" data-toggle="tab">
            <?php echo empty($this->item->id)? JText::_('COM_DJGUITARISTE_ADDING_NEW_GUITARISTE'): JText::sprintf('COM_DJGUITARISTE_EDIT_GUITARISTE', $this->item->id); ?>
            </a>
          </li>
          <li>
           <a href="#metadata" data-toggle="tab">
            <?php echo JText::_('JGLOBAL_FIELDSET_METADATA_OPTIONS'); ?>
           </a>
          </li>

          <li>
           <a href="#publishingoptions" data-toggle="tab">
            <?php echo JText::_('JGLOBAL_FIELDSET_PUBLISHING'); ?>
           </a>
          </li>

        </ul>
        <div class="tab-content">
          <div class="tab-pane active" id="details">
            <div class="control-group">
              <div class="control-label">
                <?php echo $this->form->getLabel('id'); ?>
              </div>
              <div class="controls">
                <?php echo $this->form->getInput('id'); ?>
              </div>
            </div>
            <div class="control-group">
              <div class="control-label">
                <?php echo $this->form->getLabel('name'); ?>
              </div>
              <div class="controls">
                <?php echo $this->form->getInput('name'); ?>
              </div>
            </div>
            
            <div class="control-group">
              <div class="control-label">
                <?php echo $this->form->getLabel('alias'); ?>
              </div>
              <div class="controls">
                <?php echo $this->form->getInput('alias'); ?>
              </div>
            </div>
            
            <div class="control-group">
              <div class="control-label">
                <?php echo $this->form->getLabel('catid'); ?>
              </div>
              <div class="controls">
                <?php echo $this->form->getInput('catid'); ?>
              </div>
            </div>
                        
            <div class="control-group">
              <div class="control-label">
                <?php echo $this->form->getLabel('picture'); ?>
              </div>
              <div class="controls">
                <?php echo $this->form->getInput('picture'); ?>
              </div>
            </div>
            <div class="control-group">
              <div class="control-label">
                <?php echo $this->form->getLabel('intro'); ?>
              </div>
              <div class="controls">
                <?php echo $this->form->getInput('intro'); ?>
              </div>
            </div>
            <div class="control-group">
              <div class="control-label">
                <?php echo $this->form->getLabel('biography'); ?>
              </div>
              <div class="controls">
                <?php echo $this->form->getInput('biography'); ?>
              </div>
            </div>
            <div class="control-group">
              <div class="control-label">
                <?php echo $this->form->getLabel('youtube_video'); ?>
              </div>
              <div class="controls">
                <?php echo $this->form->getInput('youtube_video'); ?>
              </div>
            </div>
            <div class="control-group">
              <div class="control-label">
                <?php echo $this->form->getLabel('website'); ?>
              </div>
              <div class="controls">
                <?php echo $this->form->getInput('website'); ?>
              </div>
            </div>
            <div class="control-group">
              <div class="control-label">
                <?php echo $this->form->getLabel('facebook'); ?>
              </div>
              <div class="controls">
                <?php echo $this->form->getInput('facebook'); ?>
              </div>
            </div>
          </div>
          
          <div class="tab-pane" id="metadata">
            <fieldset>
              <?php echo $this->loadTemplate('metadata'); ?>
            </fieldset>
          </div>

          <div class="tab-pane" id="publishingoptions">
            <fieldset>
              <?php echo $this->loadTemplate('publishingoptions'); ?>
            </fieldset>
          </div>

          
          <input type="hidden" name="task" value="" />
          <?php echo JHtml::_('form.token'); ?>
        </div>
      </fieldset>
    
    </div>
    
    <!-- le sidebar pour publier et dépublier-->
    <div class="span2">
      <h4 class="title"><?php echo JText::_('JDETAILS'); ?></h4>
      <hr />
      <fieldset class="form-vertical">
        <div class="control-group">
          <div class="control-label">
            <?php echo $this->form->getLabel('state'); ?>
          </div>
          <div class="controls">
            <?php echo $this->form->getInput('state'); ?>
          </div>
        </div>  
      </fieldset>
    </div>
    
  </div>
</form>

4 - Le fichier de table (guitariste.php)

Nous allons ajouter à la méthode check, un bloc de code pour vérifier si la date de fin n'est pas inférieur à la date de début (sinon l'élément ne sera jamais visible sur le site). On va aussi redéfinir la méthode store pour remplir automatiquement les champs créé par et date de création lors de la création. Le fichier de table guitariste.php se trouve dans le dossier tables. Voici le block de code à rajouter dans la méthode check.


if((int)$this->publish_down > 0 && $this->publish_down < $this->publish_up){
  $this->setError(JText::_('JGLOBAL_START_PUBLISH_AFTER_FINISH'));
  return false;
}

La méthode store à rajouter aussi dans le même fichier contiendra ceci : 


public function store($updateNulls = false){
	$date = JFactory::getDate();
	$user = JFactory::getUser();

	if(!$this->id){
	  if(!(int)$this->created){
		$this->created = $date->toSql();
	  }
	  
	  if(empty($this->created_by)){
		$this->created_by = $user->get('id');
	  }
	}

	if(empty($this->publish_up)){
	  $this->publish_up = $this->_db->getNullDate();
	}

	if(empty($this->publish_down)){
	  $this->publish_down = $this->_db->getNullDate();
	}

	return parent::store($updateNulls);
}

Le contenu du fichier guitariste.php devrait ressembler à ceci :


<?php
defined('_JEXEC') or die;

class DJGuitaristeTableGuitariste extends JTable
{
  
  protected $_columnAlias = array('published' => 'state');
  
  public function __construct(&$db){
      parent::__construct('#__djguitariste_items', 'id', $db);
  }
  
  public function store($updateNulls = false){
    $date = JFactory::getDate();
    $user = JFactory::getUser();
    
    if(!$this->id){
      if(!(int)$this->created){
        $this->created = $date->toSql();
      }
      
      if(empty($this->created_by)){
        $this->created_by = $user->get('id');
      }
    }
    
    if(empty($this->publish_up)){
      $this->publish_up = $this->_db->getNullDate();
    }
    
    if(empty($this->publish_down)){
      $this->publish_down = $this->_db->getNullDate();
    }
    
    return parent::store($updateNulls);
    
  }
  
  public function check(){
    
    //Nous vérifions que le nom n'est pas vide
    if(trim($this->name) == ''){
       $this->setError(JText::_('COM_DJGUITARISTE_ERROR_TABLE_NAME'));
       return false;
    }
    
    
    $this->alias = JApplication::stringURLSafe($this->alias);
    //Si le champs alias est vide, nous le créons à partir du nom
    if(empty($this->alias)){
      $this->alias = JApplication::stringURLSafe($this->name);
    }
    
    //Nous vérifions s'il n'y a pas de doublons dans la base de données
    $table = JTable::getInstance('Guitariste', 'DJGuitaristeTable');
    if($table->load(array('alias'=>$this->alias, 'catid'=>$this->catid)) && ($table->id != $this->id || $this->id == 0))
    {
      $this->setError(JText::_('COM_DJGUITARISTE_ERROR_ALIAS_DUPPLICATED'));
      return false;
    }
    
    //Nous allons valider la catégorie
    if(trim($this->catid) == ''){
      $this->setError(JText::_('COM_DJGUITARISTE_CATEGORY_MISSING'));
      return false;
    }
    
    //Filtrage des mots clés
    if(!empty($this->metakey)){
      $to_remove = array("\n", "\r", "\"", "<", ">");
      $cleaning = JString::str_ireplace($to_remove, "", $this->metakey);
      
      $keys = explode(',', $cleaning);  
      $clean_keys = array();
      foreach($keys as $key){
        $clean_keys[] = trim($key);
      }
      
      $this->metakey = implode(", ", $clean_keys);
    }
    
    if((int)$this->publish_down > 0 && $this->publish_down < $this->publish_up){
      $this->setError(JText::_('JGLOBAL_START_PUBLISH_AFTER_FINISH'));
      return false;
    }
     
    return true;
  }
  
}

Voilà maintenant dans le formulaire d'édition, nous avons un nouvel onglet "Publication" sous lequel on peut remplir les options de publication. 

 

Lire la suite.


  • Dernière modification le jeudi, 28 septembre 2017 15:18
  • 348
Docteur Joomla

Après plus de 10 ans d'expérience en Joomla, je lance ce Blog pour partager mes connaissances avec les autres développeurs Joomla.