Pourquoi créer un helper ?
Les helpers peuvent être appelés n’importe où à condition qu’ils soient bien injectés lors du construct de la classe voulue.
Cela permet donc d’avoir des méthodes « génériques » qui évitent d’avoir le même code à plusieurs endroits.
Pour vous donner un exemple, vous vous rappelez de la configuration que nous avions créé ?
Dans le fichier app/code/Maxime/Jobs/Block/Department/View.php
nous avions ajouté une constante LIST_JOBS_ENABLED avec le chemin de notre configuration.
Ce chemin dans le bloc n’a pas vraiment d’intérêt, car nous pourrions en avoir besoin dans d’autres classes.
Pour ce faire, nous allons déplacer ceci dans un helper.
Création du Helper
Vous pouvez créer le fichier :
app/code/Maxime/Jobs/Helper/Data.php
Qui contient :
<?php namespace Maxime\Jobs\Helper; class Data extends \Magento\Framework\App\Helper\AbstractHelper { const LIST_JOBS_ENABLED = 'jobs/department/view_list'; /** * Return if display list is enabled on department view * @return bool */ public function getListJobEnabled() { return $this->scopeConfig->getValue( self::LIST_JOBS_ENABLED, \Magento\Store\Model\ScopeInterface::SCOPE_STORE ); } }
C’est une classe très classique où l’on défini la constante avec le chemin de notre config. Et une méthode pour récupérer la valeur. Le jour où le chemin de la config change, vous n’aurez qu’à le changer ici.
Nous allons modifier notre block qui appelait la configuration en conséquence.
Appeler un Helper avec Magento 2
Reprenez notre classe :
app/code/Maxime/Jobs/Block/Department/View.php
Et remplacez son contenu avec ceci :
<?php namespace Maxime\Jobs\Block\Department; class View extends \Magento\Framework\View\Element\Template { protected $_jobCollection = null; protected $_department; protected $_job; protected $_helper; /** * @param \Magento\Framework\View\Element\Template\Context $context * @param \Maxime\Jobs\Model\Department $department * @param \Maxime\Jobs\Model\Job $job * @param \Maxime\Jobs\Helper\Data $helper * @param array $data */ public function __construct( \Magento\Framework\View\Element\Template\Context $context, \Maxime\Jobs\Model\Department $department, \Maxime\Jobs\Model\Job $job, \Maxime\Jobs\Helper\Data $helper, array $data = [] ) { $this->_department = $department; $this->_job = $job; $this->_helper = $helper; parent::__construct( $context, $data ); } /** * @return $this */ protected function _prepareLayout() { parent::_prepareLayout(); // Get department $department = $this->getLoadedDepartment(); // Title is department's name $title = $department->getName(); $description = __('Look at the jobs we have got for you'); $keywords = __('job,hiring'); $this->getLayout()->createBlock('Magento\Catalog\Block\Breadcrumbs'); if ($breadcrumbsBlock = $this->getLayout()->getBlock('breadcrumbs')) { $breadcrumbsBlock->addCrumb( 'jobs', [ 'label' => __('We are hiring'), 'title' => __('We are hiring'), 'link' => $this->getListJobUrl() // No link for the last element ] ); $breadcrumbsBlock->addCrumb( 'job', [ 'label' => $title, 'title' => $title, 'link' => false // No link for the last element ] ); } $this->pageConfig->getTitle()->set($title); $this->pageConfig->setDescription($description); $this->pageConfig->setKeywords($keywords); $pageMainTitle = $this->getLayout()->getBlock('page.main.title'); if ($pageMainTitle) { $pageMainTitle->setPageTitle($title); } return $this; } protected function _getDepartment() { if (!$this->_department->getId()) { // our model is already set in the construct // but I put this method to load in case the model is not loaded $entityId = $this->_request->getParam('id'); $this->_department = $this->_department->load($entityId); } return $this->_department; } public function getLoadedDepartment() { return $this->_getDepartment(); } public function getListJobUrl(){ return $this->getUrl('jobs/job'); } protected function _getJobsCollection(){ if($this->_jobCollection === null && $this->_department->getId()){ $jobCollection = $this->_job->getCollection() ->addFieldToFilter('department_id', $this->_department->getId()) ->addStatusFilter($this->_job, $this->_department); $this->_jobCollection = $jobCollection; } return $this->_jobCollection; } public function getLoadedJobsCollection() { return $this->_getJobsCollection(); } public function getJobUrl($job){ if(!$job->getId()){ return '#'; } return $this->getUrl('jobs/job/view', ['id' => $job->getId()]); } public function getConfigListJobs() { return $this->_helper->getListJobEnabled(); } }
– La constante LIST_JOBS_ENABLED n’existe plus
– Dans le construct nous y ajoutons notre helper
– La méthode getConfigListJobs fait désormais appel à notre helper
En front, aucun changement. L’affichage de la liste se fera toujours en fonction de la configuration enregistrée. Mais au moins la récupération de l’information est centralisée dans notre helper.