在查看 magento 源代码时偶然发现以下类后:Mage_Core_Block_Template_Facade,我完全不知道这个类是做什么的。
显然我已经看过它并进行了一些调查,但我并不清楚。
谁能解释它在生活中的目的以及何时使用它可能有用
在查看 magento 源代码时偶然发现以下类后:Mage_Core_Block_Template_Facade,我完全不知道这个类是做什么的。
显然我已经看过它并进行了一些调查,但我并不清楚。
谁能解释它在生活中的目的以及何时使用它可能有用
Mage_Core_Block_Template_Facade,其实很容易理解。它..
从本质上讲,这就是外观块与其他块不同的原因——与注册表的交互以及将注册表键/值与块实例键/值进行比较——所有这些都来自布局 xml。
在核心代码中使用的块只有一个示例......
查看catalog.xml和product/view.phtml,您会看到container1和container2块——它们都是相同的,但最终输出中只呈现了一个。
那为什么他们俩都在那里?这将解释 Mage_Core_Block_Template_Facade 的工作原理。
Core 使用外观块作为一种方法,以允许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。
如果等于
最后,结合 unsetCallChild 调用 ifEquals 来移除管理区域中未选中的容器。
以 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 将被取消设置且不呈现。