Comment appeler la méthode d'assistance dans un fichier .phtml

16

Essayer de développer quelque chose dans magento 2. Mais, je n'ai pas trouvé comment appeler une méthode d'assistance dans un fichier modèle (.phtml).

Je veux un remplacement du code ci-dessous:

$this->helper('modulename/helpername')->methodname();

Si quelqu'un sait, aidez-moi.

Gaurav Agrawal
la source
avez-vous essayé ma réponse?
chirag
Hé, vous devriez accepter la réponse de Marius ci-dessous.
seanbreeden
1
@seanbreeden Désolé, j'ai voté, mais j'ai oublié d'accepter.
Gaurav Agrawal

Réponses:

30

Vous ne devez pas utiliser d'appels d'assistance directement dans le modèle.
Demandez à votre instance d'assistance de fournir une dépendance au bloc qui rend le modèle et créez une méthode dans votre bloc qui appelle l'aide et appelez cette méthode dans le modèle.

Faites définir votre bloc comme ceci

protected $helperData;
public function __construct(
     ....
    \{Vendor}\{Module}\Helper\Data $helperData,
    ....
) {
    ....
    $this->helperData = $helperData;
    ....
}

public function doSomething()
{
    return $this->helperData->doSomething();
}

Ensuite, vous pouvez appeler dans votre modèle $block->doSomething()

Marius
la source
2
Pouvez-vous s'il vous plaît expliquer quel serait le problème si nous appelons helper dans le modèle directement sans définir dans la dépendance
Prashant Valanda
ce n'est pas une bonne pratique. Il introduit une dépendance non déclarée. Si vous voulez le faire correctement, vous ne devez appeler dans le modèle que les méthodes du bloc qui le rend.
Marius
2
Le développeur Core Magento a également appelé l'assistant directement dans le fichier phtml
Prashant Valanda
2
Cela ne fait pas l'affaire. Peut-être que cette partie n'est pas encore refactorisée
Marius
1
Réponse courte: oui. Réponse longue, vous ne devriez pas avoir un assistant avec 10 méthodes et toutes sont nécessaires pour le même bloc. Si cela se produit, vous devriez peut-être penser à refactoriser votre code en blocs et modèles plus petits.
Marius
24

Vous devez utiliser comme ceci:

$helper = $this->helper('{Vendor}\{Module}\Helper\Data');
$values = $helper->YourHelperMethod();
chirag
la source
Oui, ça ne marche pas. J'ai également utilisé le même code auparavant
Gaurav Agrawal
$ this is now deprecated in template logic
Dominic Xigen
7

Vous devez écrire le nom de la classe entière dans l'aide comme ci-dessous:

$this->helper('vendorename\modulename\Helper\helpername')

Vous pouvez l'utiliser dans un fichier phtml en utilisant le code ci-dessus

Prashant Valanda
la source
comme cela fonctionnera sur m2?
jafar pinjar
$ this is now deprecated in template logic
Dominic Xigen
2

J'ai utilisé ce code dans l'un de mes modules.

Remplacez Custommodule par NameSpace (nom de votre entreprise) changez ReviewRating par (nom de votre module)

Dans /var/www/html/magento2/app/code/Custommodule/ReviewRating/Block/HomehorizontalWidget.php

   <?php
namespace Custommodule\ReviewRating\Block;

class HomehorizontalWidget extends \Magento\Framework\View\Element\Template
{

protected $_helper;

public function __construct(
    \Magento\Framework\View\Element\Template\Context $context,
    array $data = [],
    \Custommodule\ReviewRating\Helper\Data $helper
) {
    parent::__construct($context, $data);

    $this->_helper = $helper;
}

public function getEnable(){
        return $this->_helper->getEnable();
    }

}

Dans /var/www/html/magento2/app/code/Custommodule/ReviewRating/view/frontend/templates/homehorizontalwidget.phtml

 <?php  echo $block->getEnable(); ?>

Dans /var/www/html/magento2/app/code/Custommodule/ReviewRating/Helper/Data.php

<?php 
namespace Custommodule\ReviewRating\Helper;

class Data extends \Magento\Framework\App\Helper\AbstractHelper { 

    /** * @var \Magento\Framework\App\Config\ScopeConfigInterfac 
        */ 
    protected $_scopeConfig; 
    CONST ENABLE = 'reviewrating/general/enable_module'; 


    public function __construct( \Magento\Framework\App\Helper\Context $context, 
            \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig ) {

             parent::__construct($context); $this->_scopeConfig = $scopeConfig;
    }

    public function getEnable(){
        return $this->_scopeConfig->getValue(self::ENABLE);
    }

}

Dans /var/www/html/magento2/app/code/Custommodule/ReviewRating/etc/adminhtml/system.xml

system configuration labels created here 
inrsaurabh
la source
0

Essayez ce code dans votre bloc:

protected $helperData;
public function __construct(
     ....
    \{Vendor}\{Module}\Helper\Data $helperData,
    ....
) {
    ....
    $this->helperData = $helperData;
    ....
}

public function getHelper()
{
    return $this->helperData;
}

Et dans votre modèle, vous pouvez appeler:

$helper = $block->getHelper();
Nero Phung
la source