当前位置: 首页>>网站问题>>正文


有条件地在布局XML中显示/隐藏块

webfans 网站问题 , , , , 去评论

问题描述

如何在Magento的布局XML中有条件地添加一个块(取决于管理面板中的配置)?

我们可以检查动作上的配置是否为真。在下面的示例中,如果来自管理面板(在System-> Configuration中)的sample/config/show_toplinks配置为true,则模板文件links.phtml将用于呈现Top Links。如果sample/config/show_toplinks为false,则将使用默认模板。

<reference name="top.links">
    <action method="setTemplate" ifconfig="sample/config/show_toplinks">
        <template>page/template/links.phtml</template>
    </action>
</reference>

我在网络的某个地方找到了这个解决方法。我们可以将空模板设置为Top Links的默认模板,如下所示:

<reference name="top.links">
    <action method="setTemplate" ifconfig="sample/config/show_toplinks">
        <template>page/template/links.phtml</template>
    </action>

    <!-- OR set completely empty template -->
    <action method="setTemplate">
        <template>page/template/empty_template_for_links.phtml</template>
    </action>
</reference>

在这种情况下,如果sample/config/show_toplinks为true,则将使用模板links.phtml并显示Top Links。但如果sample/config/show_toplinks为false,则将使用empty_template_for_links.phtml模板,并且该模板完全为空,因此它不会返回任何HTML,并且顶部链接将不可见。

  1. 是否有其他方法可以有条件地显示或隐藏块,具体取决于管理面板中的配置?

  2. 这种解决方法安全吗?

  3. 这会导致任何意外错误吗?

编辑:

基于所有答案,我认为Rick Kuipers的解决方案看起来对我来说最方便。但我有另一个相关的问题:

    <block type="core/template" name="my_block" template="my/block.phtml" />
    <!-- ...add more blocks here -->

    <reference name="footer">
        <action method="append" ifconfig="sample/config/show_toplinks">
            <block>my_block</block>
        </action>
        <!-- ...append more blocks here -->
    </reference>

如果我有这么多块添加(使用append方法和ifconfig),让我们说50,它会影响性能吗?只会显示一些块(这取决于用户在系统中的设置 – >配置),但我需要在有条件地将它们附加到<reference name="footer">...</reference>中之前添加所有这些块。

Magento会立即处理像这样添加的所有块吗?

    <block type="core/template" name="my_block" template="my/block.phtml" />

或者仅在必须最终在模板中显示块时才处理它们?因此Magento必须处理我的所有50个区块,尽管事实上只需要显示其中一些区块吗?

最佳解决方法

我想添加我的选项而不是benmarks的答案。

我的方法是使用追加操作:

    <block type="core/template" name="my_block" template="my/block.phtml" />
    <reference name="head">
        <action method="append" ifconfig="myblock/general/enabled"><block>my_block</block></action>
    </reference>

次佳解决方法

通过使用_template属性来隐藏输出是一种新颖的方法。我宁愿在配置选项上反转值,以便Yes = 0(可能是自定义源模型)并在父头块上调用unsetChild

<reference name="head">
    <action method="unsetChild" ifconfig="sample/config/show_toplinks">
       <child>topLinks</child>
    </action>
</reference>

第三种解决方法

至于你的问题:

  1. 我的方法只是扩展到你的方法

  2. 我不明白为什么不会这样

  3. 同样,你的代码非常安全,不会导致异常的方法(getStoreConfig只会返回一个假值,因此不会添加条件句柄)但如果空模板文件不存在,你会得到一个异常。使用self-closing标记传递空值(例如<template />)

如果我正在开发这个,我会扩展你的解决方案,包括一个观察器,它检查配置并有条件地为你的布局添加一个句柄。然后,在布局文件中,您可以在不同的句柄内设置两个操作 – defaultshow_toplinks

<config>
  <global>
    <!-- stuff -->
    <events>
      <controller_action_layout_load_before>
        <observers>
          <my_module_add_handle>
            <class>my_module/Observer</class>
            <method>addHandle</method>
          </my_module_add_handle>
        </observers>
      </controller_action_layout_load_before>
    </events>
    <!-- other stuff -->
  </global>
</config>

然后在你的Observer模型中……

public function addHandle(Varien_Event_Observer $observer)
{
    if (Mage::getStoreConfig('sample/config/toplinks') {
        $observer->getEvent()->getLayout()->getUpdate()
            ->addHandle('show_toplinks');
    }
}

Aaaand终于在你的布局中:

<default>
  <reference name="top.links">
     <!-- yup -->
  </reference>
</default>

<show_toplinks>
  <reference name="top.links">
     <!-- another yup -->
  </reference>
</show_toplinks>

参考资料

本文由朵颐IT整理自网络, 文章地址: https://duoyit.com/article/2083.html,转载请务必附带本地址声明。