Manipuler les collections de produits
- Par Magentix le 06/08/2010
- Difficulté : 2/4
Voici un petit aide mémoire sur la manipulation des collections de produits : filtres, limites, tris... Méthodes que l'on utilise régulièrement lors du développement d'un site e-commerce Magento...
- Usage
- Récupérer une collection de produits
- Sélection d'un attribut spécifique
- Sélection de tous les attributs
- Filtres sur les attributs de produits (exemples)
- Filtres sur les catégories de produits
- Limiter le nombre de résultats
- Trier les résultats
- Autres méthodes utiles
- Collection de produits avec statistiques (Reports)
- Visualiser la requête générée
- Exemples
Récupérer une collection de produits
Collection de produits
$products = Mage::getResourceModel('catalog/product_collection');
/* ou */
$products = Mage::getModel('catalog/product')->getCollection();
Les attributs exploitables par défaut sont :
entity_id, entity_type_id, type_id, sku, has_options, required_options, created_at, updated_at, is_salable, stock_item
Sélection d'un attribut spécifique
addAttributeToSelect
$products = Mage::getResourceModel('catalog/product_collection')
->addAttributeToSelect('name')
->addAttributeToSelect('weight');
Sélection de tous les attributs
addAttributeToSelect
$products = Mage::getResourceModel('catalog/product_collection')
->addAttributeToSelect('*');
Filtres sur les attributs de produits
addAttributeToFilter
$products = Mage::getResourceModel('catalog/product_collection')
/* Produits activés */
->addAttributeToFilter('status',1)
/* Produits dont les identifiants sont X,Y */
->addAttributeToFilter('entity_id',array('in'=>array(2,4)))
/* Produits dont les identifiants ne sont pas X,Y */
->addAttributeToFilter('entity_id',array('nin'=>array(1,3)))
/* Prix des produits compris entre X et Y */
->addAttributeToFilter('price',array('from' => 10, 'to' => 100))
/* Poids des produits à partir de X */
->addAttributeToFilter('weight',array('from' => 100))
/* Prix spécial (promotion) n'est pas égal à 0 */
->addAttributeToFilter('special_price',array('neq' => 0))
/* La référence contient */
->addAttributeToFilter('sku',array('like' => '%P%'))
/* La référence ne contient pas */
->addAttributeToFilter('sku',array('nlike' => '%A%'))
/* Produits ajoutés entre le dd/mm/yyyy et le dd/mm/yyyy */
->addAttributeToFilter('created_at',array('from' => '2009-01-01', 'to' => '2011-01-01'))
/* Produits visibles dans le catalogue et la recherche */
->addAttributeToFilter('visibility',array('in' => Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH));
Filtres sur les catégories de produits
addCategoryFilter
$category = Mage::getModel('catalog/category')->load(1);
$products = Mage::getResourceModel('catalog/product_collection')
->addAttributeToSelect('name')
->addCategoryFilter($category);
Limiter le nombre de résultats
setPageSize
$products = Mage::getResourceModel('catalog/product_collection')
->addAttributeToSelect('name')
->setPageSize(10);
Trier les résultats
addAttributeToSort
/* Trier sur un attribut spécifique */
$products = Mage::getResourceModel('catalog/product_collection')
->addAttributeToSelect('name')
->addAttributeToSort('price','asc');
/* Trier de façon aléatoire (Rand) */
$products = Mage::getResourceModel('catalog/product_collection')
->addAttributeToSelect('name');
$products->getSelect()->order(new Zend_Db_Expr('RAND()'));
Autres méthodes utiles
Autres méthodes
$products = Mage::getResourceModel('catalog/product_collection')
/* Produits dont les identifiants sont X,Y */
->addIdFilter(array(2,4))
/* Produits de la boutique en cours de consultation */
->addStoreFilter()
/* Produits de la boutique dont l'identifiant est 1 */
->addStoreFilter(1)
/* Sélectionner le prix final calculé */
->addFinalPrice()
/* Sélectionner le prix le plus faible (produits avec options) */
->addMinimalPrice();
Collection de produits avec statistiques (Reports)
Reports
$products = Mage::getResourceModel('reports/product_collection')
/* Total des ventes du produit */
->addOrderedQty()
/* Total des paniers incluant le produit */
->addCartsCount()
/* Total des ventres entre dd/mm/yyyy et dd/mm/yyyy */
->addOrdersCount('2009-01-01','2011-01-01')
/* Total des consultations du produit entre dd/mm/yyyy et dd/mm/yyyy */
->addViewsCount('2009-01-01','2011-01-01');
Visualiser la requête générée
getSelect
$products = Mage::getResourceModel('catalog/product_collection');
echo $products->getSelect();
Liste des produits en promotions
Promotions
$now = Mage::getModel('core/date')->timestamp(time());
$date = date('Y-m-d h:i:s', $now);
$products = Mage::getResourceModel('catalog/product_collection')
->addAttributeToSelect('name')
->addAttributeToFilter('special_price',array('neq' => 0))
->addAttributeToFilter('special_from_date', array('date' => true, 'to' => $date))
->addAttributeToFilter(array(
array('attribute' => 'special_to_date', 'date' => true, 'from' => $date),
array('attribute' => 'special_to_date', 'is' => new Zend_Db_Expr('null'))
));
Liste des nouveautés
Nouveautés
$now = Mage::getModel('core/date')->timestamp(time());
$date = date('Y-m-d h:i:s', $now);
$products = Mage::getResourceModel('catalog/product_collection')
->addAttributeToSelect('name')
->addAttributeToFilter('news_from_date', array('date' => true, 'to' => $date))
->addAttributeToFilter(array(
array('attribute' => 'news_to_date', 'date' => true, 'from' => $date),
array('attribute' => 'news_to_date', 'is' => new Zend_Db_Expr('null'))
));
Liste des 5 produits les plus vendus
Bestsellers
$products = Mage::getResourceModel('reports/product_collection')
->addAttributeToSelect('name')
->addOrderedQty()
->addAttributeToSort('ordered_qty','desc')
->setPageSize(5);
Ce blog est de qualité super extra :)
Parfait pour aller chercher l'information.
Merci !
Lors de la récupération d'une collection de produits, il est possible d'y appliquer des filtres afin de ne récupérer que des produits activés et visibles :
Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($collection);
Mage::getSingleton('catalog/product_visibility')->addVisibleInSiteFilterToCollection($collection);
Mage::getSingleton('catalog/product_visibility')
->addVisibleInCatalogFilterToCollection($collection)
->addVisibleInSearchFilterToCollection($collection)
->addVisibleInSiteFilterToCollection($collection)
j'ai constaté (avec le plugin beezup) que la méthode de récupération des attributs de type select/dropdown (et uniquement ceux là) ne sont pas exportés (valeur vide) dans le xml
la récupération via la ligne
$value = $p->getResource()->getAttribute($a)->getFrontend()->getValue($p);
(où $p est un produit de la collection et $a un attribut de type select/dropdown)
ne renvoie rien.
Un patch (dégueulasse) consiste à ajouter dans le foreach de la collection ce genre de chose:
$model2 = Mage::getModel('catalog/product');
$p2 = $model2->load($p->getId());
$value = $p2->getResource()->getAttribute($a)->getFrontend()->getValue($p2);
la valeur de l'attribut est alors bien rendue mais bon on ajoute une requete par produit de la collection ce qui est vraiment vraiment pas propre :$
j'ai essayé d'ajouter à la methode de base (dans le modele)
->addAttributeToSelect('*');
mais rien n'y fait les attributs de type select/dropdown sont vides
avez vous constaté ce problème ? y'a t'il un moyen de résoudre ça ?
j'espere avoir été compréhensible ;)
le module que tu as fait est très bien mais j'ai l'impression que le problème vient plutôt de magento, j'avais rencontré le même soucis avec une extension custom pour exporter le catalogue produit en xml.
je suis intéressé si tu as une solution élégante (et si tu constate effectivement le problème)
Tu peux également tenté d'analyser l'objet voir si l'attribut est bien pris en compte. En éditant le fichier "CatalogController.php" :
/* ... */
foreach($products as $p) {
Zend_debug::dump($p);
die;
}
/* ... */
Pour ma part avec l'attribut color j'obtient :
["color"] => string(1) "3"
j'ai constaté la même chose que toi sur une install vierge de 1.4...
il se trouve que mon bug est sur une version 1.3 de magento, j'ai mis à jour ma magento avec les données sur une plateforme de test , il semblerait que ça passe maintenant...
reste à passer la prod maintenant :p
merci de ton aide en tout cas ! ^^
en fait les attributs qui ne s'exportaient pas n'étaient pas que les dropdown comme je le pensais... il s'agissait des attributs ayant le paramètre :
"Utilisé dans la liste de produits" à "non" dans la configuration des attributs . De fait les attributs n'étaient donc pas présents dans la collection malgré les addAttributeToSelect
passer le paramètre à "oui" a tout résolu
en espérant que ca aidera quelqu'un ;)
Ton blog est vraiment top !
Je ne comprends pas comment afficher tous les produits en promotions de la boutique
print_r($products = Mage::getResourceModel('catalog/product_collection')->addAttributeToSelect('special_price'));
Ce code m'affiche un tableau illisible, je cherche à afficher par ligne le nom du produit plus le prix spécial.
ps : super article
Aurais-tu un code qui prendrait en compte également ces produits en promo ?