Jak wywołać metodę pomocniczą w pliku .phtml

16

Próbuję opracować coś w Magento 2. Ale nie znalazłem sposobu na wywołanie metody Helper w pliku szablonu (.phtml).

Chcę zastąpić poniższy kod:

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

Jeśli ktoś wie, pomóż mi.

Gaurav Agrawal
źródło
próbowałeś mojej odpowiedzi?
chirag,
Hej, powinieneś zaakceptować odpowiedź Mariusa poniżej.
seanbreeden
1
@seanbreeden Przepraszam, głosowałem, ale zapomniałem zaakceptować.
Gaurav Agrawal

Odpowiedzi:

30

Nie należy używać połączeń pomocniczych bezpośrednio w szablonie.
Niech instancja pomocnika zostanie podana jako zależność od bloku, który renderuje szablon, i utwórz w swoim bloku metodę, która wywołuje pomocnika i wywołuje tę metodę w szablonie.

Niech twój blok jest zdefiniowany w ten sposób

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

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

Następnie możesz zadzwonić w swoim szablonie $block->doSomething()

Marius
źródło
2
Czy możesz wyjaśnić, jaki byłby problem, gdybyśmy nazywali pomocnika bezpośrednio w szablonie bez definiowania zależności
Prashant Valanda,
to nie jest dobra praktyka. Wprowadza niezadeklarowaną zależność. Jeśli chcesz to zrobić poprawnie, powinieneś wywoływać w szablonie tylko metody z bloku, który je renderuje.
Marius
2
Główny programista magento również zadzwonił do pomocnika bezpośrednio w pliku phtml
Prashant Valanda,
2
To nie poprawia sytuacji. Być może ta część nie została jeszcze refaktoryzowana
Marius
1
Krótka odpowiedź: tak. Długa odpowiedź, nie powinieneś mieć pomocnika z 10 metodami i wszystkie są potrzebne do tego samego bloku. Jeśli tak się stanie, być może powinieneś pomyśleć o refaktoryzacji kodu do mniejszych bloków i szablonów.
Marius
24

Musisz użyć w ten sposób:

$helper = $this->helper('{Vendor}\{Module}\Helper\Data');
$values = $helper->YourHelperMethod();
chirag
źródło
Tak, to nie działa. Użyłem również tego samego kodu wcześniej
Gaurav Agrawal
$ to jest już przestarzałe w logice szablonów
Dominic Xigen
7

Musisz wpisać całą nazwę klasy w pomocniku, jak poniżej:

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

Możesz go użyć w pliku phtml, używając powyższego kodu

Prashant Valanda
źródło
jak to będzie działać na m2?
jafar pinjar
$ to jest już przestarzałe w logice szablonów
Dominic Xigen
2

Użyłem tego kodu w jednym z moich modułów.

Zmień Custommodule na NameSpace (nazwa firmy) zmień ReviewOdniesienie do (nazwa modułu)

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

}

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

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

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

}

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

system configuration labels created here 
inrsaurabh
źródło
0

Wypróbuj ten kod w swoim bloku:

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

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

W swoim szablonie możesz zadzwonić:

$helper = $block->getHelper();
Nero Phung
źródło