Formation Magento 2 : Chapitre 5 – Partie C

Il ne nous reste plus que 2 controllers à mettre en place :
– delete
– massDelete

Allons-y !

Création du controller delete

Créez le fichier :
app/code/Maxime/Jobs/Controller/Adminhtml/Department/Delete.php

Et mettez-y ce code :

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

use Magento\Backend\App\Action;

class Delete extends Action
{
    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_delete');
    }

    /**
     * Delete action
     *
     * @return \Magento\Framework\Controller\ResultInterface
     */
    public function execute()
    {
        $id = $this->getRequest()->getParam('id');
        /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */
        $resultRedirect = $this->resultRedirectFactory->create();
        if ($id) {
            try {
                $model = $this->_model;
                $model->load($id);
                $model->delete();
                $this->messageManager->addSuccess(__('Department deleted'));
                return $resultRedirect->setPath('*/*/');
            } catch (\Exception $e) {
                $this->messageManager->addError($e->getMessage());
                return $resultRedirect->setPath('*/*/edit', ['id' => $id]);
            }
        }
        $this->messageManager->addError(__('Department does not exist'));
        return $resultRedirect->setPath('*/*/');
    }
}

Nous retrouvons le construct et le isAllowed que nous connaissons désormais bien.
Dans la méthode execute, on vérifie qu’un ID est bien présent, ensuite on load le modèle et on le supprime.
On redirige ensuite l’utilisateur avec un message de succès ou d’erreur.

Création du controller massDelete

Pour supprimer plusieurs éléments, il faut les cocher puis choisir l’option « Delete » :

massaction

Nous allons créer le controller qui nous permettra de mettre en place la suppression :
app/code/Maxime/Jobs/Controller/Adminhtml/Department/MassDelete.php

Nous mettrons ce code dedans :

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

use Magento\Framework\Controller\ResultFactory;
use Magento\Backend\App\Action\Context;
use Magento\Ui\Component\MassAction\Filter;
use Maxime\Jobs\Model\ResourceModel\Department\CollectionFactory;

class MassDelete extends \Magento\Backend\App\Action
{
    /**
     * @var Filter
     */
    protected $filter;

    /**
     * @var CollectionFactory
     */
    protected $collectionFactory;


    /**
     * @param Context $context
     * @param Filter $filter
     * @param CollectionFactory $collectionFactory
     */
    public function __construct(Context $context, Filter $filter, CollectionFactory $collectionFactory)
    {
        $this->filter = $filter;
        $this->collectionFactory = $collectionFactory;
        parent::__construct($context);
    }
    /**
     * Execute action
     *
     * @return \Magento\Backend\Model\View\Result\Redirect
     * @throws \Magento\Framework\Exception\LocalizedException|\Exception
     */
    public function execute()
    {
        $collection = $this->filter->getCollection($this->collectionFactory->create());
        $collectionSize = $collection->getSize();
        foreach ($collection as $item) {
            $item->delete();
        }

        $this->messageManager->addSuccess(__('A total of %1 record(s) have been deleted.', $collectionSize));

        /** @var \Magento\Backend\Model\View\Result\Redirect $resultRedirect */
        $resultRedirect = $this->resultFactory->create(ResultFactory::TYPE_REDIRECT);
        return $resultRedirect->setPath('*/*/');
    }
}

Nous déclarons un objet de type CollectionFactory, nous allons également le créer :
app/code/Maxime/Jobs/Model/ResourceModel/Department/CollectionFactory.php

Avec ce contenu :

<?php
namespace Maxime\Jobs\Model\ResourceModel\Department;

class CollectionFactory
{
    /**
     * Object Manager instance
     *
     * @var \Magento\Framework\ObjectManagerInterface
     */
    protected $_objectManager = null;

    /**
     * Instance name to create
     *
     * @var string
     */
    protected $_instanceName = null;

    /**
     * Factory constructor
     *
     * @param \Magento\Framework\ObjectManagerInterface $objectManager
     * @param string $instanceName
     */
    public function __construct(\Magento\Framework\ObjectManagerInterface $objectManager, $instanceName = '\\Maxime\\Jobs\\Model\\ResourceModel\\Department\\Collection')
    {
        $this->_objectManager = $objectManager;
        $this->_instanceName = $instanceName;
    }

    /**
     * Create class instance with specified parameters
     *
     * @param array $data
     * @return \Maxime\Jobs\Model\ResourceModel\Department\Collection
     */
    public function create(array $data = array())
    {
        return $this->_objectManager->create($this->_instanceName, $data);
    }
}

Ce qui est important dans cette classe c’est la variable instanceName qui va pointer vers notre collection.

Avant de tester la suppression, vérifiez dans la classe app/code/Maxime/Jobs/Model/ResourceModel/Department/Collection.php que vous ayez bien la ligne suivante :
protected $_idFieldName = \Maxime\Jobs\Model\Department::DEPARTMENT_ID;

Si ce n’est pas le cas, ajoutez la.
Vous pouvez désormais sélectionner des éléments et les supprimer en masse.

deleted

Nous en avons fini avec les controllers. La prochaine étape qui nous attend, c’est de répéter les 2 parties précédentes pour la gestion des objets du type « Job ».
C’est au travers d’un article spécial que nous le ferons, et c’est surtout vous qui ferez le plus gros du travail 🙂

Continuer la formation
Revenir à la partie précédente
Delete et action de masse dans l’admin Magento 2
Taggé sur :    

6 thoughts on “Delete et action de masse dans l’admin Magento 2

  • 01/04/2016 à 09:55
    Permalink

    Bonjour,

    Est-ce qu’une partie sur la modification en ligne (directement sur la liste en double cliquant)?

    Je débute Magento et j’ai essayer de reproduire ceci en me basant sur le module CMS mais je dois avoir loupé un truc pour pouvoir le réaliser.

    Merci et bon boulot sur le tuto!

    Répondre
    • 01/04/2016 à 09:56
      Permalink

      Non je n’ai pas prévu pour le moment de gérer ce cas.
      Mais ça peut-être une idée intéressante à développer en effet !
      Merci pour ton retour, et amuses toi bien avec Magento 😉

      Répondre
  • 11/04/2016 à 10:56
    Permalink

    Bonjour Maxime,
    Merci pour ton tuto, je suis complètement novice sur Magento et je trouve qu’il est difficile de trouver de la doc sur magento2 donc c’est cool de trouver des morceaux de code qui permettent d’avancer 😉

    Sinon, j’ai une erreur 404 sur le massDelete, je ne trouve pas d’où le problème peut venir, aurais-tu une idée ?
    Merci

    Répondre
    • 11/04/2016 à 11:03
      Permalink

      Salut et merci du commentaire, ce que je peux te conseiller :
      – Vérifie bien la casse du nom de ton fichier
      – La casse du nom de ta classe
      – Vider les dossiers var/cache, var/generation

      Répondre
    • 01/06/2016 à 12:00
      Permalink

      Bonjour Nidecondor,

      Veuillez vérifier le chemin de l’action : MassDelete

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

      Répondre
  • 06/09/2016 à 14:45
    Permalink

    Bonjour,

    Ne faudrait-il pas mettre la fonction _isAllowed dans le controller MassDelete ? (Maxime_Jobs::department_delete) comme pour le controller delete.

    Merci.

    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