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 28) formulaire d'édition sur le site (côté client)


Dans cette partie,  nous allons mettre en place le formulaire d'édition en frontend (côté client). Cette partie se passe au côté client mais vers la fin, nous mettrons le fichier de langue .sys du dossier administrator à jour. 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 | Partie 14 | Partie 15 | Partie 16 | Partie 17 | Partie 18 | Partie 19 | Partie 20 | Partie 21 | Partie 22 | Partie 23 | Partie 24 | Partie 25 | Partie 26 | Partie 27

1 - Introduction

 Parfois, certaines situations peuvent nous emmener à créer un formulaire d'ajout et d'édition en frontend. Dans le cas de notre composant, ce n'est pas nécessaire mais nous allons le faire juste pour comprendre la  démarche.

Pour réaliser ceci, nous allons créer une nouvelle vue que nous nommerons "form". Nous créerons aussi un fichier de formulaire XML. Ensuite, nous ajouterons un contrôleur et un modèle pour gérer ce formulaire. Puis nous mettrons à jour les fichiers de langue et le fichier router.php.

Le tutoriel se passe au côté client donc rassurez-vous de ne pas être dans le dossier administrator. Nous irons quand même de temps en temps dans le dossier administrator pour copier des fichiers et dossiers pour nous faciliter la tâche. Vers la fin de ce tutoriel nous ferons une mise à jour du fichier de langue .sys du dossier administrator.

2 Le formulaire XML

Dans le dossier models, nous allons créer un nouveau dossier nommé "forms" dans lequel nous ajoutons une copie du fichier guitariste.xml qui se trouve dans administrator/components/com_djguitariste/models/forms. En frontend, nous allons déplacer l'élément "state" dans le fieldset publishingoptions parce que ça ne sera pas très pratique de l'afficher dans un sidebar comme dans l'administration.

<?xml version="1.0" encoding="utf-8"?>
<form>
  <fieldset addfieldpath="/administrator/components/com_categories/models/fields">      
  
    <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 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>      
      </field>
      
    <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 - Création de la vue "form"

 Dans le dossier views du composant, nous allons créer un dossier nommé form. Dans le dossier form, nous ajoutons le fichier view.html.php et avec pour contenu le code suivant:

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

class DJGuitaristeViewForm extends JViewLegacy
{
  public function display($tpl = null)
  {
        
    $this->state = $this->get('State');
    $item = $this->get('Item');
    $this->item = &$item;
    $this->form = $this->get('Form');    
    
    $this->return_page = $this->get('ReturnPage');
    
    $user = JFactory::getUser();
  
    if(empty($item->id)){
      $authorised = ($user->authorise('core.create', 'com_djguitariste') || (count($user->getAuthorisedCategories('com_djguitariste', 'core.create'))));
    }else{
      $authorised = $user->authorise('core.edit', 'com_djguitariste.guitariste'.$item->id);
    }
    
    if($authorised !== true){
      JError::raiseError(403, JText::_('JERROR_ALERTNOAUTHOR'));
      return false;
    }
    
    if(!empty($item)){
      $this->form->bind($item);
    }
    
    if(count($errors = $this->get('Errors'))){
      JError::raiseWarning(500, implode("\n", $errors));
      return false;
    }
    
    $this->user = $user;
    
    if($item->metakey){
      $this->document->setMetaData('keywords', $item->metakey);
    }
    
    $title = $this->document->getTitle(). ' - '.$item->name;
    $this->document->setTitle($title);
    
    JFactory::getLanguage()->load('joomla', JPATH_ADMINISTRATOR);
    
    parent::display($tpl);
    
  }
}

4 le calque de vue (layout)

Copions le dossier tmpl qui se trouve dans administrator/components/com_djguitariste/views/guitariste/ dans notre dsossier de vue form créé précédemment. Cette copie nous facilitera la tâche car nous allons réutiliser les calques de vue pour l'affichage du formulaire. Dans le dossier tmpl, le fichier que nous allons modifier se nomme edit.php. Vers le haut de la page, nous faisons l'inclusion de deux librairies javascript. On avait pas besoin de faire ces inclusions dans le dossier administrator car Joomla le faisait automatiquement.

JHtml::_('behavior.keepalive');
JHtml::_('behavior.calendar');

Nous demanderons aussi à Joomla de charger le fichier de langue utilisé en backend (dans le dossier administrator) pour ne pas avoir besoin de recopier les clés pour les textes du formulaire. Voici comment nous allons le faire:

$language = JFactory::getLanguage();
$ltag = $language->getTag();
$language->load('com_djguitariste', JPATH_ADMINISTRATOR, $ltag, true);

Remarque: nous passons par la classe Language pour détecter la langue automatiquement. Vous pouvez donner directement la valeur fr-FR à la variable $ltag mais ceci deviendra problématique si votre site change de langue ou devient multilingue.

Nous ajouterons les boutons de la barre d'outils nous même en haut du formulaire:

<!-- début barre d'outils Sauvegarder et Annuler --> 
<div class="btn-toolbar">
  <div class="btn-group">
	<button type="button" class="btn btn-primary" onclick="Joomla.submitbutton('guitariste.save')">
	  <span class="icon-ok"></span> <?php echo JText::_('JSAVE'); ?>
	</button>
  </div>
  <div class="btn-group">
	<button type="button" class="btn" onclick="Joomla.submitbutton('guitariste.cancel')">
	  <span class="icon-cancel"></span> <?php echo JText::_('JCANCEL'); ?>
	</button>
  </div>
</div>
<!-- Fin de la barre d'outils -->

 

Nous effacerons toute la section du sidebar qui est le bloc de code suivant:

<!-- 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>

Rappel: nous avons déplacé cet élément dans le fieldset publishingoptions donc il s'affichera sous cet onglet automatiquement. 

La dernière modification dans ce fichier serait l'ajout d'un champ caché avec comme valeur la page de retour:

<input type="hidden" name="return" value="<?php echo $this->return_page; ?>" />

Donc au final, le contenu du fichier edit.php devrait ressembler à ceci:

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

JHtml::_('behavior.tooltip');
JHtml::_('behavior.formvalidation');

//les deux librairie js qui suivent sont chargées par défaut en admin mais en frontend il faut les charger
JHtml::_('behavior.keepalive');
JHtml::_('behavior.calendar');

$language = JFactory::getLanguage();
$ltag = $language->getTag();
$language->load('com_djguitariste', JPATH_ADMINISTRATOR, $ltag, true);
?>
<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">
    
    <!-- début barre d'outils Sauvegarder et Annuler --> 
    <div class="btn-toolbar">
      <div class="btn-group">
        <button type="button" class="btn btn-primary" onclick="Joomla.submitbutton('guitariste.save')">
          <span class="icon-ok"></span> <?php echo JText::_('JSAVE'); ?>
        </button>
      </div>
      <div class="btn-group">
        <button type="button" class="btn" onclick="Joomla.submitbutton('guitariste.cancel')">
          <span class="icon-cancel"></span> <?php echo JText::_('JCANCEL'); ?>
        </button>
      </div>
    </div>
    <!-- Fin de la barre d'outils -->
    
      <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="" />
          <input type="hidden" name="return" value="<?php echo $this->return_page; ?>" />
          <?php echo JHtml::_('form.token'); ?>
        </div>
      </fieldset>
    
    </div>
    
  </div>
</form>

Dans ce même dossier tmpl (de la vue form), nous ajoutons un nouveau  fichier edit.xml pour permettre à cette vue d'être ajouter facilement dans l'administration comme élément de menu. Voici le contenu de ce fichier:

<?xml version="1.0" encoding="utf-8"?>
<metadata>
  <layout title="COM_DJGUITARISTE_GUITARISTE_ADD_VIEW_DEFAULT_TITLE">
    <message>
      <![CDATA[COM_DJGUITARISTE_GUITARISTE_ADD_VIEW_DEFAULT_DESC]]>
    </message>
  </layout>
</metadata>

5 Le modèle  Form

Pour que les appels comme get('Item'), get('Form') ou get('returnPage')  qui sont dans notre fichier view.html.php fonctionnent, nous avons besoin d'un fichier modèle qui définit ces méthodes. Donc nous allons créer un fichier nommé form.php dans le dossier models. Pour nous faciliter la tâche, notre modèle va étendre le modèle du côté administrateur donc nous allons l'inclure en haut dans notre fichier. Voici le contenu du fichier form.php:

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

require_once JPATH_ADMINISTRATOR.'/components/com_djguitariste/models/guitariste.php';

class DJGuitaristeModelForm extends DJGuitaristeModelGuitariste
{
  
    /**
   * Method to auto-populate the model state.
   *
   * Note. Calling getState in this method will result in recursion.
   *
   * @return  void
   *
   * @since   1.6
   */
  protected function populateState()
  {
    $app = JFactory::getApplication();

    // Load state from the request.
    $pk = $app->input->getInt('a_id');
    $this->setState('guitariste.id', $pk);

    $this->setState('guitariste.catid', $app->input->getInt('catid'));

    $return = $app->input->get('return', null, 'base64');
    $this->setState('return_page', base64_decode($return));

    // Load the parameters.
    $params = $app->getParams();
    $this->setState('params', $params);

    $this->setState('layout', $app->input->getString('layout'));
  }

  
  public function &getItem($itemId = null){
    $app = JFactory::getApplication();
    $id = $app->input->getInt('id');
    
    $table = $this->getTable();
    
    $return = $table->load($id);
    
    if($return === false && $table->getError()){
      $this->setError($table->getError());
      return false;
    }
    
    $properties = $table->getProperties(1);
    $value = JArrayHelper::toObject($properties, 'JObject');
    
    $value->params = new JRegistry;
    $value->params->loadString($value->attribs);
    
    return $value;
    
  }
  
  public function getReturnPage()
  {
    return base64_encode($this->getState('return_page'));
  }
  
}

6 - Création d'un contrôleur

Nous allons d'abord ajouter un dossier controllers dans le dossier de notre composant, puis nous y ajouterons un fichier guitariste.php avec le code suivant:

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

class DJGuitaristeControllerGuitariste extends JControllerForm
{
  protected $view_item = 'form';
  protected $view_list = 'guitaristes';
  
  public function add(){
    if(!parent::add()){
      $this->setRedirect($this->getReturnPage());
    }
  }
  
  protected function allowEdit($data = array(), $key = 'id'){
    
    if(parent::allowEdit($data, $key)){
      return true;
    }
    
    $user = JFactory::getUser();
    
    if($user->authorise('core.edit.own')){
      $ownerId = (int) isset($data['created_by']) ? $data['created_by'] : 0;
      $recordId = (int) isset($data[$key]) ? $data[$key] : 0;
      
      if(empty($ownerId) && $recordId){
        $record = $this->getModel()->getItem($recordId);
        if(empty($record)){
          return false;
        }
        
        $ownerId = $record->created_by;
      }
      
      $userId = $user->get('id');
      if($ownerId == $userId){
        return true;
      }
      
    }
    
    return false;
  }
  
  public function cancel($key = 'id'){
    parent::cancel($key);
    
    $this->setRedirect($this->getReturnPage);
  }
  
  public function edit($key = null, $urlVar = 'id'){
    $result = parent::edit($key, $urlVar);
    return $result;
  }
  
  public function getModel($name = 'form', $prefix = '', $config = array('ignore_request' => true)){
    $model = parent::getModel($name, $prefix, $config);
    return $model;
  }
  
  protected function getRedirectToItemAppend($recordId = null, $urlVar = 'id'){
    $tmpl = $this->input->get('tmpl');
    $append = '';
    
    if($tmpl){
      $append .= '&tmpl='.$tmpl;
    }  
    
    $append .= '&layout=edit';
    
    if($recordId){
      $append .= '&'.$urlVar.'='.$recordId;
    }
    
    $itemId = $this->input->getInt('Itemid');
    if($itemId){
      $append .= '&Itemid='.$itemId;
    }
    
    $catId = $this->input->getInt('catid', null, 'get');
    if($catId){
      $append .= '&catid='.$catId;
    }
    
    $return = $this->getReturnPage();
    if($return){
      $append .= '&return='.base64_encode($return);
    }
    
    return $append;
  }
  
  protected function getReturnPage(){
    $return = $this->input->get('return', null, 'base64');
    
    if(empty($return) || !JUri::isInternal(base64_decode($return))){
      return JUri::base();
    }else{
      return base64_decode($return);
    }
  }
  
  protected function postSaveHook(JModelLegacy $model, $validData = array()){
    $task = $this->getTask();
    
    if($task == 'save'){
      $this->setRedirect(JRoute::_('index.php?option=com_djguitariste&view=categorie&id='.$validData['catid'], false));
    }
  }
  
  public function save($key = null, $urlVar = 'id'){
    $result = parent::save($key, $urlVar);
    
    if($result){
      $this->setRedirect($this->getReturnPage());
    }
    
    return $result;
  }
}

7 - Modification de la vue détail d'un guitariste

Nous allons afficher un bouton Modifier juste après le nom du guitariste si l'utilisateur est connecté et a le droit de le modifier.

Dans le dossier de vue guitariste, nous allons d'abord modifier le fichier view.html.php pour vérifier les droit d'accès et créer le bouton de modification. Nous ajouterons une nouvelle méthode privée allowEdit() pour vérifier les droits et le bouton Modifier sera créé ou pas en fonction de la valeur de retour. Voici le contenu du fichier (les dernières modifications sont en rouge):

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

class DJGuitaristeViewGuitariste extends JViewLegacy
{
  public function display($tpl = null)
  {
    
    $app = JFactory::getApplication();
    
    $user = JFactory::getUser();
    
    if(!$user->authorise('guitariste.view', 'com_djguitariste')){
      $app->redirect(JRoute::_('index.php?option=com_djguitariste&view=guitaristes', false),
      JText::_('COM_DJGUITARISTE_VIEW_NOT_AUTHORIZED'), 'error');
      return false;  
    }    
    
    $guitariste = $this->get('Item');
    $this->guitariste = &$guitariste;
    
    $params = JComponentHelper::getParams('com_djguitariste');
    
    $menuParams = new JRegistry();
    
    $active = $app->getMenu()->getActive();
    $currentLink = $active->link;
    $menuParams->loadString($active->params);
    
    if($active && (strpos($currentLink, 'view=guitariste') && (strpos($currentLink, '&id='.(string)$guitariste->id)))){
      $params = $params->merge($menuParams);
    }else{
      $params = $menuParams->merge($params);
    }
      
    $this->params = &$params;
    
    //meta description
    if($guitariste->metadesc){
      $this->document->setDescription($guitariste->metadesc);
    }
    
    //mots clés
    if($guitariste->metakey){
      $this->document->setMetadata('keywords',$guitariste->metakey);
    }
    
    //Ajouter le nom du guitariste dans le title
    $title = $guitariste->name . " - " .  $this->document->getTitle();
    $this->document->setTitle($title);
    
    //Création du bouton d'édition
    $this->guitariste->canEdit = $this->allowEdit();
    if($this->guitariste->canEdit){
      $uri = JUri::getInstance();
      $url = 'index.php?option=com_djguitariste&view=form&task=guitariste.edit&id='.$this->guitariste->id.'&return='.base64_encode($uri);
      
      $icon = $guitariste->state ? 'edit.png' : 'edit_unpublished.png';
      $text = JHtml::_('image', 'systeme/'.$icon, JText::_('JGLOBAL_EDIT'), null, true);
      $this->guitariste->editLink = JHtml::_('link', JRoute::_($url), $text, array()); 
    }
    
    parent::display($tpl);
    
  }
  
  private function allowEdit(){
    $user = JFactory::getUser();
    
    //On vérifie s'il a le droit de modifier
    if($user->authorise('core.edit', 'com_djguitariste')){
      return true;
    }
    
    //On vérifie si l'utilisateur a le droit de modifier ses propres éléments
    //Et on vérifie si c'est lui qui a ajouté le guitariste
    if($user->authorise('core.edit.own', 'com_djguitariste')){
      $ownerID = $this->guitariste->created_by;
      $userID = $user->get('id');
      
      if($userID == $ownerID){
        return true;
      }
    }
    
    return false;
  }
}

Dans le calque de vue (layout) default.php qui se trouve dans tmpl, nous ajoutons la vérification. Si l'utilisateur a le droit, on affiche le texte "Modifier" suivi du bouton de modification juste après le nom :

<?php if($this->guitariste->canEdit){
        echo JText::_('COM_DJGUITARISTE_EDIT_GUITARIST'). $this->guitariste->editLink;
      } 
?>

Maintenant si vous regardez la page d'un guitariste en étant connecté avec un compte administrateur, vous devez voir le bouton de modification:

 

 

8 - Router

Nous avons ajouté une nouvelle vue donc c'est un peu normal que nous ayons besoin de modifier le fichier router.php pour prendre en compte les paramètres de cette dernière. La bonne nouvelle c'est que ça sera juste une petite modification dans la fonction DJGuitaristeParseRoute().

Voici la modification à apporter dans le fichier router.php qui se trouve dans le dossier du composant en frontend (la partie concernée est en rouge) :

function DJGuitaristeParseRoute($segments){
  $vars = array();
  $app = JFactory::getApplication();
  $menu = $app->getMenu();
  $mItem = $menu->getActive();
  
  $count = count($segments);
  $id = explode(':', $segments[$count - 1]);
  $vars['id'] = (int)$id[0];
    
  switch($mItem->query['view']){
    case 'categories':
    case 'categorie':
      if($count == 1){
        $vars['view'] = 'categorie';
      }
      if($count == 2){
        $vars['view'] = 'guitariste';
      }
      break;
    case 'guitaristes':
      if($count == 1){
        $vars['view'] = 'form';
      }
      if($count == 2){
        $vars['view'] = 'guitariste';
      }
      break;
  }
  
  return $vars;
}

Nous déduisons par le nombre de paramètres si la vue est form ou guitariste. La vue form aura un seul paramètre qui est l'Id du guitariste alors que la vue guitariste aura l'Id et le catid (l'Id de la catégorie).

9 - Les fichiers de langue

Dans le dossier language/fr-FR, nous ouvrons le fichier fr-FR.com_djguitariste.ini pour y ajouter la ligne suivante:

COM_DJGUITARISTE_EDIT_GUITARIST="Modifier: "

Puis nous allons dans administrator/language/fr-FR/ pour ouvrir le fichier fr-FR.com_djguitariste.sys.ini  et y ajouter les lignes suivantes:

COM_DJGUITARISTE_GUITARISTE_ADD_VIEW_DEFAULT_TITLE="Formulaire d'ajout de guitariste"
COM_DJGUITARISTE_GUITARISTE_ADD_VIEW_DEFAULT_DESC="Formulaire d'ajout de guitariste au côté client (frontend)"

10 - Conclusion

Voilà nous avons fini. Pour tester ceci, vous devez ajouter à votre menu depuis l'administration de Joomla un élément du type formulaire d'ajout de guitariste:

Vous devez être connecté sur le site en frontend avec un compte administrateur pour pouvoir accéder à cette page.

Les prochains tutoriels porteront sur la création de plugins et modules pour ce composant mais on peut dire que la majeur partie du développement est terminée.

Si vous avez des questions, veuillez utiliser le formulaire de contact ou notre page Facebook. Le lien pour télécharger la version finale du composant est un peu plus bas sur cette page.

À très bientôt.


  • Dernière modification le dimanche, 24 décembre 2017 04:09
  • 656
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.