Formation Magento 2 : Chapitre 3 – Partie E

Déclaration du routeur backoffice

De la même sorte que nous avions créé notre routeur dans le chapitre précédent, nous allons le faire pour la partie admin.

Commencez par créer le fichier :
app/code/Maxime/Jobs/etc/adminhtml/routes.xml

Nous y mettrons le contenu suivant :

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:App/etc/routes.xsd">
    <router id="admin">
        <route id="jobs" frontName="jobs">
            <module name="Maxime_Jobs" before="Magento_Backend" />
        </route>
    </router>
</config>

Le noeud route se décompose ainsi :
– id : identifiant unique de votre route.
– frontName : c’est la chaîne de caractère qui sera présente dans votre URL d’appel.

Puis vient le noeud module qui permet de définir :
– name : le module à appeler
– before : votre module devra passer en priorité par rapport au module défini
– after : votre module passera après le module défini

Les champs « before » et « after » sont facultatifs

Création du controller admin

Rappelez-vous, dans le menu.xml que nous avons créé dans la partie précédente, nous avions le code suivant :

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:module:Magento_Backend:etc/menu.xsd">
    <menu>
        <add id="Maxime_Jobs::job_head" title="Jobs" module="Maxime_Jobs" sortOrder="100" resource="Maxime_Jobs::job_head" />
        <add id="Maxime_Jobs::department" title="Departments" module="Maxime_Jobs" sortOrder="10" parent="Maxime_Jobs::job_head" action="jobs/department" resource="Maxime_Jobs::job" />
        <add id="Maxime_Jobs::job" title="Jobs" module="Maxime_Jobs" sortOrder="20" parent="Maxime_Jobs::job_head" action="jobs/job" resource="Maxime_Jobs::job" />
    </menu>
</config>

Je voudrais insister sur l’attribut « action » des lignes 5 et 6.
En effet nous avons les valeurs suivantes :
– jobs/department
– jobs/job

Et si j’utilise vos souvenirs du chapitre précédent, vous devriez deviner le chemin réel utilisé par Magento 2 ainsi que le chemin des controllers qui vont avec !

Les chemins réellement utilisés par Magento 2 sont :
– jobs/department/index
– jobs/job/index

Ce qui nous donne les chemins des controller à créer :
– app/code/Maxime/Jobs/Controller/Adminhtml/Department/Index.php
– app/code/Maxime/Jobs/Controller/Adminhtml/Job/Index.php

Le piège ici c’est que les controllers sont dans un dossier « Adminhtml », pour ne pas les mélanger avec les controllers frontend.

Passons maintenant à la création de notre premier controller admin :

app/code/Maxime/Jobs/Controller/Adminhtml/Department/Index.php

Mettez-y le code suivant :

<?php
namespace Maxime\Jobs\Controller\Adminhtml\Department;

use Magento\Backend\App\Action\Context;
use Magento\Framework\View\Result\PageFactory;
use Magento\Backend\App\Action;

class Index extends Action
{
    const ADMIN_RESOURCE = 'Maxime_Jobs::department';

    /**
     * @var PageFactory
     */
    protected $resultPageFactory;

    /**
     * @param Context $context
     * @param PageFactory $resultPageFactory
     */
    public function __construct(
        Context $context,
        PageFactory $resultPageFactory
    ) {
        parent::__construct($context);
        $this->resultPageFactory = $resultPageFactory;
    }

    /**
     * Index action
     *
     * @return \Magento\Backend\Model\View\Result\Page
     */
    public function execute()
    {
        /** @var \Magento\Backend\Model\View\Result\Page $resultPage */
        $resultPage = $this->resultPageFactory->create();
        $resultPage->setActiveMenu('Maxime_Jobs::department');
        $resultPage->addBreadcrumb(__('Jobs'), __('Jobs'));
        $resultPage->addBreadcrumb(__('Manage Departments'), __('Manage Departments'));
        $resultPage->getConfig()->getTitle()->prepend(__('Department'));

        return $resultPage;
    }
}

Détaillons maintenant le contenu point par point :

– La constante ADMIN_RESSOURCE est très importante car elle permet de vérifier si vous avez accès à ce contenu de l’admin (ACL).
Rappelez-vous, dans notre acl.xml nous avions cette partie :

                        <resource id="Maxime_Jobs::department" title="Departments" sortOrder="10">
                            <resource id="Maxime_Jobs::department_save" title="Save Department" sortOrder="10" />
                            <resource id="Maxime_Jobs::department_delete" title="Delete Department" sortOrder="20" />
                        </resource>

C’est l’id de la première ligne que nous mettons dans notre constante ADMIN_RESSOURCE

– L’attribut « resultPageFactory » et la méthode construct sont obligatoires, c’est l’injection de dépendance qui nous y oblige. Sans cette partie, vous aurez l’erreur suivante :
Notice: Undefined property: Maxime\Jobs\Controller\Adminhtml\Job\Index\Interceptor::$resultPageFactory

– Dans la méthode exécute nous définissons plusieurs informations sur notre page.
Le setActiveMenu permet de mettre en surbrillance le menu courant, c’est le menu déclaré dans le menu.xml.

activemenu

– Les méthodes addBreadcrumb permettent de compléter le fil d’ariane, la première valeur est le label de l’élément, le deuxième est le title.
Il existe un 3è paramètre facultatif qui est le lien voulu au clic sur l’élément.

public function addBreadcrumb($label, $title, $link = null)

Le fil d’ariane n’à pas l’air visible dans la partie admin, j’ai vérifié dans des modules natifs de Magento et ces méthodes sont appelées.
C’est donc pour celà que je les ai mises dans le modules même si on ne voit pas leur affichage.

– Le prepend, permet de précéder le titre de la page par « Department », de ce fait, le title de notre page est « Department / Jobs / Magento Admin »

Nous allons en faire de même pour les Jobs, qui aura quasiment le même code à quelques exceptions près :

app/code/Maxime/Jobs/Controller/Adminhtml/Job/Index.php

Avec le contenu :

<?php
namespace Maxime\Jobs\Controller\Adminhtml\Job;

use Magento\Backend\App\Action\Context;
use Magento\Framework\View\Result\PageFactory;
use Magento\Backend\App\Action;

class Index extends Action
{
    const ADMIN_RESOURCE = 'Maxime_Jobs::job';

    /**
     * @var PageFactory
     */
    protected $resultPageFactory;

    /**
     * @param Context $context
     * @param PageFactory $resultPageFactory
     */
    public function __construct(
        Context $context,
        PageFactory $resultPageFactory
    ) {
        parent::__construct($context);
        $this->resultPageFactory = $resultPageFactory;
    }

    /**
     * Index action
     *
     * @return \Magento\Backend\Model\View\Result\Page
     */
    public function execute()
    {
        /** @var \Magento\Backend\Model\View\Result\Page $resultPage */
        $resultPage = $this->resultPageFactory->create();
        $resultPage->setActiveMenu('Maxime_Jobs::job');
        $resultPage->addBreadcrumb(__('Jobs'), __('Jobs'));
        $resultPage->addBreadcrumb(__('Manage Jobs'), __('Manage Jobs'));
        $resultPage->getConfig()->getTitle()->prepend(__('Job'));

        return $resultPage;
    }
}

Maintenant si vous cliquez sur les liens de votre menu, les pages s’afficheront correctement.
Mais comme nous n’avons pas encore signalé ce que l’on voulait y mettre, elles sont vides.

Notre but sera donc d’afficher une grid avec la liste de nos éléments, et de pouvoir la trier, la filtrer etc… De la même sorte que la page d’affichage des commandes.
Je vous conseille de souffler un peu avant le prochain tuto, car il sera costaud et peut-être l’un des plus complexe de cette formation.

Continuer la formation
Revenir à la partie précédente
Création d’un controlleur admin dans Magento 2
Taggé sur :            

Une réflexion sur “Création d’un controlleur admin dans Magento 2

  • 06/08/2016 à 09:12
    Permalink

    Le noeud route se décompose ainsi :
    – id : identifiant unique de votre route.

    L’id doit correspondre au nom du module apparemment. Pour avoir essayer de lui donner un nom personaliser je n’arrive pas a atteindre la page. Ou alors je ne vois pas ou est sa reference dans les autres fichiers.

    Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Nous utilisons des cookies afin de nous assurer de vous proposer la meilleure expérience sur ce site.
Ok