Pregunta

¿Cómo podría modificar la navegación en capas para mirar solo los atributos en el producto configurable principal, y no en el niño?

Los productos para niños y padres tienen el conjunto de atributos y se usa en otros lugares. Por ejemplo, todos los productos tienen un color, incluido el padre. El color del padre no siempre es el mismo que el de los niños, pero es indicativo del color predeterminado. Cuando filtramos un color específico, solo queremos mostrar elementos donde el padre está configurado en ese color predeterminado. Los productos configurables son visibles y los productos simples (niños) están ocultos. Hay algunos productos simples individuales que no son niños y son visibles que también deben permanecer funcionales.

¿Fue útil?

Solución

Con la advertencia de que los cambios de navegación en capas siempre son más complicados de lo que parecen, la colección de productos para la navegación en capas se instancia en

#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;
}

También tiene sus filtros predeterminados agregados en

#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;
}

Y un llamado intrigante 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;
}

Una reescritura de cualquiera de esos métodos sería un buen lugar para comenzar (agregar un type=configurable filtrar, restringir los atributos filtrables, etc.)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top