Magento: удалить макеты страниц

В magento по умолчанию заданы следующие макеты страниц: empty, one_column, two_columns_left, two_columns_right и three_columns.

Я хотел бы удалить two_columns_left, two_columns_right для моего макета, так как пользователь может выбрать его в разделе CMS и дизайна продукта, но он не работает.

Как мне изменить файл конфигурации XML, чтобы выполнить это?

Я обнаружил, что могу удалить его из app/core/community/Mage/Page/etc/config.xml, но я хотел бы сделать это без изменения какого-либо основного источника, чтобы быть обновляемым.

Ответ 1

Поскольку макеты корней анализируются из конфигурационного XML и из-за того, как объединен конфигурационный XML-код, ваш самый простой вариант (как вы догадались) заключается в редактировании app/core/community/Mage/Page/etc/config.xml.

Если вы действительно обеспокоены не редактированием основных файлов - всегда законным и интересным, вы можете создать модуль, который может обрабатывать директивы remove_layout, которые вы можете добавить в конфигурацию вашего модуля под одним и тем же путем. Класс, который вы переписываете, Mage_Page_Model_Config - см. Методы _appendPageLayouts() и getPageLayouts().

Ответ 2

Я наткнулся на этот вопрос, ища нечто подобное и хочу поделиться своей реализацией. Может быть, это полезно для кого-то там.

Далее будут удалены пустые, 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.