Question

Je suis en train de passer outre la collection de produits qui vient de $ this-> getLoadedProductCollection () alors j'ai essayé de passer outre la méthode

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

mais cela ne semble pas fonctionner. Quand j'ajoute

echo ( $collection->getSelect() );

la requête ne comprend même pas les filtres de navigation en couches, donc je ne peux pas remplacer leur logique.

Ce que je suis en train de faire est de changer la façon dont un filtre fonctionne de navigation en couches.

Suis-je sur la bonne voie pour passer outre prepareProductCollection () ou dois-je aller redéfinir une méthode qui est appelée plus tard dans le processus?

Toute aide serait appréciée.

Était-ce utile?

La solution 2

D'accord, merci à Tobias Zander j'ai réussi à résoudre mon problème. J'sais si tel est le chemin à parcourir, mais il fait ce qu'il faut pour moi, alors voici ma solution sur ce point:

1. Dans votre ajouter ce qui suit à la portée de <global> fichier config.xml module existant:

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

2. Créez un fichier dans /app/code/local/YourCompany/YourModule/Catalog/Model/Resource/Layer/Filter/Attribute.php

3. Ajoutez ce qui suit au fichier Attribute.php nouvellement créé:

<?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 seule différence dans mon cas est d'utiliser

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

au lieu de

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

Autres conseils

Je l'ai résolu que par la réécriture de la méthode apply () de la classe Mage_Catalog_Model_Layer_Filter_Attribute.

A cet endroit le filtre d'attribut est ajouté à la collection, bevore il est exécuté et vous pouvez faire ce que vous voulez. C'est à dire. pour filtrer <= utilisation:

$oAttributeModel = $this->getAttributeModel();
$this->getLayer()->getProductCollection()->addAttributeToFilter(
                    $oAttributeModel,
                        array(
                            'lteq'  => $sFilterValue,
                        )
                );
Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top