Création d'un module sous Magento 2 - Partie 3 - Utilisation des modèles

Une fois votre modèle créé, il va falloir l'utiliser. L'objectif ici est d'apprendre à utiliser notre nouveau modèle en créant une liste de commerciaux, avec un système d'ajout, d'édition et de suppression. Nous allons donc reprendre le contrôleur que nous avons créé lors d'une partie précédente, et dans un premier temps, lister nos commerciaux. On ne verra ici que les traitements basiques. Pour des requêtes plus élaborées, d'autres articles seront certainement postés par la suite.

Récupération des données

Dans la partie précédente, nous avons vu comment récupérer tous les commerciaux. Nous allons, dans un premier temps, faire la même chose, mais afficher le résultat dans notre template. Ensuite, on verra les différentes façons de récupérer des données. La première chose à faire est de modifier notre contrôleur, pour qu'il nous affiche le contenu de notre template. Vous savez déjà le faire, mais voici un rappel du contenu du contrôleur : 

/app/code/Ns/Thorleif/Controller/Index/Index.php
  1. <?php
  2.  
  3. namespace Ns\Thorleif\Controller\Index;
  4.  
  5. class Index extends \Magento\Framework\App\Action\Action
  6. {
  7.  
  8.     public function execute()
  9.     {
  10.         $this->_view->loadLayout();
  11.         $this->_view->renderLayout();
  12.     }
  13. }

Nous allons ensuite modifier la méthode afficher() de notre block Main.php. Dans cette méthode, nous allons simplement retourner la liste de nos commerciaux : 

/app/code/Ns/Thorleif/Block/Main.php
  1. <?php
  2.  
  3. namespace Ns\Thorleif\Block;
  4.  
  5. class Main extends \Magento\Framework\View\Element\Template
  6. {
  7.     public function afficher()
  8.     {
  9.         $objectManager = \Magento\FrameWork\App\ObjectManager::getInstance();
  10.         $collection = $objectManager->create('Ns\Thorleif\Model\Resource\Commerciaux\Collection');
  11.         return $collection->load()->getData();
  12.     }
  13. }

Maintenant, on affiche ces données dans le template. Ici, on va récupérer ce que retourne la méthode afficher() du block, puis, faire un foreach sur les données retournées pour pouvoir les afficher comme on veut. 

/app/code/Ns/Thorleif/view/frontend/templates/main.phtml
  1. <h2>Liste des commerciaux</h2>
  2. <p>
  3.     <?php $commerciaux = $block->afficher(); ?>
  4.  
  5.     <?php foreach($commerciaux as $item) : ?>
  6.         <?php echo $item['name']  ?> (<?php echo $item['city'] ?>)
  7.         <br>
  8.     <?php endforeach; ?>
  9. </p>

Évidemment, récupérer la liste de toutes les données d'un modèle se fait rarement. Vous allez surtout devoir créer des requêtes plus complexes, comme par exemple, la liste des commerciaux venant de Paris par exemple. Ou alors récupérer le commercial ayant l'ID 2... Dans le code ci-dessous, nous allons donc voir quelques requêtes basiques qui pourront vous être utiles. Pour des requêtes plus complexes, quelques recherches seront nécessaires, un article consacré à ces requêtes sera certainement mis en ligne sur ce site.  

Extrait du fichier /app/code/Ns/Thorleif/Block/Main.php
  1. // Utilisé pour toutes les requêtes qui suivent :
  2. $objectManager = \Magento\FrameWork\App\ObjectManager::getInstance();
  3.  
  4. // Récupération du commercial ayant l'ID 2 :
  5. $commercial = $objectManager
  6.                 ->create('Ns\Thorleif\Model\Commerciaux')
  7.                 ->load(2)
  8.                 ->getData();
  9.  
  10. // Récupération du premier élément de la collection :
  11. $commercial = $objectManager
  12.                 ->create('Ns\Thorleif\Model\Resource\Commerciaux\Collection')
  13.                 ->getFirstItem()
  14.                 ->getData();
  15.  
  16. // Récupération de tous les commerciaux classés par ID décroissant
  17. $commerciaux = $objectManager
  18.                 ->create('Ns\Thorleif\Model\Resource\Commerciaux\Collection')
  19.                 ->addOrder('id', 'DESC')
  20.                 ->getData();
  21.  
  22. // Récupération des commerciaux vivant à Paris (retourne un tableau d'objets Commerciaux)
  23. $commerciaux = $objectManager
  24.                 ->create('Ns\Thorleif\Model\Resource\Commerciaux\Collection')
  25.                 ->getItemsByColumnValue('city','Paris');

Création du formulaire

Maintenant que nous savons récupérer nos données, il va falloir apprendre à ajouter un enregistrement, à le mettre à jour, et à le supprimer. Pour cela, on va commencer  par créer un formulaire basique dans notre template. Cet article ne concerne pas la création de formulaire, alors nous allons le créer en HTML pour éviter d'avoir trop de choses à acquérir d'un seul coup. Voici donc le formulaire : 

Extrait du fichier /app/code/Ns/Thorleif/view/frontend/templates/main.phtml
  1. <form action="<?php echo $block->getSaveUrl() ?>" method="post">
  2.     <fieldset>
  3.         <label for="name">Nom : </label>
  4.         <input type="text" name="name" id="name" />
  5.         <br /><br />
  6.         <label for="city">Ville : </label>
  7.         <input type="text" name="city" id="city" />
  8.         <br /><br />
  9.         <input type="submit" value="Envoyer" />
  10.     </fieldset>
  11. </form>

Vous pouvez placer ce code avant ou après l'affichage de la liste des commerciaux dans le template. Pour ma part, je l'ai fait juste après. C'est un formulaire classique, contenant un champ "name" et un champ "city" ainsi qu'un bouton "submit". La seule chose nouvelle est l'appel d'une méthode du block qui va renseigner l'attribut "action" de la balise <form>. On appelle donc la méthode getSaveUrl() de notre block, et il va donc falloir créer cette méthode. Rien de bien compliqué : 

Extrait du fichier /app/code/Ns/Thorleif/Block/Main.php
  1. public function getSaveUrl()
  2. {
  3.     return $this->getUrl('*/*/save');
  4. }

Le formulaire est créé. Si vous n'avez pas trop touché au CSS, il devrait ressembler à ceci :

creation-d-un-module-sous-magento-2-partie-3-utilisation-des-modeles-1

Ajout, mise à jour et suppression des données

Nous savons quelle action sera exécutée à l'envoi du formulaire, nous n'avons plus qu'à créer notre action. On va donc créer un contrôleur Save.php, vérifier les données envoyées, et les ajouter en base, avant d'être redirigé vers la liste des commerciaux :

/app/code/Ns/Thorleif/Controller/Index/Save.php
  1. <?php
  2.  
  3. namespace Ns\Thorleif\Controller\Index;
  4.  
  5. class Save extends \Magento\Framework\App\Action\Action
  6. {
  7.     public function execute()
  8.     {
  9.         // On récupère les données du formulaire :
  10.         $name = $this->getRequest()->getPost('name');
  11.         $city = $this->getRequest()->getPost('city');
  12.  
  13.         // On valide nos données (ici, on vérifie simplement que $name et $city ne sont pas vides)
  14.         if(empty($name) || empty($city))
  15.         {
  16.             $this->messageManager->addError('Tous les champs sont obligatoires !');
  17.             $this->_redirect('*/*/index');
  18.         }
  19.         else
  20.         {
  21.             // On sauvegarde nos données
  22.             $commercial = $this->_objectManager->create('Ns\Thorleif\Model\Commerciaux');
  23.             $commercial->setName($name);
  24.             $commercial->setCity($city);
  25.             $commercial->save();
  26.             // On redirige
  27.             $this->messageManager->addSuccess('Commercial bien ajouté !');
  28.             $this->_redirect('*/*/index');
  29.         }
  30.     }
  31. }

Le code n'est pas trop difficile à comprendre. Il n'y a pas de grandes différences par rapport à la version 1 de Magento, mis à part la récupération du modèle Commerciaux. On ajoute aussi des messages de validation ou d'erreur grâce à l'objet messageManager, qui nous permet d'afficher à l'utilisateur des informations utiles. Pour la suite, voici le code nécessaire pour mettre à jour une entrée en base et une suppression. Je n'afficherai que le code, mais évidemment, il devra être intégré dans un contrôleur

Extrait du fichier /app/code/Ns/Thorleif/Controller/Index/Update.php
  1. // Mise à jour d'un commercial 
  2. $commercial = $this->_objectManager->create('Ns\Thorleif\Model\Commerciaux')->load(1);
  3. $commercial->setName('Commercial 1 édité');
  4. $commercial->setCity('Paris édité');
  5. $commercial->save();
  6.  
  7. // Suppression d'un commercial
  8. $commercial = $this->_objectManager->create('Ns\Thorleif\Model\Commerciaux')->load(1);
  9. $this->_redirect('*/*/index');

Voilà, c'est assez simple à comprendre. Avec ce dernier exemple, nous connaissons toutes les bases nécessaires pour gérer des modèles en Front. Dans les prochaines parties, nous allons pouvoir créer une partie BackOffice, et gérer nos commerciaux en tant qu'administrateur. Dans ces deux prochaines parties, la difficulté va augmenter un petit peu, préparez-vous.