Manipuler les collections de produits

  • De le 06 août 2010
  • Difficulté : 2/4

Manipuler les collections de produits 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

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();
Exemples

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);
commentaires

Commentez cet article : Manipuler les collections de produits