12

在查看 magento 源代码时偶然发现以下类后:Mage_Core_Block_Template_Facade,我完全不知道这个类是做什么的。

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

谁能解释它在生活中的目的以及何时使用它可能有用

4

1 回答 1

46

Mage_Core_Block_Template_Facade,其实很容易理解。它..

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

从本质上讲,这就是外观块与其他块不同的原因——与注册表的交互以及将注册表键/值与块实例键/值进行比较——所有这些都来自布局 xml。

在核心代码中使用的块只有一个示例......

查看catalog.xmlproduct/view.phtml,您会看到container1container2块——它们都是相同的,但最终输出中只呈现了一个。

那为什么他们俩都在那里?这将解释 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 将被取消设置且不呈现。

于 2012-07-31T22:33:50.997 回答