magento:删除页面布局

时间:2011-11-22 12:40:06

标签: magento

在magento中,默认情况下会定义以下页面布局:emptyone_columntwo_columns_lefttwo_columns_rightthree_columns

我想删除two_columns_lefttwo_columns_right作为我的布局,因为用户可以在CMS和产品设计部分选择它,但它不起作用。

如何更改XML配置文件以实现此目的?

我发现我可以将其从app/core/community/Mage/Page/etc/config.xml中移除,但我想在不更改任何核心来源的情况下执行此操作,以便更新。

2 个答案:

答案 0 :(得分:8)

我偶然发现了这个问题,寻找类似的东西并想分享我的实现。也许对那里的人有帮助。

以下内容将从可用模板列表中删除空的2_columns_right和3_columns布局。只需更改下面remove_layouts中的config.xml指令,即可删除要移除的内容。

我创建了一个模块(实际上是我为magento构建的第一个模块)并将以下内容放在文件app/etc/modules/Labor_Templates.xml中:

<?xml version="1.0"?>
<!--
/**
 * This module changes the available templates. Only "1 column" and
 * "2 column-left" will be available.
 */
-->
<config>
    <modules>
        <Labor_Templates>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_Page />
            </depends>
        </Labor_Templates>
    </modules>
</config>

接下来,我们需要在config.xml中找到/app/code/local/Labor/Templates/etc

<?xml version="1.0" encoding="UTF-8"?>
<!--
/**
 * Overrides the config to only allow "1 column" and "2 column left" layouts.
 */
-->
<config>
    <modules>
        <Labor_Templates>
            <version>1.0.0</version>
        </Labor_Templates>
    </modules>
    <global>
        <models>
            <template>
                <class>Labor_Templates_Model</class>
            </template>
            <page>
                <rewrite>
                    <config>Labor_Templates_Model_Config</config>
                </rewrite>
            </page>
        </models>
        <page>
            <remove_layouts>
                <layouts>empty,two_columns_right,three_columns</layouts>
            </remove_layouts>
        </page>   
    </global>
</config>

注意,我已经添加了remove_layouts指令。最后,我们编写了自己的Labor_Templates_Model_Config类:

<?php
/**
 * Overrides the Overrides the core module Mage_Page_Model_Config in order to
 * remove unused template layouts. This is done by handling remove_layout
 * directives.
 */
class Labor_Templates_Model_Config extends Mage_Page_Model_Config {

    const XML_PATH_PAGE_REMOVE_LAYOUTS = 'global/page/remove_layouts';

    /**
     * Initialize page layouts list
     *
     * @return Labor_Templates_Model_Config
     */
    protected function _initPageLayouts()
    {
        parent::_initPageLayouts();
        return $this->_removePageLayouts(self::XML_PATH_PAGE_REMOVE_LAYOUTS);
    }

    /**
     * Removes page layouts found in the remove_layouts XML directive
     * 
     * @return Labor_Templates_Model_Config 
     */
    protected function _removePageLayouts($xmlPath)
    {
        if (!Mage::getConfig()->getNode($xmlPath) || !is_array($this->_pageLayouts)) {
            return $this;
        }
        foreach (explode(',', (string)Mage::getConfig()->getNode($xmlPath)->children()->layouts) as $toRemove) {
            unset($this->_pageLayouts[$toRemove]);
        }
        return $this;
    }

}

使用Magento 1.7.0进行工作和测试。

答案 1 :(得分:3)

因为根布局是从配置XML解析的,并且由于配置XML合并在一起的方式,您最简单的选择(如您所推测的)是编辑app/core/community/Mage/Page/etc/config.xml

如果你真的担心不编辑核心文件 - 总是合法的&amp;有趣的尝试 - 您可以创建一个可以处理remove_layout指令的模块,您可以在同一个xpath下的模块配置中添加该指令。您要重写的课程是Mage_Page_Model_Config - 请参阅_appendPageLayouts()getPageLayouts()方法。