Что делает макетный предикат «reference»?

[10 ноября 2016 г.]    Российская сборка Magento 2.49.12
Magento 2: модули и услуги
#1 Lindar
  • Группа: Пользователь
  • Сообщений: 2
  • Регистрация: 19.01.2012

19.01.2012 11:58

Может кто подскажет в каком случае
<reference name="content">...</reference>
переписывает блок content, а в каком его дополняет?

#2 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8886
  • Регистрация: 20.02.2010

19.01.2012 12:02

reference не переписывает и не дополняет блок.
Если вы откроете англо-русский словарь, то узнаете, что «reference» — это «ссылка».
Предикат reference ссылается на блок.
Операции же над блоком определяются внутри данного предиката.

#3 Lindar
  • Группа: Пользователь
  • Сообщений: 2
  • Регистрация: 19.01.2012

19.01.2012 12:19

в статье нашёл такой пример

<layout version="0.1.0">
<default>
<reference name="root">
<block type="page/html" name="root" output="toHtml" template="../../../../../code/local/Magentotutorial/Helloworld/simple_page.phtml" />
</reference>
</default>
</layout>

и далее "The Block named root has been replaced with our Block, which points at a different phtml Template file."

как тогда это понимать?

#4 Дмитрий Федюк
  • Администратор
  • Иконка
  • Группа: Администратор
  • Сообщений: 8886
  • Регистрация: 20.02.2010

19.01.2012 12:26

В данном примере макетный предикат reference ссылается на присутствующий в системе блок с именем root.
Далее внутри предиката расположено правило block, которое, в общем случае, добавляет новый блок внутрь указанного в reference блока.
Так как внутреннему блоку присвоено то же самое имя, что и родительскому блоку, то система перетирает родительский блок внутренним.
В таком ограниченном контексте родительский блок действительно переписывается.
Но это лишь одно применение блока reference из многих.
И пример этот — неряшлив, хотя и копируется бездумными блоггерами из статьи в статьи.
Вместо вместо уничтожения блока root только ради смены шаблона разумнее, понятнее и экономичнее по ресурсам использовать метод setTemplate внутри предиката reference.

Поделиться темой: