Manipuler les collections d’objets Magento (partie 1)

Article complété, mis à jour et testé sur Magento 1.4.1.1

Objectif

Penchons nous sur la manipulation des collections d’objets Magento, les objets principaux (produits, catégories, clients, etc) sont stockés selon le modèle EAV (Entité – Attribut – Valeur), les objets plus simples sont stockés « à plat » (pages et blocs CMS, etc).

Le modèle de données évolue entre les versions de Magento, les exemples ci-dessous ont été testés avec Magento 1.4

Exemples

Les portions de code suivantes peuvent être indifféremment testées dans un contrôleur, bloc, helper ou même template de Magento.

Afin de les tester simplement, il suffit de créer le script test.php à la racine de l’installation Magento :

<?php
$compilerConfig = 'includes/config.php';
if (file_exists($compilerConfig)) {
    include($compilerConfig);
}
 
$mageFilename = 'app/Mage.php';
require_once $mageFilename;
 
Mage::app("admin"); // initialiser Magento avec le magasin Admin
 
// placer ici le code à exécuter

Exécuter le code en accédant à l’url /test.php ou en utilisant php-cli en console (ie « php test.php »).

Récupérer la collection de produits

// récupérer le modèle de données Product du module Mage/Catalog
$model = Mage::getModel('catalog/product');
// récupérer la collection de produits
$products = $model->getCollection();
var_dump($products);

Ajouter l’attribut EAV prix

Par défaut et pour une raison d’économie de ressources inhérente au modèle EAV, lorsque l’on charge une collection d’objets Magento, les objets récupérés ne contiennent pas tous leurs attributs (ici seulement les champs de catalog_product_entity et quelques autres attributs calculés).

Pour ajouter un attribut EAV, on procède comme suit :

$products = Mage::getModel('catalog/product')
    ->getCollection()
    // ajouter l'attribut prix aux produits retournés
    ->addAttributeToSelect(array('price'));

Ajouter tous les attributs EAV

Il est également possible de récupérer tous les attributs des produits, la requête générée par Magento étant composée d’un grand nombre de jointures, elle est particulièrement gourmande et cette utilisation est à proscrire. On préfèrera récupérer seulement les attributs requis pour la suite du traitement.

$products = Mage::getModel('catalog/product')
    // ajouter tous les attributs
    ->addAttributeToSelect('*');

Filtrer la collection sur le nom

$products = Mage::getModel('catalog/product')
    ->getCollection()
    // seulement les produits dont le nom est "mon beau produit"
    ->addAttributeToFilter('name', 'mon beau produit');

Filtrer sur l’attribut EAV prix

$products = Mage::getModel('catalog/product')
    ->getCollection()
    // filtrer la collection sur celui-ci
    ->addAttributeToFilter('price', '49.99');

Autres filtres utilisables :

Les filtres précédents sont traduits par champ = valeur, il est également possible d’utiliser les opérateurs ‘eq’, ‘neq’, ‘like’, ‘nlike’, ‘in’, ‘nin’, ‘is’, ‘notnull’, ‘moreq’, ‘gt’, ‘lt’, ‘gteq’, ‘lteq’, ‘date’.

// filtrer avec LIKE
$products = Mage::getModel('catalog/product')->getCollection()
    ->addAttributeToFilter('name', array('like' => '%computer%'));
echo $products->count().'<br/>';
 
// filtrer sur une tranche de prix de 20 à 30 € :
$products = Mage::getModel('catalog/product')->getCollection()
    ->addAttributeToFilter('price', array('from' => 20, 'to' => 30));
echo $products->count().'<br/>';
 
// filtrer avec < (lt) and > (gt) :
$products = Mage::getModel('catalog/product') -> getCollection()
    ->addAttributeToFilter('price', array('lt' => 20)); // < 20
echo $products->count().'<br/>';
 
// filtrer avec IN :
$ids = array(160, 163);
$products = Mage::getModel('catalog/product')->getCollection()
    ->addAttributeToFilter('entity_id', array('IN' => $ids));
echo $products->count().'<br/>';

Trier la collection sur le nom

$products = Mage::getModel('catalog/product')->getCollection()
    ->addAttributeToSort('name', 'ASC');
foreach ($products as $p) {
	echo $p->getName().'<br/>';
}

Manipuler les modèles « à plat »

Les collections sur les modèles à plat, comme les pages CMS, contiennent toutes les valeurs des champs et ne fournissent donc pas les même méthodes :

$pages = Mage::getModel('cms/page')->getCollection()
    ->addFieldToFilter('title', array('like' => '%About%'));
echo $pages->count().'<br/>';

Conclusion

Nous avons abordé ici les manipulations basiques sur les collections, un prochain article présentera des utilisations plus complexes, l’utilisation de plusieurs filtres, les expressions (sum, count, etc) ainsi que les jointures !

Modèle , , Permalien.

4 Responses to Manipuler les collections d’objets Magento (partie 1)

  1. DavidV says:

    Bonjour,

    Merci pour ce tuto. c’est très clair.
    Néanmoins, si je veux sélectionner les produits dont le prix est compris entre 15 et 20 €, comment paramétrer le addAttributeToFilter(‘price’) ???

  2. Nicolas says:

    Bonjour,

    et voilà :
    $collection = Mage::getModel(‘catalog/product’) -> getCollection();
    $collection -> addAttributeToSelect(array(‘price’))
    -> addAttributeToFilter(‘price’, array(‘from’ => 15, ‘to’ => 20));

  3. Thomas says:

    Bonjour,

    Très bon article. Petite question :

    Si le développeur souhaite que la collection soit triée, comment procède-t-on ?

    Merci,
    Thomas.

  4. Nicolas says:

    Pour le tri :
    $collection->addAttributeToSort(‘price’, ‘ASC’);

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

*

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">