Як викликати хелперний метод у файлі .phtml


16

Намагаюся розробити щось в magento 2. Але я не знайшов, як викликати метод Helper у файлі шаблону (.phtml).

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

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

Якщо хтось знає, будь ласка, допоможіть мені.


ви спробували мою відповідь?
чираг

Гей, ви повинні прийняти відповідь Маріуса нижче.
seanbreeden

1
@seanbreeden Вибачте, я проголосував, але забув прийняти.
Gaurav Agrawal

Відповіді:


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
Розробник Core magento також назвав помічника безпосередньо у файлі phtml
Prashant Valanda

2
Це не робить це правильним. Можливо, ця частина ще не відремонтована
Маріус

1
Коротка відповідь: так. Довга відповідь, у вас не повинно бути помічника з 10 методів, і всі вони потрібні для одного блоку. Якщо це трапиться, можливо, вам варто подумати про рефакторинг коду на менші блоки та шаблони.
Маріус

24

Ви повинні використовувати так:

$helper = $this->helper('{Vendor}\{Module}\Helper\Data');
$values = $helper->YourHelperMethod();

Так, це не працює. Я також раніше використовував той самий код
Gaurav Agrawal

$ це тепер застаріло в логіці шаблону
Домінік Сіген

7

Вам потрібно написати ім'я цілого класу в помічнику, як показано нижче:

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

Ви можете використовувати його у файлі phtml, використовуючи вказаний вище код


як це буде працювати на м2?
jafar pinjar

$ це тепер застаріло в логіці шаблону
Домінік Сіген

2

Я використовував цей код в одному зі своїх модулів.

Змініть Custommodule на NameSpace (назва вашої компанії), змініть ReviewRating на (назва вашого модуля)

В /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 

0

Спробуйте цей код у своєму блоці:

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

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

І у вашому шаблоні ви можете зателефонувати:

$helper = $block->getHelper();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.