Шаблони Magento 2: Використовувати `$ block` або` $ this`?


27

У Magento 2 $thisзмінна вже не відповідає об'єкту блоку шаблону. Він відноситься до класу шаблонів

 Magento\Framework\View\TemplateEngine\Php

Однак для цього класу шаблонів є __callметод проходження

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

Які забезпечують, що будь-які виклики методу переходять до фактичного блоку. Це також пояснює, чому ви не можете викликати захищені методи з phtmlшаблонів.

На додаток до цього, кожен (я думаю?) Шаблон має змінну з назвою $blockнаселених, яка також відноситься до батьківського об'єкта. Ви можете бачити це у використанні в шаблоні списку Magento

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

де використовується $blockзмінна, але ніколи прямо не визначена.

Крім відмінностей, згаданих вище, чи є різниця між використанням однієї техніки над іншою? тобто чи обидва $blockі $this->currentBlockпосилаються на один і той же об’єкт?

Відповіді:


32

У файлі шаблону $blockі $this->_currentBlockте саме.

Погляньте на renderметод у механізмі Php.phpшаблонів.
Перш ніж включати файл шаблону, це відбувається: $this->_currentBlock = $block;тоді файл шаблону включається за допомогою простого include $fileName;.
Це означає, що всередині шаблону ви все ще знаходитесь всередині Phpдвигуна шаблону. Ось чому $thisпрацює, і саме тому $blockвизначено.

[EDIT]
Я щойно з’ясував, що використання $thisвнутрішніх шаблонів не рекомендує.
Php sniffer зі стандартами EcgM2 показує попередження при використанні $thisвсередині шаблонів.
Заміна $thisз $blockробить попередження піти.


Отже, який є об'єктом за замовчуванням у .phtml-файлі $ block або $ this.
Manish Goswami

Що ти маєш на увазі за замовчуванням?
Маріус

Яка змінна за замовчуванням використовується в шаблоні для доступу до класу візуалізації шаблону? Чи є якась різниця між цими двома у функції доступу?
Manish Goswami

Це написано у відповіді. Обидва працюють, але рекомендується використовувати$block
Маріус

5

Наскільки я бачив, вони обидва майже однакові в PHP TemplateEngineInterface, але пам’ятайте, що в Magento2 ви можете створювати власні двигуни шаблонів. Не так, як Magento1, у якому у вас просто були файли phtml.

Якщо ви бачите, TemplateEngineInterfaceви не бачите жодної посилання на будь-який метод виклику currentBlock, тому я думаю, що $this->currentBlockпідхід є специфічним шаблоном PHP.

Але для того, щоб бути незалежним від двигуна шаблону, $blockповинен бути правильний підхід.

Я маю на увазі, що з теоретичної точки зору ви можете створити інший движок на основі PHP, який не може покладатися на файли phtml, але, можливо, на якусь іншу структуру PHP.

Я вважаю $block, що "правильний" спосіб для режиму "phtml", оскільки він прямо передається як змінна контекст.

$blockі $this->currentBlockті ж з технічної точки зору, але якщо вони явно використовуються, $blockя думаю, що ми повинні використати це з точки зору стилізації коду.


Але і $ block не є частиною інтерфейсу. Я б сказав, що можна припустити, що ця програма використовується, коли ви знаходитесь у файлі phtml. Інші реалізації не використовуватимуть файл phtml.
Фабіан Шменглер

Ви маєте рацію, мені не було зрозуміло у своїй відповіді пояснити, що я маю на увазі. Я змінив свою публікацію більш детально.
Phoenix128_RiccardoT
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.