Mage_Core_Block_Template Facade的目的是什么?

时间:2012-07-31 17:12:43

标签: magento

在查看magento源代码时遇到下面的类:Mage_Core_Block_Template_Facade,我完全不知道这个类的功能。

显然我已经看了它并进行了一些调查,但这对我来说并不清楚。

任何人都可以解释它在生活中的用途以及何时使用

1 个答案:

答案 0 :(得分:45)

Mage_Core_Block_Template_Facade,实际上很容易理解。它..

  • 允许在块上设置值
  • 允许布局指定要在块上设置的注册表对象的属性/值
  • 允许评估上述两个值的相等性

本质上,这就是使Facade Block与其他块的不同之处 - 与注册表的交互以及将注册表键/值与块实例键/值进行比较 - 所有这些都来自布局xml。

核心代码中只使用了一个块的例子......

查看catalog.xmlproduct/view.phtml,您会看到 container1 container2 块 - 它们都是相同的,但只有一个呈现在最后的输出。

那他们为什么都在那里?这将解释Mage_Core_Block_Template_Facade的工作原理。

Core正在使用facade块作为一种方法,允许在product/view.phtml内(不在布局内,但在模板内部)的产品选项块位置可以在管理区域中进行配置。如果在编辑产品时查看设计选项卡,您应该注意到最后一个选项:“显示产品选项” - 两个下拉值分别与您在catalog.xml和view.phtml中可以看到的container1和container2块相关联。 。具体来说,查看product/view.phtml,您应该看到container1和container2位于不同的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一起调用,以删除未在管理区域中选择的容器。

以container1为例......

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

这会在该块实例上调用ifEquals方法,如果返回值为0,那么container1将被取消设置并且不会被渲染。