Как мне получить активные фильтры в методе наблюдателя?
Я хочу проверить применяемые в настоящее время многоуровневые навигационные фильтры с помощью наблюдателя. При выборе определенных значений фильтра следует добавить дополнительный дескриптор макета, который добавляет статический блок к содержимому.
Для этого я создал модуль, который регистрируется на событии 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());
}
}
}
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));
задает идентификатор статического блока, и если данный блок существует, он будет загружен на страницы вашей категории.
Надеюсь, это поможет.