12 magento
在看了magento源代码:Mage_Core_Block_Template_Facade之后绊倒了下面的类,我完全不知道这个类的功能.
显然我已经看了它并进行了一些调查,但我对此并不清楚.
任何人都可以解释它在生活中的目的以及它何时可能有用
Dre*_*ter 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>
Run Code Online (Sandbox Code Playgroud)
setDataByKey
<action method="setDataByKey"><key>alias_in_layout</key><value>container1</value></action>
Run Code Online (Sandbox Code Playgroud)
这将设置此块的标识符,该标识符将针对注册表对象进行评估.在options容器的上下文中,此值必须与前面提到的admin区域中的一个下拉值匹配.
setDataByKeyFromRegistry
<action method="setDataByKeyFromRegistry"><key>options_container</key><key_in_registry>product</key_in_registry></action>
Run Code Online (Sandbox Code Playgroud)
告诉块"嘿,当我们需要在注册表中查看产品对象并获取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>
Run Code Online (Sandbox Code Playgroud)
这会在该块实例上调用ifEquals方法,如果返回值为0,则container1将被取消设置并且不会呈现.