Magento - 为某些类别设置替代布局

时间:2013-01-17 16:58:09

标签: xml magento templates layout categories

我有许多类别,我需要使用与标准类别布局不同的布局。在不必在管理区域的“自定义设计”选项卡中重复XML代码的情况下,最好的方法是什么?我需要做的每个类别都是“品牌”,所以我想这可以作为magento识别需要使用替代模板的常用方式吗?

此时感谢任何帮助。

由于

3 个答案:

答案 0 :(得分:4)

您可以定义自定义布局句柄并在特定类别中调用它。

首先,定义布局句柄(例如在主题的local.xml中):

<layout>
    <my_awesome_update>
         <block ..../>
    </my_awesome_update>
</layout>

然后,在后端的类别编辑页面中,只需进入“自定义布局更新”:

<update handle="my_awesome_update" /> 

答案 1 :(得分:1)

如果您知道类别的ID,您可以在local.xml布局文件中定义所有更改,如下所示:

<layout>
    <CATEGORY_4>
         <!-- updates here -->
    </CATEGORY_4>
</layout>

答案 2 :(得分:0)

另一种选择是使用&#34; Page Layout&#34;菜单,虽然它需要一些额外的工作。

Page Layout Example

首先,创建一个新的扩展来添加布局和观察者(有许多教程用于创建扩展;为简洁起见,这里省略了)。在新扩展程序的config.xml文件中(我使用Bats_Coreextend作为参考):

<?xml version="1.0" encoding="UTF-8"?>
    <config>
        <modules>
            <Bats_Coreextend>
                <version>0.1.0</version>
            </Bats_Coreextend>
        </modules>
        <global>
            <events>
                <controller_action_layout_load_before>
                    <observers>
                        <addCategoryLayoutHandle>
                            <class>Bats_Coreextend_Model_Observer</class>
                            <method>addCategoryLayoutHandle</method>
                        </addCategoryLayoutHandle>
                    </observers>
                </controller_action_layout_load_before>
            </events>
            <page>
                <layouts>
                    <alt_category module="page" translate="label">
                        <label>Alt. Category (Desc. at bottom)</label>
                        <template>page/alt-category.phtml</template>
                        <layout_handle>page_alt_category</layout_handle>
                    </alt_category>
                </layouts>
            </page>
        </global>
    </config>

这将创建新的布局,并允许您在菜单中引用它,如上图所示。我们需要观察者,因为不幸的是,即使设置了页面布局(如上所示),您也无法引用XML中的句柄(例如catalog.xml)

要解决此问题,请创建观察者函数:

创建app/code/local/Bats/Coreextend/Model/Observer.php

在该文件中:

<?php

    class Bats_Coreextend_Model_Observer extends Mage_Core_Model_Observer {
        public function addCategoryLayoutHandle(Varien_Event_Observer $observer)
        {
            /** @var Mage_Catalog_Model_Category|null $category */
            $category = Mage::registry('current_category');

            if(!($category instanceof Mage_Catalog_Model_Category)) {
                return;
            }

            if($category->getPageLayout()) {



                /** @var Mage_Core_Model_Layout_Update $update */
                $update = $observer->getEvent()->getLayout()->getUpdate();

                /** NOTE: May want to add an additional 
                  * conditional here as this will also cause the
                  * layout handle to appear on product pages that
                  * are within the category with the alternative 
                  * layout.
                  */

                $update->addHandle($category->getPageLayout());

            }
        }
    }

这会将alt_category句柄添加到我们的布局中,以便可以引用它,并且您可以对页面进行必要的更改。

Updated Layout list with alt_category

最后,请务必如上所述创建模板文件(即page/alt-category.phtml)。