Pregunta

Estoy tratando de anular la colección de productos que viene desde $ this-> getLoadedProductCollection () así que traté de reemplazar el método

class **_**_Model_Rewrite_Layer extends Mage_Catalog_Model_Layer {
  public function prepareProductCollection($collection) {
  ...
  $collection->addAttributeToFilter('my_attribute', array('in' => array(67)));
  ...
}

pero eso no parece funcionar. Cuando agrego

echo ( $collection->getSelect() );

la consulta ni siquiera incluye los filtros de navegación en capas por lo que no puede sobrescribir su lógica.

Lo que estoy tratando de hacer es cambiar la forma en capas uno funciona el filtro de navegación.

Estoy en el camino correcto para anular prepareProductCollection () o debo ir sustituir un método que se llama más tarde en el proceso?

Cualquier ayuda sería apreciada.

¿Fue útil?

Solución 2

Bien, gracias a Tobias Zander que lograron resolver mi problema. No sé si este es el camino a seguir, pero se está haciendo lo que debe para mí, así que aquí está mi solución en esto:

1. En el archivo config.xml módulo existente añadir lo siguiente al alcance <global>:

<models>
    <catalog_resource>
        <rewrite>
            <layer_filter_attribute>YourCompany_YourModule_Catalog_Model_Resource_Layer_Filter_Attribute</layer_filter_attribute>
        </rewrite>
    </catalog_resource>
</models>

2. Crear un archivo en /app/code/local/YourCompany/YourModule/Catalog/Model/Resource/Layer/Filter/Attribute.php

3. Añadir lo siguiente al archivo Attribute.php recién creado:

<?php
class YourCompany_YourModule_Catalog_Model_Resource_Layer_Filter_Attribute extends Mage_Catalog_Model_Resource_Layer_Filter_Attribute {
public function applyFilterToCollection($filter, $value) {
    $collection = $filter->getLayer()->getProductCollection();
    $attribute  = $filter->getAttributeModel();
    $connection = $this->_getReadAdapter();
    $tableAlias = $attribute->getAttributeCode() . '_idx';

    $conditions = array(
        "{$tableAlias}.entity_id = e.entity_id",
        $connection->quoteInto("{$tableAlias}.attribute_id = ?", $attribute->getAttributeId()),
        $connection->quoteInto("{$tableAlias}.store_id = ?", $collection->getStoreId()),
        $connection->quoteInto("{$tableAlias}.value = ?", $value)
    );

    if( $attribute->getAttributeCode() == 'my_attribute' ) { // Use another logic for your attribute only
        $value = 'x,y,z'; // Your logic goes here to add multiple values for the SQL IN() statement below
        $conditions[3] = $connection->quoteInto("{$tableAlias}.value IN($value)", $value);
    }

    $collection->getSelect()->join(
        array($tableAlias => $this->getMainTable()),
        implode(' AND ', $conditions),
        array()
    );

    return $this;
    }
}
?>

La única diferencia en mi caso es de uso

$connection->quoteInto("{$tableAlias}.value IN($value)", $value)

en lugar de

$connection->quoteInto("{$tableAlias}.value = ?", $value)

Otros consejos

He resuelto que al reescribir el método de aplicación () de la clase Mage_Catalog_Model_Layer_Filter_Attribute.

En ese lugar se añade el filtro de atributos a la colección, bevore se ejecuta y se puede hacer lo que quiera. Es decir. para el filtrado <= uso:

$oAttributeModel = $this->getAttributeModel();
$this->getLayer()->getProductCollection()->addAttributeToFilter(
                    $oAttributeModel,
                        array(
                            'lteq'  => $sFilterValue,
                        )
                );
Licenciado bajo: CC-BY-SA con atribución
No afiliado a magento.stackexchange
scroll top