Magento et collections : chargement automatique des attributs produits
- Par Magentix le 05/07/2011
- Difficulté : 2/4
J'ai découvert récemment un observer fabuleux. Celui-ci offre un moyen simple et efficace d'ajouter automatiquement et définitivement les attributs produits souhaités lors du chargement de la collection.
Lorsque l'on charge une collection de produits, seuls quelques attributs sont disponibles par défaut :
entity_id, entity_type_id, attribute_set_id, type_id, sku, has_options, required_options, created_at, updated_at, is_salable, stock_item et is_in_stock :
Data produit
$product = Mage::getModel('catalog/product')->getCollection()->getFirstItem();
Zend_debug::dump($product->getData());
Il est donc nécessaire d'ajouter à chaque fois les attributs souhaités à l'aide de la méthode addAttributeToSelect (voir article Manipuler les collections de produits).
On s'aperçoit rapidement que certains attributs sont indispensables, et utilisés dans un grand nombre d'extensions maisons. L'utilisation de addAttributeToSelect devient assez redondant.
Un observer permet de pallier à cela, en permettant le chargement automatique des attributs par défauts et ceux personnalisés : catalog_product_collection_load_before
Architecture du module
- app/code/local/Magentix/LoadAttributes/etc/
- config.xml
- app/code/local/Magentix/LoadAttributes/Model/
- Observer.php
- app/etc/modules/
- Magentix_LoadAttributes.xml
Développement du module
On commence par la configuration, en déclarant le nouvel observer :
app/code/local/Magentix/LoadAttributes/etc/config.xml
<?xml version="1.0"?>
<config>
<modules>
<Magentix_LoadAttributes>
<version>0.1.0</version>
</Magentix_LoadAttributes>
</modules>
<global>
<models>
<loadattributes>
<class>Magentix_LoadAttributes_Model</class>
</loadattributes>
</models>
<events>
<catalog_product_collection_load_before>
<observers>
<load_default_attributes>
<type>singleton</type>
<class>loadattributes/observer</class>
<method>addAttributes</method>
</load_default_attributes>
</observers>
</catalog_product_collection_load_before>
</events>
</global>
</config>
On ajoute ensuite la méthode addAttributes à la classe Magentix_LoadAttributes_Model_Observer du module :
app/code/local/Magentix/LoadAttributes/Model/Observer.php
<?php
class Magentix_LoadAttributes_Model_Observer {
public function addAttributes($observer) {
/* Récupération de la collection */
$collection = $observer->getEvent()->getCollection();
/* Ajout des attributs à charger automatiquement */
$collection->addAttributeToSelect('price')
->addAttributeToSelect('special_price')
->addAttributeToSelect('weight');
return $this;
}
}
Il ne reste plus qu'à déclarer le nouveau module à Magento et le tour est joué !
app/etc/modules/Magentix_LoadAttributes.xml
<?xml version="1.0"?>
<config>
<modules>
<Magentix_LoadAttributes>
<active>true</active>
<codePool>local</codePool>
</Magentix_LoadAttributes>
</modules>
</config>
On obtient maintenant les datas suivantes lors du chargement de la collection de produits :
Data produit
array(14) {
["entity_id"] => string(1) "1"
["entity_type_id"] => string(1) "4"
["attribute_set_id"] => string(1) "4"
["type_id"] => string(6) "simple"
["sku"] => string(6) "PR1287"
["has_options"] => string(1) "0"
["required_options"] => string(1) "0"
["created_at"] => string(19) "2011-07-05 09:45:14"
["updated_at"] => string(19) "2011-07-05 09:45:14"
["weight"] => string(9) "1000.0000"
["price"] => string(8) "156.0000"
["special_price"] => "134.0000"
["is_salable"] => string(1) "0"
["stock_item"] => object(Varien_Object)#196 (5) {
["_data:protected"] => array(1) {
["is_in_stock"] => string(1) "0"
}
["_hasDataChanges:protected"] => bool(false)
["_origData:protected"] => NULL
["_idFieldName:protected"] => NULL
["_isDeleted:protected"] => bool(false)
}
}
Merci bien Mr Magentix !
Merci infininement
Sauf erreur de ma part, cela peut se faire directement dans le config.xml dans le noeud default
Magento charge par défaut les datas de la table "catalog_product_entity" :
<catalog_resource_eav_mysql4>
<class>Mage_Catalog_Model_Resource_Eav_Mysql4</class>
<entities>
<product>
<table>catalog_product_entity</table>
</product>
</entities>
/* ... */
</catalog_resource_eav_mysql4>
j'ai recherché dans mes archives, vous pouvez utiliser le noeux frontend/product/collection/attributes pour les définir (voir config.xml de Mage_Catalog)
Valable depuis Magento 1.1 - > Magento 1.6
Après enquête ce noeud n'est utilisé que pour la configuration des attributs lors de l'installation, méthode "getProductCollectionAttributes" de la classe "Mage_Catalog_Model_Config".
Le commentaire associé est :
"Retrieve Product Collection Attributes from XML config file
Used only for install/upgrade"
Dans les fichiers update du setup, une requête permet de placer ces attributs à 1 pour "used_in_product_listing".
Ces attributs peuvent donc servir uniquement dans le listing des produits. Ajouter un attribut dans le noeud "product/collection/attributes" du config.xml après l'installation de Magento ne sert apparemment pas à grand chose...
je vais creuser, je reviens vers vous :)