макет - вызов блока левого столбца в главном столбце (в шаблоне 1column.phtml)


У меня есть страница списка категорий, которая использует шаблон 1column.phtml. Однако, когда пользователь переходит в категорию, в которой нет подкатегорий, и отображаются только ее товары, я хотел бы вызвать левый столбец. Проблема в том, что я все еще использую шаблон 1column для этой ситуации.

Как я могу вызвать левый столбец?

Author: YWSW, 2013-02-26

2 answers

Если я правильно помню, то CategoryController добавляет дескриптор макета для категорий без подкатегорий [ссылка], что означает, что это можно сделать с помощью XML макета, например, в local.xml файл макета:

<?xml version="1.0" encoding="UTF-8"?>
<layout>
    <catalog_category_layered_nochildren>
        <action method="setTemplate" block="root">
            <tpl>page/2columns-left.phtml</tpl>
        </action>
    </catalog_category_layered_nochildren>
</layout>
 2
Author: benmarks, 2013-02-26 22:06:58

Для одной категории:

Вы можете изменить макет для одной категории. Для этого перейдите в категорию в бэкэнде, откройте вкладку Custom Layout и выберите "2 столбца с левой полосой" в раскрывающемся списке Page Layout.

Реализация наблюдателя

Я думаю, что прослушивание core_block_abstract_to_html_before может быть хорошей идеей. Проверьте, является ли блок root. Если это категория, то категорию можно найти в Mage::registry('current_category');. Затем вы проверяете наличие hasChildren() и, если оно есть, устанавливаете шаблон для корневого блок.

Я не уверен, достаточно ли этого. Возможно, вам тоже нужно изменить дескриптор обновления.

Реализация

Observer.php

public function coreBlockAbstractToHtmlBefore(Varien_Event_Observer $observer)
{
    /* @var $block Mage_Core_Block_Template */
    $block = $observer->getBlock();
    if($block->getNameInLayout() == 'root') {
        /* lvar $category Mage_Catalog_Model_Category */
        if(($category = Mage::registry('current_category')) && $category instanceof Mage_Catalog_Model_Category) {
            if(!$category->hasChildren()) {
                $block->setTemplate('page/2columns-left.phtml');
            }
        }
    }
}

Config.xml

<config>
    <frontend>
        <events>
            <core_block_abstract_to_html_before>
                <observers>
                    <namespace_mymodule>
                        <type>model</type>
                        <class>Namespace_MyModule_Model_Observer</class>
                        <method>coreBlockAbstractToHtmlBefore</method>
                    </namespace_mymodule>
                </observers>
            </core_block_abstract_to_html_before>
        </events>
    </frontend>
</config>
 2
Author: Fabian Blechschmidt, 2013-02-26 22:02:22