We will create 3 controllers in order to add/edit an element :
– NewAction
– Edit
– Save
The “New” controller is named “NewAction” because “new” is a PHP keyword. Our class must have a different name
NewAction controller creation
Create the file :
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'); } }
First, we inject our dependances on the construct method.
Then, we verify the current user has got the right to see the page. The ACL checked is “Maxime_Jobs::department_save”
To finish, the execute function redirect the user to the “edit” action. The add form is the same as the edit form, except it hasn’t got an ID.
Edit controller creation
Create the file :
app/code/Maxime/Jobs/Controller/Adminhtml/Department/Edit.php
With this content :
<?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; } }
Like the previous controller, we have got construct and the method to verify ACL.
On “initAction”, we set the current active menu and the breadcrumbs (not displayed)
The “execute” method check if you have an ID on the URL. If yes, we load the model, it’s edit mode.
If the object does not exist anymore, we redirect the user with an error message.
If you have some sessions informations, we set its on the model. After the model is saved inside the “coreRegistry” in order to retrieve it on another class.
To finish, we define the title page. We put department’s name on edit mode, else we put ‘New Department’
Save controller creation
Now, we can create the Save controller, which will Save (what a surprise!) our datas on DB :
app/code/Maxime/Jobs/Controller/Adminhtml/Department/Save.php
Put this content :
<?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('*/*/'); } }
So you know how it works and i not explain the construct and the isAllowed methods.
On the “execute”, we retrieve the sent datas. If we have and ID, we load the model to edit.
After, we set the new datas on the object, and we dispatch an event “jobs_department_prepare_save” (We will have a part on observer and events later on this training).
To finish, wa save the model and redirect the user with a success or error message.
Our actions are ready, we need a form to type some informations.
Please Provide whole tutorial source code in one module