在布局XML中定位多个布局句柄


22

我在路径/custommodule/customer/info上访问了一个自定义控制器,该路径将2columns-left.phtml模板加载到root节点上,如下所示:

<custommodule_customer_info>
    <reference name="root">
        <action method="setTemplate"><template>page/2columns-left.phtml</template></action>
    </reference>
</custommodule_customer_info>

我想做的是为未登录的客户更新根模板,例如:

<customer_logged_out>
    <custommodule_customer_info>
        <reference name="root">
            <action method="setTemplate"><template>page/1column.phtml</template></action>
        </reference>
    </custommodule_customer_info>
</customer_logged_out>

我知道我不能以此方式定位多个布局句柄,但目的应该明确;当客户未登录时,更新此布局句柄的根模板。

我以为可以通过以下方式定位控制器的手柄:

<customer_logged_out>
    <reference name="custommodule_customer_info">
        <reference name="root">
            <action method="setTemplate"><template>page/1column.phtml</template></action>
        </reference>
    </reference>
</customer_logged_out>

确实确实使用1column.phtml模板更新了根模板,但是这样做是针对似乎所有页面,而不只是我reference节点中目标页面。

我已经尝试了此布局更新的多个排列,但是似乎都没有用。如何在使用布局手柄的同时定位这个customer_logged_out布局手柄?

-编辑-要清楚,这实际上是第三方模块。

Answers:


18

由于您使用的是自己的控制器,因此无需仅使用默认手柄。根据登录状态,您可以在infoAction方法中添加

 $this->getLayout()->getUpdate()->addHandle('mymodule_customer_info_logged_in');

要么

 $this->getLayout()->getUpdate()->addHandle('mymodule_customer_info_logged_out');

然后在您的layout.xml文件中使用

<mymodule_customer_info_logged_in>

<mymodule_customer_info_logged_out>

-在下面进行编辑后添加-

看到您不想编辑控制器(因为它是第三方扩展),我将创建一个单独的扩展,仅观察controller_action_layout_load_before

    $update = $observer->getEvent()->getLayout()->getUpdate();
    $handles = $update->getHandles();

    if (in_array('custommodule_customer_info', $handles)) {

        //code to add the custom handles based on login
    }

时髦 这不是理想的,但是是相对干净的解决方案。正如我在下面的其他评论中提到的那样,我宁愿不必修改第三方模块,但看起来这里没有太多选择。感到羞耻,因为customer_logged_in/out手柄可能是如此强大,但是由于这一限制,它们被束之高阁。
pspahn

14

艾伦·斯托姆(Alan Storm)回答了类似这样的话:

/programming//a/5601579/1157493

您可以使用助手来检查自定义是否已登录。

<action method="setTemplate">
    <template helper="mymodule/myhelper/switchTemplateIf"/>
</action>

它将调用Mage::helper('mymodule/myhelper')->switchTemplateIf(); 在该帮助器中,您可以决定切换模板或仅保留模板。

我相信它会将模板设置return为该函数中的任何内容。

它看起来像这样:

public function switchTemplateIf() {
    if (Mage::helper('customer')->isLoggedIn()) {
        return 'page/1column.phtml';
    } else {
        return 'page/2column-right.phtml';
    }
}

未经测试


我确实也有这个想法,但是我希望仅依靠模块的布局XML来执行此操作,而不必依赖模块中的其他类-“如果可以用XML完成,请这样做在XML中,如果没有必要,请勿创建其他模块资源”。
pspahn

@pspahn当然,目标是尝试使用Magento提供的XML布局系统来做到这一点,不幸的是它确实有其局限性,我相信这是其中之一。尽管我仍然认为,尽管有额外的模块资源,但这是一个完美可行的解决方案。
里克·库珀斯

@pspahn Fooman有一个很好的替代解决方案,我会推荐给我。它需要更少的编码!
里克·库珀斯

在这种情况下,我实际上是在处理第三方模块。我宁愿不必编辑他们的模块(因为更新可能会破坏它),而宁愿不要将其放在单独的模块的帮助器类中(因为这样会使它们的模块和模块紧密地联系在一起)。
pspahn

6

我最近需要这种功能,并且为现有布局手柄的所有不同组合添加越来越多的布局手柄变得越来越困难,因此我创建了一个magento扩展以添加直接从布局xml定位多个布局手柄的功能。

这是扩展名的链接-https ://github.com/mridul89/MultipleHandles.git

您可以这样使用它-

<customer_logged_out ifhandle="custommodule_customer_info">
    <reference name="root">
        <action method="setTemplate"><template>page/1column.phtml</template></action>
    </reference>
</customer_logged_out>

customer_logged_out如果custommodule_customer_info布局手柄也存在,这将告诉magento仅使用此特定的布局手柄。

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.