Szablony Magento 2: Użyć „$ block” lub „$ this”?

27

W Magento 2 $thiszmienna nie odnosi się już do obiektu bloku szablonu. Odnosi się do klasy szablonów

 Magento\Framework\View\TemplateEngine\Php

Jednak ta klasa szablonów ma __callmetodę przekazywania

#File: vendor/magento/framework/View/TemplateEngine/Php.php
public function __call($method, $args)
{
    return call_user_func_array([$this->_currentBlock, $method], $args);
}

Które zapewniają, że wszelkie wywołania metod przechodzą do faktycznego bloku. To wyjaśnia również, dlaczego nie można wywoływać metod chronionych z phtmlszablonów.

Oprócz tego każdy (myślę?) Szablon ma zmienną o nazwie $blockzapełniona, która również odnosi się do obiektu bloku rodzica. Możesz to zobaczyć w szablonie listy Magento

#File: vendor/magento/module-catalog/view/frontend/templates/product/list.phtml
//...
$_productCollection = $block->getLoadedProductCollection();

gdzie $blockużywana jest zmienna, ale nigdy nie została wyraźnie zdefiniowana.

Czy poza różnicami wspomnianymi powyżej jest jakaś różnica między użyciem jednej techniki nad drugą? tj. Czy oba $blocki $this->currentBlockodnoszą się do tego samego obiektu?

Alan Storm
źródło

Odpowiedzi:

32

W pliku szablonu $blocki $this->_currentBlocksą takie same.

Spójrz na rendermetodę w Php.phpsilniku szablonów.
Przed $this->_currentBlock = $block;dołączeniem pliku szablonu dzieje się tak: plik szablonu jest dołączany za pomocą prostego include $fileName;.
Oznacza to, że w szablonie nadal znajdujesz się w Phpsilniku szablonów. Właśnie dlatego $thisdziała i dlatego $blockjest zdefiniowany.

[EDYCJA]
Właśnie dowiedziałem się, że $thisodradza się korzystanie z wewnętrznych szablonów.
Sniffer php ze standardami EcgM2 wyświetla ostrzeżenie podczas korzystania z $thiswewnętrznych szablonów.
Zastąpienie $thisgo $blockpowoduje zniknięcie ostrzeżenia.

Marius
źródło
Więc który jest domyślnym obiektem w pliku .phtml $ block lub $ this.
Manish Goswami
Co masz na myśli domyślnie?
Marius
Jaka jest domyślna zmienna używana w szablonie w celu uzyskania dostępu do klasy renderowania szablonu? Czy jest jakaś różnica między tymi dwoma funkcjami dostępu?
Manish Goswami
Mówi w nowej odpowiedzi. Oba działają, ale zaleca się stosowanie$block
Marius
5

O ile widziałem, oba są prawie takie same w PHP TemplateEngineInterface, ale pamiętaj, że w Magento2 możesz tworzyć niestandardowe silniki szablonów. Nie tak jak Magento1, w którym właśnie miałeś pliki phtml.

Jeśli widzisz TemplateEngineInterface, nie widzisz żadnego odwołania do żadnej metody wywołującej currentBlock, więc myślę, że $this->currentBlockpodejście jest specyficzne dla szablonu PHP.

Ale aby być niezależnym od silnika szablonów, $blockpowinno być właściwe podejście.

Mam na myśli, że z teoretycznego punktu widzenia możesz stworzyć inny silnik oparty na PHP, który nie mógłby polegać na plikach phtml, ale może na innej strukturze PHP.

Zakładam, że $blockjest to „właściwy” sposób dla trybu „phtml”, ponieważ jest jawnie przekazywany jako zmienna kontekstowa.

$blocki $this->currentBlocksą takie same z technicznego punktu widzenia, ale jeśli zostały wyraźnie użyte $block, myślę, że powinniśmy go użyć, z punktu widzenia stylu kodu.

Phoenix128_RiccardoT
źródło
Ale ani $ block nie jest częścią interfejsu. Powiedziałbym, że można bezpiecznie założyć, że ta implementacja jest używana, gdy znajdujesz się w pliku phtml. Inne implementacje nie będą używać pliku phtml.
Fabian Schmengler
Masz rację, nie wyjaśniłem, co mam na myśli. Zmodyfikowałem swój post, dodając więcej szczegółów.
Phoenix128_RiccardoT