макет - вызов блока левого столбца в главном столбце (в шаблоне 1column.phtml)
У меня есть страница списка категорий, которая использует шаблон 1column.phtml. Однако, когда пользователь переходит в категорию, в которой нет подкатегорий, и отображаются только ее товары, я хотел бы вызвать левый столбец. Проблема в том, что я все еще использую шаблон 1column для этой ситуации.
Как я могу вызвать левый столбец?
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>
Для одной категории:
Вы можете изменить макет для одной категории. Для этого перейдите в категорию в бэкэнде, откройте вкладку 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>