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 7) Sauvegarde en base de données


Dans cette partie,  nous allons mettre en place la sauvegarde des informations venant du formulaire en base de donnée. 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.

1 Ajout des boutons de la barre d'outils

Nous allons ouvrir le fichier "view.html.php" qui se trouve dans le dossier views/guitariste pour y apporter quelques modification. Nous créerons une méthode addToolbar pour y définir les différents boutons (Enregistrer, Enregistrer & Fermer, Enregistrer & Nouveau, Annuler...) à afficher ainsi que les méthodes associées à chaque action. Nous ajouterons une ligne dans la méthode display pour appeler la méthode addToolbar. Nous allons allons aussi ajouter dans la méthode display la vérification et l'affichage des erreurs. Voici le contenu du fichier view.html.php:


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

class DJGuitaristeViewGuitariste extends JViewLegacy
{
  public function display($tpl = null)
  {
    $item = $this->get('Item');
    $this->item = &$item;
    
    $this->form = $this->get('Form');
    
    //Affichage des erreurs s'il y en a
    if(count($errors = $this->get('Errors'))){
      JError::raiseError(500, implode("\n", $errors));
      return false;
    }
    
    //Ajout de la barre d'outil
    $this->addToolbar();
    
    parent::display($tpl);
    
  }
  
  protected function addToolbar(){
    //Nous désactivons le menu de Joomla lorsqu'on est en mode édition pour obliger 
    //L'utilisateur a utiliser nos boutons
    JFactory::getApplication()->input->set('hidemainmenu', true);
    
    $isNew = ($this->item->id == 0);
    
//Le deuxième paramètre de la méthode title sera utiliser pour afficher une icône avant le titre
    //Un span aura la classe 'guitariste' et c'est en CSS qu'on peut afficher l'icône JToolbarHelper::title(JText::_('COM_DJGUITARISTE_MANAGER_GUITARISTE'), 'guitariste'); //Les boutons JToolbarHelper::apply('guitariste.apply'); JToolbarHelper::save('guitariste.save'); //Nous affichons le bouton Enregistrer comme copie seulement si l'élément existe déjà dans la base de données if(!$isNew) { JToolbarHelper::save2copy('style.save2copy'); } JToolbarHelper::cancel('guitariste.cancel'); //Mettre de l'espace (séparateur) JToolbarHelper::divider(); //plus tard nous verons comment mettre un lien pour aller sur une page d'aide externe JToolbarHelper::help('JHELP_COMPONENTS_DJGUITARISTE_GUITARISTES_EDIT'); } }

 Maintenant si nous accédons à la page d'édition, nous verrons la barre d'outils en haut avec les boutons que nous avons définis dans la méthode addToolbar.

À ce niveau, si on clique sur les boutons, rien ne se passe et c'est tout à fait normal. Pour rendre les boutons actifs, nous avons besoin d'ajouter un bout de code Javascript dans la page edit.php. Donc nous allons ouvrir le fichier edit.php pour y apporter les modifications nécessaires. Premièrement, nous devons ajouter un code PHP pour informer Joomla des différentes librairies à charger pour le bon fonctionnement de notre Javascript. Ajouter les deux ligne suivantes en haut de la page edit.php juste après "defined('_JEXEC') or die;" :


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

Finalement, juste avant la balise form, nous allons ajouter notre Javascript:


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

    }  
</script>

 Sauvegardez le fichier. Maintenant, les boutons seront cliquable mais une page d'erreur s'affichera à chaque fois que l'on cliquera sur un boutons. Ceci est dû au fait qu'il n'y a pas de contrôleur pour gérez ces actions.

2 Création du contrôleur

Dans dossier de notre composant (en administration), nous allons créer un nouveau dossier nommé controllers qui va contenir tous les contrôleurs de notre composant. Dans ce dossier, nous allons créer un fichier guitariste.php qui sera le contrôleur qui sera appelé pour gérer les actions sur les boutons que nous avons créer précédemment. N'oubliez pas d'ajouter un fichier index.html vide dans le dossier controllers. Voici le contenu du fichier guitariste.php :


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

class DJGuitaristeControllerGuitariste extends JControllerForm
{
  public function __construct( $config = array()){
    parent::__construct($config);    
  }
  
  //Nous reviendrons ici plus tard
  public function allowEdit($data = array(), $key = 'id'){
     return true;
  }
  
  //Nous reviendrons ici plus tard
  public function allowAdd($data = array(), $key =  'id'){
    return true;
  }
  
}

Notons que les méthode allowEdit et allowAdd ne sont pas encore écrite, nous y reviendrons plus tard. Ces deux méthodes servent à vérifier si l'utilisateur a le droit de modifier ou d'ajouter un guitariste.

Pour que la sauvegarde fonctionne, nous devons créer un fichier table qui s'occupera des opérations avec la base de données.  

3 Sauvegarde en Base de données

Pour sauvegarder les données, nous allons créer un fichier "table". Donc nous allons créer un nouveau dossier nommé tables au même niveau que controllers et models. La structure actuel du composant en administration devrait ressembler maintenant à ceci:

Dans le dossier tables, nous allons créer un nouveau fichier nommé guitariste.php. Dans ce fichier, nous allons créer une classe nommée DJGuitaristeTableGuitariste qui étend la classe JTable. Dans cette classe, on a besoin d'un constructeur qui spécifie le nom de notre table en base de donnée ainsi que sa clé primaire. On a aussi besoin de la méthode check qui sera appelée pour effectuer la validation côté serveur. J'ai choisi de juste m'assurer que le nom du guitariste ne soit pas vide mais libre à vous de décider quelles informations sont obligatoires et de vérifier si elles contiennent une valeur. Voici le contenu du fichier:


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

class DJGuitaristeTableGuitariste extends JTable
{
  
  public function __construct(&$db){
      parent::__construct('#__djguitariste_items', 'id', $db);
  }
  
  public function check(){
    $isValid = true;
    
    if(trim($this->name) == ''){
       $this->setError(JText::_('COM_DJGUITARISTE_ERROR_TABLE_NAME'));
       $isValid = false;
    }
    
    return $isValid;
  }
  
}

4 Modification du model (Guitariste)

Pour que Joomla puisse savoir que notre classe DJGuitaristeTableGuitariste est celle  qu'il faut utiliser pour sauvegarder les données, nous avons besoin d'ajouter à notre model la méthode getTable qui retournera une instance de la classe JTable avec les informations de notre classe DJGuitaristeTableGuitariste. Voici le contenu de la méthode getTable à ajouter  dans  models/guitariste.php:


  public function getTable($type = 'Guitariste', $prefix = 'DJGuitaristeTable', $config = array()){
    return JTable::getInstance($type, $prefix, $config);    
  }

 Voilà, maintenant par la page liste, vous pouvez cliquez sur un nom de guitariste et puis modifier ses informations et enregistrer dans la base de données.

Mais il restera quand même à ajouter dans le fichier de langue le message d'erreur qui s'affiche quand le nom est vide:


COM_DJGUITARISTE_ERROR_TABLE_NAME="Veuillez renplir le nom du guitariste"

Dans le prochain tutoriel, nous retournerons sur la vue liste pour ajouter la barre d'outils et permettre d'ajouter un nouveau guitariste, de supprimer ceux existants... Cliquez ici pour lire la partie 8


  • Dernière modification le jeudi, 28 septembre 2017 15:12
  • 635
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.