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


32

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

我们可以检查config是否为true。在下面的示例中,如果sample/config/show_toplinks管理面板中的config(在“系统”->“配置”中)为true,则将使用模板文件links.phtml来呈现“顶部链接”。如果sample/config/show_toplinksfalse,则将使用默认模板。

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

我在网络中的某个地方找到了解决方法。我们可以将一个空模板设置为“顶部链接”的默认模板,如下所示:

<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_toplinkstrue,则将使用模板links.phtml并显示“顶部链接”。但是如果sample/config/show_toplinksfalse,则将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>

如果我有很多要添加的块(使用appendmethod和ifconfig),比如说50, 这会影响性能吗?仅会真正显示某些块(这取决于用户在System-> Config中的设置),但是我需要添加所有这些块,然后才能有条件地将其添加到内<reference name="footer">...</reference>

Magento是否立即处理所有这样添加的块?

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

还是仅在必须最终将其显示在模板中时才处理块?因此,尽管事实上只需要显示其中的某些块,但Magento是否必须处理我的全部50个块?

Answers:


28

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

我的方法是使用append操作:

    <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>

1
这可能在某些情况下适用(并且是我的最初想法),但是在这种情况下,默认情况下会从核心调用有问题的块(top.links)。
13年

@benmarks啊,是为了使它模块化?那么在这种情况下,您的方法将是最佳方法。
里克·库珀斯

1
@RickKuipers 1.您能否阐明此“附加”方法的工作原理?它会my_block在“ head”内移动,还是会在“ head”内添加该块的另一个副本,并且第一个副本仍将显示在其他位置(因为该块已经在之前添加了<reference name="head">)?2.我可以在哪个PHP文件中找到所有这些布局方法,例如“ append”或“ unsetChild”?
zitix

1
@zitix如果块的定义在<reference name="root">(或任何其他非core/text_list块)中,则除非被调用,否则它将不会自动显示getChildHtml()。它不会移动该块,它将是一个副本,因此您可以多次附加它。<action>在块中调用一个方法。因此,这取决于我们在讨论哪个块。您可以在中找到一些标准的Mage_Core_Block_Abstract。但是该块拥有的任何方法都可以使用调用<action>
里克·库珀斯

@RickKuipers这种方法如何影响性能?(我编辑了我的问题)<block type="core/template" name="my_block" template="my/block.phtml" />即使最终不会显示,也需要添加块。
zitix

15

通过使用该_template属性隐藏输出是一种新颖的方法。我希望反转config选项上的值,以便Yes = 0(也许是自定义源模型)并unsetChild在父head块上调用:

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

1
谢谢,这非常好,但是它需要反转系统->配置中的所有配置字段。我需要更改:更改Top Links: [enable/disable]Hide Top Links: [Yes/No]
zitix

1
系统配置的源模型非常简单,并且此路径比通过观察器添加自定义布局更新句柄要简单得多。
benmarks

12

关于您的问题:

  1. 我的方法只是扩展您的方法

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

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

如果我正在开发此程序,我将扩展您的解决方案以包括一个观察者,该观察者检查配置并有条件地向您的布局添加一个句柄。然后,在布局文件中,您可以在不同的句柄中设置两个动作,default然后show_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');
    }
}

最后,在您的布局中:

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

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

谢谢,我不知道这一点,以后一定会使用此方法。但是对于我现在需要做的事情,它需要太多额外的代码。
zitix
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.