2010-08-04 21 views
4

J'essaie de montrer ajouter des filtres sur mon magasin, mais ils ont un effet secondaire désagréable. Supposons que j'ai le type de produit A et B. Maintenant, je veux seulement montrer A où couleur = bleu/rouge.Magento: addAttributeToFilter mais ignore pour les produits qui n'ont pas cet attribut?

$collection = Mage::getResourceModel('catalog/product_collection') 
    ->setStoreId($this->getStoreId()) 
    ->addCategoryFilter($this) 
    ->addAttributeToFilter(array(
      array('attribute' => 'color', 'in' => array(4, 6)), 
    ) 
    ); 

Cela fait l'affaire, mais maintenant parce que le type de produit B n'a pas de valeur attribuée à la couleur (puisque cet attribut est pas nommé à elle) aucun produit fo ce type montrer.

j'avais trouvé ce code sur le forum http://www.magentocommerce.com/boards/viewthread/178309, mais il ne fonctionne pas:

array('attribute' => 'color', 'is' => new Zend_Db_Expr('null')) 

Ni ne:

array('attribute' => 'color', 'null' => true), 

Cela montre en fait des produits wich ont l'attribut attribué, mais sans valeur déclarée ...

J'ai également essayé d'ajouter:

array('attribute' => 'price', 'gteq' => 0), 

Parce que je pensais que ces déclarations étaient liées à « OR » (selon la documentation) mais même cela ne fait qu'ajouter des types de produits wich ont l'attribut attribué ...

Notez que ces valeurs proviennent d'une liste déroulante , je ne sais pas si c'est important.

+0

Où appelez-vous cela à partir? (Quel est le "$ this" dans la méthode call -> addCategoryFilter ($ this)) –

+0

Je l'appelle dans getProductCollection() dans app/code/core/mage/catalogue/model/category.php – Rakward

Répondre

7

Peut-être qu'il est trop tard, mais cela fonctionne pour moi:

$collection = Mage::getResourceModel('catalog/product_collection') 
    ->setStoreId($this->getStoreId()) 
    ->addCategoryFilter($this) 
    ->addAttributeToFilter(
     array(
      array('attribute' => 'color', 'null' => true), 
      array('attribute' => 'color', 'in' => array(4, 6)), 
     ), 
     '', 
     'left' 
); 
+0

Seulement plus d'un an trop tard, mais il aime ce que J'avais besoin, j'espère que d'autres personnes peuvent encore l'utiliser. – Rakward

+0

Ce code déclenche une jointure gauche au lieu de interne, c'est pourquoi il résout le problème. –

0

Spontanément, donner un coup de feu ce:

$collection = Mage::getResourceModel('catalog/product_collection') 
    ->setStoreId($this->getStoreId()) 
    ->addCategoryFilter($this) 
    ->addAttributeToFilter(array(array('attribute' => 'color', 'in' => array(4, 6)),'left') 
); 
+0

Cela me donne un erreur indiquant "nom d'attribut invalide" ... – Rakward

+0

Je devais ajouter un) au fait, et selon où je l'ai ajouté j'ai eu cette erreur ou tout simplement pas le résultat souhaité – Rakward