Formation Magento 2 : Chapitre 5 – Partie A

Nous allons commencer par créer 3 controllers :
– NewAction
– Edit
– Save

Ils correspondent aux différentes actions dont nous aurons besoin pour l’ajout de notre élément.

Notez que le controller « New » est nommé « NewAction » car « new » est un mot utilisé par PHP. Notre classe ne peut donc pas s’appeler comme ça.

Création du controller NewAction

Commencez par créer le fichier :
app/code/Maxime/Jobs/Controller/Adminhtml/Department/NewAction.php

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

use Magento\Backend\App\Action;

class NewAction extends Action
{
    /**
     * @var \Magento\Backend\Model\View\Result\Forward
     */
    protected $_resultForwardFactory;

    /**
     * @param \Magento\Backend\App\Action\Context $context
     * @param \Magento\Backend\Model\View\Result\ForwardFactory $resultForwardFactory
     */
    public function __construct(
        \Magento\Backend\App\Action\Context $context,
        \Magento\Backend\Model\View\Result\ForwardFactory $resultForwardFactory
    ) {
        $this->_resultForwardFactory = $resultForwardFactory;
        parent::__construct($context);
    }

    /**
     * {@inheritdoc}
     */
    protected function _isAllowed()
    {
        return $this->_authorization->isAllowed('Maxime_Jobs::department_save');
    }

    /**
     * Forward to edit
     *
     * @return \Magento\Backend\Model\View\Result\Forward
     */
    public function execute()
    {
        /** @var \Magento\Backend\Model\View\Result\Forward $resultForward */
        $resultForward = $this->_resultForwardFactory->create();
        return $resultForward->forward('edit');
    }
}

Premièrement nous injectons nos dépendances dans la méthode construct.
Ensuite, nous vérifions que l’utilisateur a bien les droits d’accéder à cette page avec l’ACL que nous avons créé précédemment « Maxime_Jobs::department_save »
Enfin, la fonction execute redirige l’utilisateur vers le controller « edit ».
En effet, un ajout d’élément possède le même formulaire que l’édition. La différence c’est que notre élément n’a pas encore d’id vu qu’il est nouveau.

Création du controller Edit

Passons maintenant au controller d’édition :
app/code/Maxime/Jobs/Controller/Adminhtml/Department/Edit.php

Avec le contenu suivant :

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

use Magento\Backend\App\Action;

class Edit extends Action
{
    /**
     * Core registry
     *
     * @var \Magento\Framework\Registry
     */
    protected $_coreRegistry = null;

    /**
     * @var \Magento\Framework\View\Result\PageFactory
     */
    protected $_resultPageFactory;

    /**
     * @var \Maxime\Jobs\Model\Department
     */
    protected $_model;

    /**
     * @param Action\Context $context
     * @param \Magento\Framework\View\Result\PageFactory $resultPageFactory
     * @param \Magento\Framework\Registry $registry
     * @param \Maxime\Jobs\Model\Department $model
     */
    public function __construct(
        Action\Context $context,
        \Magento\Framework\View\Result\PageFactory $resultPageFactory,
        \Magento\Framework\Registry $registry,
        \Maxime\Jobs\Model\Department $model
    ) {
        $this->_resultPageFactory = $resultPageFactory;
        $this->_coreRegistry = $registry;
        $this->_model = $model;
        parent::__construct($context);
    }

    /**
     * {@inheritdoc}
     */
    protected function _isAllowed()
    {
        return $this->_authorization->isAllowed('Maxime_Jobs::department_save');
    }

    /**
     * Init actions
     *
     * @return \Magento\Backend\Model\View\Result\Page
     */
    protected function _initAction()
    {
        // load layout, set active menu and breadcrumbs
        /** @var \Magento\Backend\Model\View\Result\Page $resultPage */
        $resultPage = $this->_resultPageFactory->create();
        $resultPage->setActiveMenu('Maxime_Jobs::department')
            ->addBreadcrumb(__('Department'), __('Department'))
            ->addBreadcrumb(__('Manage Departments'), __('Manage Departments'));
        return $resultPage;
    }

    /**
     * Edit Department
     *
     * @return \Magento\Backend\Model\View\Result\Page|\Magento\Backend\Model\View\Result\Redirect
     * @SuppressWarnings(PHPMD.NPathComplexity)
     */
    public function execute()
    {
        $id = $this->getRequest()->getParam('id');
        $model = $this->_model;

        // If you have got an id, it's edition
        if ($id) {
            $model->load($id);
            if (!$model->getId()) {
                $this->messageManager->addError(__('This department not exists.'));
                /** \Magento\Backend\Model\View\Result\Redirect $resultRedirect */
                $resultRedirect = $this->resultRedirectFactory->create();

                return $resultRedirect->setPath('*/*/');
            }
        }

        $data = $this->_getSession()->getFormData(true);
        if (!empty($data)) {
            $model->setData($data);
        }

        $this->_coreRegistry->register('jobs_department', $model);

        /** @var \Magento\Backend\Model\View\Result\Page $resultPage */
        $resultPage = $this->_initAction();
        $resultPage->addBreadcrumb(
            $id ? __('Edit Department') : __('New Department'),
            $id ? __('Edit Department') : __('New Department')
        );
        $resultPage->getConfig()->getTitle()->prepend(__('Departments'));
        $resultPage->getConfig()->getTitle()
            ->prepend($model->getId() ? $model->getName() : __('New Department'));

        return $resultPage;
    }
}

Dans le construct, nous mettons également notre modèle de type Department, car nous allons devoir travailler avec.
Comme le controller précédent, nous vérifions également l’ACL.
Dans la méthode « initAction », nous marquons le menu actif ainsi que le breadcrumbs.

Vient ensuite la méthode « execute ». Si nous avons un « id » dans l’URL, on load le modèle correspondant, nous sommes dans le cas d’une édition.
Dans le cas ou l’objet demandé n’existe plus, on redirige l’utilisateur vers la liste avec un message d’erreur.
Si nous avons des informations en session, nous les mettons dans notre modèle. Ensuite, on l’enregistre dans le « coreRegistry » pour le récupérer plus tard dans une autre classe.

Enfin, nous mettons en place le titre de la page. Si nous avons un ID, nous mettons le nom du department. Sinon nous mettons le libellé pour un nouvel élément

Création du controller Save

Vient ensuite le controlle « save », qui comme son nom l’indique, va sauvegarder nos données en BDD :
app/code/Maxime/Jobs/Controller/Adminhtml/Department/Save.php

Mettons-y ce contenu :

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

use Magento\Backend\App\Action;

class Save extends Action
{
    /**
     * @var \Maxime\Jobs\Model\Department
     */
    protected $_model;

    /**
     * @param Action\Context $context
     * @param \Maxime\Jobs\Model\Department $model
     */
    public function __construct(
        Action\Context $context,
        \Maxime\Jobs\Model\Department $model
    ) {
        parent::__construct($context);
        $this->_model = $model;
    }

    /**
     * {@inheritdoc}
     */
    protected function _isAllowed()
    {
        return $this->_authorization->isAllowed('Maxime_Jobs::department_save');
    }

    /**
     * Save action
     *
     * @return \Magento\Framework\Controller\ResultInterface
     */
    public function execute()
    {
        $data = $this->getRequest()->getPostValue();
        /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */
        $resultRedirect = $this->resultRedirectFactory->create();
        if ($data) {
            /** @var \Maxime\Jobs\Model\Department $model */
            $model = $this->_model;

            $id = $this->getRequest()->getParam('id');
            if ($id) {
                $model->load($id);
            }

            $model->setData($data);

            $this->_eventManager->dispatch(
                'jobs_department_prepare_save',
                ['deparment' => $model, 'request' => $this->getRequest()]
            );

            try {
                $model->save();
                $this->messageManager->addSuccess(__('Department saved'));
                $this->_getSession()->setFormData(false);
                if ($this->getRequest()->getParam('back')) {
                    return $resultRedirect->setPath('*/*/edit', ['id' => $model->getId(), '_current' => true]);
                }
                return $resultRedirect->setPath('*/*/');
            } catch (\Magento\Framework\Exception\LocalizedException $e) {
                $this->messageManager->addError($e->getMessage());
            } catch (\RuntimeException $e) {
                $this->messageManager->addError($e->getMessage());
            } catch (\Exception $e) {
                $this->messageManager->addException($e, __('Something went wrong while saving the department'));
            }

            $this->_getSession()->setFormData($data);
            return $resultRedirect->setPath('*/*/edit', ['entity_id' => $this->getRequest()->getParam('id')]);
        }
        return $resultRedirect->setPath('*/*/');
    }
}

Vous commencez à connaître le principe, je ne reviens pas sur le construct, ni sur le isAllowed.
Dans l’execute, nous récupérons les données renvoyées. Si un ID est présent, nous récupérons l’objet à éditer.
Ensuite, nous settons les données dans l’objet, puis nous renvoyons un événement « jobs_department_prepare_save » (nous verrons plus tard ce qu’est un événement).
Enfin, nous sauvegardons l’objet puis nous redirigons l’utilisateur en cas de succès ou d’échec.

Nos actions sont maintenant prêtes. Nous allons mettre le formulaire en place dans la partie suivante.

Continuer la formation
Revenir à la partie précédente
Controllers d’ajout et d’édition dans l’admin Magento 2
Share on FacebookTweet about this on TwitterShare on Google+Email this to someone
Taggé sur :    

Laisser un commentaire

Votre adresse de messagerie 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