Многоуровневые навигационные фильтры только для сгруппированных продуктов
Хорошо, У меня есть категория, заполненная только сгруппированными продуктами, и я хочу, чтобы они были отфильтрованы по их связанным (и простым) атрибутам продуктов.
До сих пор я использовал грязный обходной путь: я оставил только один простой продукт, который был виден в каталоге, но скрыт html и css.
Таким образом, появлялись атрибуты, и я мог бы использовать их также для сгруппированных продуктов, но я заметил, что многоуровневая навигация исчезает, если это скрытое простое продукт не отображается, когда я фильтрую по цене.
Есть идеи или обходные пути?
Спасибо.
1 answers
Вам нужно переписать, как Mage_Catalog_Model_Layer
создает коллекцию атрибутов, используя наборы атрибутов текущей коллекции продуктов:
protected function _getSetIds()
{
$key = $this->getStateKey().'_SET_IDS';
$setIds = $this->getAggregator()->getCacheData($key);
if ($setIds === null) {
$setIds = $this->getProductCollection()->getSetIds();
$this->getAggregator()->saveCacheData($setIds, $key, $this->getStateTags());
}
return $setIds;
}
В этом контексте вам потребуется проверить коллекцию продуктов на наличие сгруппированных продуктов и вернуть идентификаторы набора атрибутов сгруппированных дочерних элементов. Затем они оцениваются в getFilterableAttributes()
:
public function getFilterableAttributes()
{
$setIds = $this->_getSetIds();
if (!$setIds) {
return array();
}
/** @var $collection Mage_Catalog_Model_Resource_Product_Attribute_Collection */
$collection = Mage::getResourceModel('catalog/product_attribute_collection');
$collection
->setItemObjectClass('catalog/resource_eav_attribute')
->setAttributeSetFilter($setIds)
->addStoreLabel(Mage::app()->getStore()->getId())
->setOrder('position', 'ASC');
$collection = $this->_prepareAttributeCollection($collection);
$collection->load();
return $collection;
}
Скорее всего, вам придется иметь дело с ключом кэша. Я бы разрабатывал с отключенным кэшированием блоков, а затем тщательно тестировал с включенным.