Suite de notre découverte du modèle objet Magento. Après la création d’une catégorie et la manipulation des collections d’entités Mangento voyons comment créer un produit simple … by code of course.

Lors de la création des catégories nous avions utilisé un array PHP et la méthode setData() pour renseigner les attributs. Cette fois-ci nous allons utiliser les assesseurs de notre objet.
Dans le code proposé ci-dessous tout les attributs par défaut d’un produit Magento ne seront pas renseignés. Les attributs non renseignés aurons les mêmes valeurs par défaut que si le produit avait été créé par le frontend. Entre autre la génération automatique de l’URL-key à partir du nom est implicite si elle n’est pas précisée à la création.
Le code proposé ci-dessous est exécuté dans un batch PHP créé sur le modèle décrit dans l’article Comment créer un batch Magento.
Commençons par le commencement en initiant un nouvel objet produit :
$product = new Mage_Catalog_Model_Product(); // ou $product = Mage::getModel('catalog/product');
Nous souhaitons créer un produit simple …
$product->setTypeId( Mage_Catalog_Model_Product_Type::TYPE_SIMPLE );
… avec un AttributeSet qui s’appelle « Pantalon ». Comme je ne connais pas l’ID de l’AttributeSet je vais en profiter pour réviser ma manipulation des collections Magento :
$attributeSet = Mage::getModel('eav/entity_attribute_set') ->getCollection() ->addFilter('attribute_set_name', 'Pantalon') ->getLastItem(); $product->setAttributeSetId( $attributeSet->getId() );
Le produit est à créer dans le Website par défaut :
$product->setWebsiteIDs( array(1) ); // 1 = frontend par défaut, 0 = admin
Mon produit sera visible à la fois dans le catalogue et dans les résultats de recherche :
$product->setVisibility( Mage_Catalog_Model_Product_Visibility::VISIBILITY_BOTH );
Je positionne ensuite mon produit dans la bonne catégorie (dont je ne connais toujours pas l’ID) :
$category = Mage::getModel('catalog/category') ->getCollection() ->addAttributeToFilter('name', 'Pantalons et shorts' ) ->getLastItem(); $product->setCategoryIds(array( $category->getId() )); // il est bien sûr possible d’assigner le produit à plusieurs catégories
Il est temps de renseigner les attributs courants :
$product->setName( "Jean Levis 501" ); $product->setDescription( "ma description avec <em>HTML</em>" ); $product->setShortDescription( "ma description courte avec <em>HTML</em>" ); $product->setSku( "levis-501-54-34-bleu" ); $product->setWeight( 2 ); $product->setPrice( 99 ); $product->setTaxClassId( 2 ); // voir la table tax_class $product->setMetaTitle( "Jean Levis 501 bleu" ); $product->setMetaDescription( "ma meta description" ); $product->setMetaKeyword( "mes mots clés" );
Puis les attributs propres à l’AttributeSet de ce produit, par exemple le nom de la marque et la couleur :
$product->setManufacturer( '4' ); // dropdown, l’id de l’option de l’attribut $product->setPantalonCouleur( "Bleu nuit Levis Légende" ); // champ texte
Enfin les stocks et la disponibilité du produit sont définis via la méthode setStockData() qui attend en paramétre un array PHP, voici un exemple pour un produit en stock :
$product->setStockData(array( 'is_in_stock' => Mage_CatalogInventory_Model_Stock::STOCK_IN_STOCK, // ou Mage_CatalogInventory_Model_Stock::STOCK_OUT_OF_STOCK 'qty' => 3, ));
Pour peaufiner notre beau produit, ajoutons une image à la media gallery de notre produit :
$path = Mage::getBaseDir() . '/media/import/photo_jean_501_bleu.jpg'; $product->addImageToMediaGallery( $path, array( 'image', 'small_image', 'thumbnail' ), false, false );
Le array PHP passé en second paramètre à addImageToMediaGallery() précise que l’image sera utilisée comme visuel, petit visuel et miniature du produit. Le moteur se chargera de redimensionner l’image originale dans les trois formats qui vont bien.
Terminons en indiquant que le produit sera actif dés sa création, ce qui en production est à faire avec précaution :
$product->setStatus( Mage_Catalog_Model_Product_Status::STATUS_ENABLED ); // ou Mage_Catalog_Model_Product_Status::STATUS_DISABLED
Le produit est fin prêt à être enregistré. Alors allons-y :
try { $product->save(); echo "Produit ajouté (id:{$product->getId()}) \n"; } catch (Exception $e) { echo "Erreur lors de la création du produit : {$e->getCode()} : {$e->getMessage()} \n"; }
Et voilà, le produit est crée.
Astuce : Dans le cadre d’un import massif il est recommandé de désactiver la mise à jour des index à la création de chaque produit. Ce “détail” permet en effet de préserver les ressources du serveur et d’éviter les imports qui durent 2 jours. C’est le rôle des 2 méthodes suivantes à appeler avant d’utiliser save() :
$product->setIsMassupdate(true); $product->setExcludeUrlRewrite(true);
Et voilà, nous savons maintenant comment créer un produit simple dans Magento. Libre à vous maintenant de créer vos scripts d’imports sur mesure et d’explorer les autres possibilités du modèle objet des produits de Magento.
A bientôt.
















