Игнорирование атрибутов дочернего продукта в многоуровневой навигации


Как бы я изменил многоуровневую навигацию, чтобы просматривать атрибуты только родительского настраиваемого продукта, а не дочернего?

Дочерние и родительские продукты имеют набор атрибутов, и он используется в других местах. Например, все продукты имеют цвет, включая родительский. Цвет родителя не всегда совпадает с цветом ребенка, но он указывает на цвет по умолчанию. Когда мы фильтруем по определенному цвету, мы хотим показывать только те элементы, где для родителя установлен этот цвет по умолчанию. Настраиваемые продукты видны, а простые (дочерние) продукты скрыты. Есть некоторые отдельные простые продукты, которые не являются детскими и видны, которые также должны оставаться функциональными.

Author: Matt Dunbar, 2013-07-02

1 answers

С оговоркой, что изменения многоуровневой навигации всегда сложнее, чем кажутся, коллекция продуктов для многоуровневой навигации создается в

#File: app/code/core/Mage/Catalog/Model/Layer.php
public function getProductCollection()
{
    if (isset($this->_productCollections[$this->getCurrentCategory()->getId()])) {
        $collection = $this->_productCollections[$this->getCurrentCategory()->getId()];
    } else {
        $collection = $this->getCurrentCategory()->getProductCollection();
        $this->prepareProductCollection($collection);
        $this->_productCollections[$this->getCurrentCategory()->getId()] = $collection;
    }
    return $collection;
}

В

также добавлены фильтры по умолчанию.
#File: app/code/core/Mage/Catalog/Model/Layer.php
public function prepareProductCollection($collection)
{
    $collection
        ->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes())
        ->addMinimalPrice()
        ->addFinalPrice()
        ->addTaxPercents()
        ->addUrlRewrite($this->getCurrentCategory()->getId());

    Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($collection);
    Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($collection);

    return $this;
}

И интригующе названный getFilterableAttributes

#File: app/code/core/Mage/Catalog/Model/Layer.php
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;
}

Переписывание любого из этих методов было бы хорошим началом (добавление фильтра type=configurable, ограничение фильтруемых атрибутов и т.д.)

 3
Author: Alan Storm, 2013-07-30 04:52:47