1

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

在这一点上,任何帮助表示赞赏。

谢谢

4

3 回答 3

4

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

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

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

然后,在后端的分类编辑页面中输入“自定义布局更新”:

<update handle="my_awesome_update" /> 
于 2013-01-17T17:07:29.673 回答
1

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

<layout>
    <CATEGORY_4>
         <!-- updates here -->
    </CATEGORY_4>
</layout>
于 2013-01-17T17:10:16.377 回答
0

另一种选择是使用“页面布局”菜单,尽管它需要一些额外的工作。

页面布局示例

首先,创建一个新的扩展来添加布局和观察者(有许多创建扩展的教程;为简洁起见,此处省略)。在您的新扩展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句柄添加到我们的布局中,以便可以引用它,并且您可以对页面进行必要的更改。

使用 alt_category 更新了布局列表

最后,一定要创建page/alt-category.phtml上面提到的模板文件(即 )。

于 2017-03-09T15:54:45.437 回答