Как вызвать вспомогательный метод в файле .phtml

16

Попытка разработать что-то в magento 2. Но я не нашел, как вызвать метод Helper в файле шаблона (.phtml).

Я хочу заменить код ниже:

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

Если кто-нибудь знает, пожалуйста, помогите мне.

Гаурав Агравал
источник
ты пробовал мой ответ?
Чираг
Эй, ты должен принять ответ Мариуса ниже.
Seanbreeden
1
@seanbreeden Извините, я проголосовал, но забыл принять.
Гаурав Агравал

Ответы:

30

Вы не должны использовать вспомогательные вызовы непосредственно в шаблоне.
Предоставьте свой экземпляр помощника в качестве зависимости от блока, который отображает шаблон, и создайте в своем блоке метод, который вызывает помощника и вызывает этот метод в шаблоне.

Определите ваш блок следующим образом

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

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

Тогда вы можете позвонить в свой шаблон $block->doSomething()

Мариус
источник
2
Не могли бы вы объяснить, в чем будет проблема, если мы вызовем помощника в шаблоне напрямую, без определения зависимости
Прашант Валанда
это не хорошая практика. Это вводит необъявленную зависимость. Если вы хотите сделать это правильно, вы должны вызывать в шаблоне только методы из блока, который его отображает.
Мариус
2
Основной magento разработчик также вызвал помощника непосредственно в phtml файле
Prashant Valanda
2
Это не делает это правильно. Возможно, эта часть еще не подверглась рефакторингу
Marius
1
Краткий ответ: да. Длинный ответ: у вас не должно быть помощника с 10 методами, и все они необходимы для одного и того же блока. Если это произойдет, возможно, вам стоит подумать о рефакторинге вашего кода в меньшие блоки и шаблоны.
Мариус
24

Вы должны использовать как это:

$helper = $this->helper('{Vendor}\{Module}\Helper\Data');
$values = $helper->YourHelperMethod();
чираг
источник
Да, это не работает. Я также использовал тот же код раньше
Гаурав Агравал
$ это теперь устарело в логике шаблона
Доминик Ксиген
7

Вам нужно написать полное имя класса в помощнике, как показано ниже:

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

Вы можете использовать его в файле phtml, используя приведенный выше код

Прашант Валанда
источник
как это будет работать на м2?
Джафар Пинджар
$ это теперь устарело в логике шаблона
Доминик Ксиген
2

Я использовал этот код в одном из моих модулей.

Измените Custommodule на NameSpace (название вашей компании), измените ReviewRating на (Your Module Name)

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

}

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

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

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

}

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

system configuration labels created here 
inrsaurabh
источник
0

Попробуйте этот код в своем блоке:

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

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

А в вашем шаблоне вы можете позвонить:

$helper = $block->getHelper();
Nero Phung
источник