Слоистые навигационные фильтры только для сгруппированных продуктов

magento.stackexchange https://magento.stackexchange.com/questions/4743

  •  16-10-2019
  •  | 
  •  

Вопрос

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

До сих пор я использовал грязный обходной путь: я оставил только один простой продукт для каталога, но скрытый HTML & CSS.
Таким образом, появлялись атрибуты, и я мог бы использовать их для сгруппированных продуктов, но я заметил, что многослойная навигация исчезает, если этот скрытый простой продукт не появляется, когда я фильтрую по цене.

Есть идеи или обходные пути?

Спасибо.

Это было полезно?

Решение

Вам нужно переписать, как 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;
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с magento.stackexchange
scroll top