在查看magento源代码时遇到下面的类:Mage_Core_Block_Template_Facade,我完全不知道这个类的功能。
显然我已经看了它并进行了一些调查,但这对我来说并不清楚。
任何人都可以解释它在生活中的用途以及何时使用
答案 0 :(得分:45)
Mage_Core_Block_Template_Facade,实际上很容易理解。它..
本质上,这就是使Facade Block与其他块的不同之处 - 与注册表的交互以及将注册表键/值与块实例键/值进行比较 - 所有这些都来自布局xml。
核心代码中只使用了一个块的例子......
查看catalog.xml和product/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将被取消设置并且不会被渲染。