Ответ 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 будет отменен и не будет отображаться.