Как мне получить активные фильтры в методе наблюдателя?


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

Для этого я создал модуль, который регистрируется на событии controller_action_layout_load_before. В моем методе наблюдателя я вызываю

  $appliedFilters = Mage::getSingleton('catalog/layer')->getState()->getFilters();

Но почему-то массив фильтров всегда пуст, что бы я ни пробовал.

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

У кого-нибудь есть идея, почему я не могу получить доступ к этим данным? Я могу получить к нему доступ в файлах шаблонов.

Большое спасибо за вашу помощь!

Config.xml :

<config>
    <modules>
        <My_CustomModule>
            <version>0.0.1</version>
        </My_CustomModule>
    </modules>
    <global>
        <models>
            <my_custommodule>
                <class>My_CustomModule_Model</class>
            </my_custommodule>
        </models>
    </global>
    <frontend>
        <events>
            <controller_action_layout_load_before>
                <observers>
                    <my_custommodule_observer>
                        <type>singleton</type>
                        <class>my_custommodule/observer</class>
                        <method>checkActiveFilters</method>
                    </my_custommodule_observer>
                </observers>
            </controller_action_layout_load_before>
        </events>
    </frontend>
</config>

Observer.php :

class My_CustomModule_Model_Observer 
{
    public function __construct()
    {
    }

    public function checkActiveFilters($observer)
    {
        $layout = $observer->getEvent()->getLayout();
        $appliedFilters = Mage::getSingleton('catalog/layer')->getState()->getFilters();
        foreach($appliedFilters as $filter) {
            Mage::log('Yay! appliedFilters is not empty!');
            $layout->getUpdate()->addHandle('FILTER_'.$filter->getFilter()->getRequestVar());
        }
    }
}
Author: phillensen, 2015-01-22

1 answers

Событие, которое вы наблюдаете (controller_action_layout_load_before), отправляется до инициализации фильтров слоев. Вот почему вы всегда получаете пустой массив при вызове Mage::getSingleton('catalog/layer')->getState()->getFilters();.

На самом деле, я думаю, что в Magento нет подходящего отдельного события для того, что вы пытаетесь сделать (добавить пользовательский дескриптор обновления макета и получить все примененные фильтры).

Я хотел бы предложить альтернативный подход, но не знаю, подойдет ли он вам.

Добавьте следующее обновление макета через файл local.xml:

<catalog_category_layered>
    <reference name="content">
        <block type="foo_bar/category" name="foo.bar.category.cmsblock" before="-"/>
    </reference>
</catalog_category_layered>

И создайте блок, который простирается от класса Mage_Cms_Block_Block.

class Foo_Bar_Block_Category extends Mage_Cms_Block_Block
{
    protected function _toHtml()
    {
        $filters = array();
        $appliedFilters = Mage::getSingleton('catalog/layer')->getState()->getFilters();
        foreach($appliedFilters as $filter) {
            $filters[] = $filter->getFilter()->getRequestVar();
        }

        if (!empty($filters)) {
            $this->setBlockId(implode('_', $filters));
        }

        return parent::_toHtml();
    }
}

Как вы можете видеть, это довольно просто. Строка $this->setBlockId(implode('_', $filters)); задает идентификатор статического блока, и если данный блок существует, он будет загружен на страницы вашей категории.

Надеюсь, это поможет.

 1
Author: Lord Skeletor, 2015-01-22 17:35:27