Какова цель Mage_Core_Block_Template_Facade

После того, как вы наткнулись на следующий класс, глядя на исходный код magento: Mage_Core_Block_Template_Facade, я совершенно не знаю, что делает этот класс.

Очевидно, я посмотрел на него и немного исследовал, но мне это просто не ясно.

Может ли кто-нибудь объяснить свою цель в жизни и когда было бы полезно использовать

Ответ 1

Mage_Core_Block_Template_Facade, на самом деле довольно просто понять. Это..

  • Позволяет установить значение на блоке
  • Позволяет макету указывать атрибут/значение из объекта реестра, который должен быть установлен на блоке
  • Позволяет оценить равенство двух значений выше

По сути, это то, что делает блок фасадов отличным от других блоков - взаимодействие с реестром и сравнение раздела/значения реестра с ключом/значением экземпляра блока - все из макета xml.

Есть только один пример блока, который используется в основном коде...

В catalog.xml и product/view.phtml вы увидите контейнер1 и container2 - они оба идентичны, но только один из них отображается в конечном результате.

Так почему они оба там? Это объяснит, как работает Mage_Core_Block_Template_Facade.

Core использует фасадный блок как способ, позволяющий блоку позиции продукта опционировать в product/view.phtml (не внутри макета, а внутри самого шаблона) до настраиваться из области администрирования. Если вы посмотрите на вкладке дизайна во время редактирования продукта, вы должны заметить последний вариант: "Показать параметры продукта в" - два значения выпадающего списка сопоставляют каждый с блоками container1 и container2, которые вы можете видеть в каталогах .xml и view.phtml, В частности, глядя в product/view.phtml, вы должны увидеть контейнер1 и контейнер2, расположенные в разных div.

Макет определяет, какой из этих блоков будет отображаться на основе значения, установленного в разделе "Отобразить параметры продукта в", используя фасадный блок.

Вот как это работает...


Проверьте файл catalog.xml, и вы увидите:

<block type="core/template_facade" name="product.info.container1" as="container1">
    <action method="setDataByKey"><key>alias_in_layout</key><value>container1</value></action>
    <action method="setDataByKeyFromRegistry"><key>options_container</key><key_in_registry>product</key_in_registry></action>
    <action method="append"><block>product.info.options.wrapper</block></action>
    <action method="append"><block>product.info.options.wrapper.bottom</block></action>
</block>
<block type="core/template_facade" name="product.info.container2" as="container2">
    <action method="setDataByKey"><key>alias_in_layout</key><value>container2</value></action>
    <action method="setDataByKeyFromRegistry"><key>options_container</key><key_in_registry>product</key_in_registry></action>
    <action method="append"><block>product.info.options.wrapper</block></action>
    <action method="append"><block>product.info.options.wrapper.bottom</block></action>
</block>
<action method="unsetCallChild"><child>container1</child><call>ifEquals</call><if>0</if><key>alias_in_layout</key><key>options_container</key></action>
<action method="unsetCallChild"><child>container2</child><call>ifEquals</call><if>0</if><key>alias_in_layout</key><key>options_container</key></action>

setDataByKey

<action method="setDataByKey"><key>alias_in_layout</key><value>container1</value></action>

Это устанавливает идентификатор для этого блока, который будет проверен на предмет реестра. В контексте контейнеров опций это значение должно соответствовать одному из выпадающих значений в области администрирования, упомянутой ранее.

setDataByKeyFromRegistry

<action method="setDataByKeyFromRegistry"><key>options_container</key><key_in_registry>product</key_in_registry></action>

Сообщает блок "эй, когда нам нужно посмотреть объект продукта в реестре и получить значение ключа/атрибута options_container". Сродни: Mage::registry('product')->getData('options_container');

Мы ожидаем, что это значение будет container1 или container2 в этом конкретном примере.

ifEquals

Наконец, ifEquals вызывается совместно с unsetCallChild, чтобы удалить контейнер, не выбранный в области администратора.

используя контейнер1 в качестве примера...

<action method="unsetCallChild"><child>container1</child><call>ifEquals</call><if>0</if><key>alias_in_layout</key><key>options_container</key></action>

это вызывает метод ifEquals для экземпляра блока, если возвращаемое значение равно 0, тогда контейнер1 будет отменен и не будет отображаться.