Nous avons vu hier comment créer une catégorie par code dans Magento.
Je vous propose aujourd’hui de voir comment récupérer une ou plusieurs catégories, comment les parcourir puis d’implémenter une méthode permettant de vérifier si une catégorie existe ou non d’après son attribut “name”.

Cet article va nous permettre de découvrir la manipulation des collections d’objets Magento. Les notions ci-dessous ne s’appliquent pas seuleusement qu’aux catégories Magento mais également à toutes les entités EAV (Entité - Attribut - Valeur) comme les produits, les attributs, les clients, les commandes …
Le code proposé ci-dessous est exécuté dans un batch PHP créer sur le modèle décrit dans l’article Comment créer un batch Magento.
Une collection est un objet PHP implémentant un certain nombre de méthodes et regroupant un ensemble d’objets du même type.
Pour récupérer la collection de toutes les catégories il suffit de récupérer une instance de Mage_Catalog_Model_Category et d’utiliser sa méthode getCollection() :
$categories = Mage::getModel('catalog/category') ->getCollection();
$categories contient une instance de Mage_Catalog_Model_Resource_Eav_Mysql4_Category_Collection héritant -entre autre- de la classe Mage_Eav_Model_Entity_Collection_Abstract et implémentant les interfaces IteratorAggregate et Countable.
Pour savoir combien la collection contient d’entités on peut utiliser la méthode PHP count() :
echo "Il y a " . count($categories) . " catégories dans l’instance de Magento \n";
La méthode count() est également proposée par la collection :
echo "Il y a " . $categories->count() . " catégories dans l’instance de Magento \n";
La méthode getCollection() retourne toujours une collection d’objet, même vide. Il est donc nécessaire de tester la collection -avec count() par exemple- avant d’essayer d’en manipuler le contenu.
Pour filtrer la sélection des entités par valeur d’un attribut il faut utiliser la méthode addAttributeToFilter($code, $valeur) :
$categories = Mage::getModel('catalog/category') ->getCollection() ->addAttributeToFilter('name', 'Ma catégorie existante') ;
Il est également possible de filtrer les catégories par store Magento via la fonction setStore(), l’exemple suivant récupère toutes les catégories visibles sur le store à l’ID 1 :
$categories = Mage::getModel('catalog/category') ->getCollection() ->setStore( 1 ) ;
Par une raison évidente d’économie de ressource les entités sont retournées par défaut avec un minimum d’attributs. Pour ajouter un attribut à la collection il faut utiliser AddAttributeToSelect($code) :
$categories = Mage::getModel('catalog/category') ->getCollection() -> addAttributeToSelect (‘name’) ;
Si on souhaite récupérer tout les attributs (à manipuler avec précautions) il suffit d’utiliser le joker ‘*’ :
$categories = Mage::getModel('catalog/category') ->getCollection() -> addAttributeToSelect (‘*’) ;
Avoir une collection c’est bien, la parcourir c’est mieux. On peut par exemple boucler dessus :
foreach ($categories as $category) { echo "- Catégorie : " . $category->getName() . " \n"; }
Ou ne récupérer que le premier et le dernier élément :
$category = Mage::getModel('catalog/category') ->getCollection() ->addAttributeToSelect('name') ->getFirstItem(); echo "Premier : {$category->getName()} \n"; $category = Mage::getModel('catalog/category') ->getCollection() ->addAttributeToSelect('name') ->getLastItem(); echo "Dernier : {$category->getName()} \n";
Fort de ces nouvelles connaissances, implémentons une fonction utilisateur qui teste l’existence d’une catégorie par son nom (bien pratique dans le cas d’un import de catégories) :
function categoryExists( $name ) { if ($name == null) { return false; } $collection = Mage::getModel('catalog/category') ->getCollection() ->addAttributeToFilter('name', $name); if (count($collection)) { return true; } return false; } echo "Test sur la catégorie [Pantalons] : " . categoryExists('Pantalons') . "\n"; echo "Test sur la catégorie [N'existe pas] : " . categoryExists("N'existe pas") . "\n";
Et voilà pour aujourd’hui, demain nous verrons comment créer un produit from scratch.

















Bonjour, je n’arrive pas à utiliser le ->setStore( 1 )
j’ai deux boutiques idStore 1 et 3 peut importe l’id que je met, il m’affiche toutes les catégories
Cordialement
Répondre
Bonjour,
Je cherche à lister toutes les catégories et sous catégorie avec leur id. le nom plus l’id .Est ce possible ?
Répondre
@david
getTreeModel ();
$tree->load ();
$ids = $tree->getCollection ()->getAllIds ();
if ($ids) {
$file = “var/import/catwithid.csv”;
file_put_contents($file,”catId, catName\n”);
foreach ( $ids as $id ) {
$string = $id . ‘, ‘ .$category->load($id)->getName() . “\n”;
file_put_contents($file,$string,FILE_APPEND);
}
}
Répondre