Игнорирование атрибутов дочернего продукта в слоистой навигации
-
16-10-2019 - |
Вопрос
Как бы я мог бы изменить слоистую навигацию, чтобы посмотреть только на атрибуты на родительском настраиваемом продукте, а не на ребенка?
Детские и родительские продукты имеют набор атрибутов, и он используется в других местах. Например, все продукты имеют цвет, включая родителя. Цвет родителей не всегда такой же, как у ребенка, но он свидетельствует о цвете по умолчанию. Когда мы фильтруют в определенный цвет, мы хотим показывать элементы, в которых родитель устанавливается на этот цвет по умолчанию. Настраиваемые продукты видны, а простые (детские) продукты скрыты. Есть некоторые отдельные простые продукты, которые не являются детьми и видны, которые также должны оставаться функциональными.
Решение
С предостережением, что слоистые изменения навигации всегда сложнее, чем они кажутся, сбор продуктов для слоистой навигации создается в
#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
Фильтр, ограничение фильтруемых атрибутов и т. Д.)