Como chamar o método auxiliar no arquivo .phtml

16

Tentando desenvolver algo no magento 2. Mas não encontrei como chamar um método Helper no arquivo de modelo (.phtml).

Quero uma substituição do código abaixo:

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

Se alguém souber por favor me ajude.

Gaurav Agrawal
fonte
você já tentou minha resposta?
Chirag
Ei, você deve aceitar a resposta de Marius abaixo.
Seanbreeden
1
@seanbreeden Desculpe, votei, mas esqueci de aceitar.
Gaurav Agrawal 28/09

Respostas:

29

Você não deve usar chamadas auxiliares diretamente no modelo.
Tenha sua instância auxiliar fornecida como uma dependência do bloco que renderiza o modelo e crie um método no seu bloco que chame o auxiliar e chame esse método no modelo.

Tenha seu bloco definido assim

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

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

Então você pode chamar seu modelo $block->doSomething()

Marius
fonte
2
Pode me explicar qual seria o problema se nós chamamos ajudante no modelo diretamente sem definir em dependência
Prashant Valanda
não é uma boa prática. Introduz uma dependência não declarada. Se você quiser fazer isso corretamente, deverá chamar apenas no modelo apenas métodos do bloco que o renderiza.
Marius
2
Núcleo desenvolvedor magento também pediram ajudante diretamente no arquivo phtml
Prashant Valanda
2
Isso não faz tudo certo. Talvez essa parte ainda não seja refatorada
Marius
1
Resposta curta: sim. Resposta longa, você não deve ter um ajudante com 10 métodos e todos eles são necessários para o mesmo bloco. Se isso acontecer, talvez você deva pensar em refatorar seu código para blocos e modelos menores.
Marius
24

Você tem que usar assim:

$helper = $this->helper('{Vendor}\{Module}\Helper\Data');
$values = $helper->YourHelperMethod();
chirag
fonte
Sim, não está funcionando. Eu também já usei o mesmo código antes
Gaurav Agrawal 18 /
$ this está agora obsoleta na lógica template
Dominic Xigen
7

Você precisa escrever o nome inteiro da classe no helper, como abaixo:

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

Você pode usá-lo no arquivo phtml usando o código acima

Prashant Valanda
fonte
assim vai funcionar em m2?
Jafar pinjar
$ this está agora obsoleta na lógica template
Dominic Xigen
2

Eu usei esse código em um dos meus módulos.

Altere o módulo personalizado para NameSpace (o nome da sua empresa) e altere ReviewRating para (o nome do seu módulo)

Dentro /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();
    }

}

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

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

Dentro /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);
    }

}

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

system configuration labels created here 
inrsaurabh
fonte
0

Experimente este código no seu bloco:

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

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

E no seu modelo, você pode ligar para:

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