Formation Magento 2 : Chapitre 7 – Partie C

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.

Continuer la formation
Revenir à la partie précédente
Créer un helper sous Magento 2
Taggé sur :

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