Requête de filtre d'attribut de liste de produits


12

J'ai ajouté un filtre dans la méthode _getProductCollection() de la classe Mage_Catalog_Block_Product_List comme suit.

protected function _getProductCollection()
{
     ...
    $this->_productCollection = $layer->getProductCollection();
    $this->_productCollection->getSelect()->joinInner(
        array('cpe' => 'catalog_product_entity'),
        'e.entity_id = cpe.entity_id'
    ) 
    ->where("cpe.type_id = 'simple'"); 
    ...
}

Le code ci-dessus fonctionne correctement à partir de la version 1.7 de Magento. Mais chaque fois que j'écris le code suivant, cela donne

Colonne introuvable: 1054 Colonne inconnue 'e.type_id' dans la clause 'where'

Erreur.

Le code (qui ne fonctionne pas).

protected function _getProductCollection()
{
     ...
    $this->_productCollection = $layer->getProductCollection();
    $this->_productCollection
        ->addAttributeToSelect('type_id')
        ->addAttributeToFilter('type_id','simple');
    ...
}

Maintenant, les questions .

  1. Y aura-t-il un impact sur les performances si j'utilise le premier code de travail?
  2. existe-t-il un autre moyen de se déplacer pour avoir un filtre de produit approprié?

MISE À JOUR:

Chaque fois que j'applique le code suivant et utilise le rwdthème, je ne reçois aucune erreur. Mais chaque fois que j'utilise un defaultthème utilisateur , j'obtiens l'erreur ci-dessous,

Code

protected function _getProductCollection()
{
     ...
    $this->_productCollection = $layer->getProductCollection();
    $this->_productCollection
         ->addAttributeToSelect('type_id')
         ->addAttributeToFilter('type_id','simple');
    ...
}

Erreur

SQLSTATE [42S22]: Colonne introuvable: 1054 Colonne inconnue 'e.type_id' dans 'clause clause', la requête était: SELECT FLOOR ((ROUND ((e.min_price) * 1, 2)) / 10) + 1 AS range, COUNT (*) AS countFROM catalog_product_index_priceAS e INNER JOIN catalog_category_product_indexAS cat_indexON cat_index.product_id = e.entity_id AND cat_index.store_id = 1 AND cat_index.visibility IN (2, 4) AND cat_index.category_id = '3' OERE ( e. type_idIN ('simple') )) ET (e.website_id = '1') ET (e.customer_group_id = 0) AND (e.min_price IS NOT NULL) GROUP BY FLOOR ((ROUND ((e.min_price) * 1, 2)) / 10) + 1 COMMANDE PAR ÉTAGE ((ROND ((e.min_price) * 1, 2)) / 10) + 1 ASC


quelle version de magento avez-vous utilisée ?? * & avoir appliqué des correctifs magento
Amit Bera

1
wtf? a maintenant du sens ... j'essayais une EE 1.14 sur RWD, ce qui est tout simplement inacceptable, comment un thème de vue peut-il changer une requête entière, pire encore, comment changer la table principale ... cela ne peut être qu'un bug . Bravo @Magento Learner!
MauroNigrele

Exactement, le thème de la vue crée un problème. Merci. Le code doit être indépendant d'un thème
Magento Learner

Réponses:


0

Je pense que:

$collection->addAttributeToFilter('type_id', array('eq' => 'simple');

Devrait fonctionner, vous n'avez pas besoin d'ajouter type_idà selectpuisqu'est une catalog_product_entitycolonne et il est récupéré par défaut. Je suggère toujours de consigner la requête finale afin d'avoir une meilleure idée de ce qui se passe:

Mage.:log($collection->getSelectSql(true));

BTW: Le premier bloc de code n'a aucun sens puisque vous joignez la table principale ( catalog_product_entity) à lui-même.


"dans Magento 1.7, ils ont fait une optimisation sur le sql sélectionné qui est utilisé pour les options de filtrage des prix. Ils suppriment la partie FROM sql (qui est l'entité produit - qui contient l'attribut type_id) et font de la table associée price_index la principale - celle qui est utilisé dans la partie FROM de la requête. Donc, fondamentalement, la table à partir de laquelle les données sont sélectionnées n'est plus la table d'entité produit (vous perdez tous les attributs de base des produits), la table principale devient l'index du produit. Il s'agit d'une mise à jour principale qui l'équipe Magento a ajouté à partir des versions 1.7. " Reportez-vous à ce qui suit
Magento Learner


1
wooow ma faute, pour une raison quelconque, je pensais à la méthode getCollection du bloc backend, donc dans ce scénario, votre premier code est ok, je ne suis pas sûr que ce soit la meilleure solution mais semble être ok. Désolé
MauroNigrele

@MagentoLearner êtes-vous sûr de ce message? Je viens de revérifier sur un EE1.14 que j'ai installé et qui utilise toujours catalog_product_entity comme table principale, sauf lorsque vous définissez l'utilisation d'un catalogue plat (absolument recommandé) mais dans les deux cas, vous avez type_id présent dans la sélection. Pouvez-vous enregistrer la requête comme je l'ai écrit dans la réponse d'origine?
MauroNigrele

1
mmmm intéressant ... i Vérifiez également la requête dans un cas de recherche et utilisez catalog_product_entity comme table principale, peut-être que "l'équipe magento" a décidé d'annuler ce changement. Je ne trouve aucun 1.7 installé pour le vérifier mais l'idée de changer la table principale d'une entité sonne comme une très mauvaise décision architecturale ... Bon notez que vous venez de gâcher mon week-end, maintenant je dois trouver et installer un CE1 .7 et regarde cette merde de mes propres yeux ... ma femme ne sera pas heureuse avec ça :)
MauroNigrele
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.