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 » :
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.
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 🙂
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!
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 😉
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
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
Bonjour Nidecondor,
Veuillez vérifier le chemin de l’action : MassDelete
app/code/Maxime/Jobs/Controller/Adminhtml/Department/MassDelete.php
Bonjour,
Ne faudrait-il pas mettre la fonction _isAllowed dans le controller MassDelete ? (Maxime_Jobs::department_delete) comme pour le controller delete.
Merci.