Magento et collections : chargement automatique des attributs produits

  • Par Magentix le 05/07/2011
  • Difficulté : 2/4

Magento et collections : chargement automatique des attributs produits 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)
  }
}
10

Commentez cet article Magento et collections : chargement automatique des attributs produits

Thomas@DND Le 06/07/2011 à 09:53
Miam miam ^^
Merci bien Mr Magentix !
#1
wax Le 06/07/2011 à 15:39
Merci ! Ton site est une mine d'infos de qualité.
#2
mat Le 15/07/2011 à 13:08
Je vous remercie de prendre le temps de partager avec nous vos connaissances. je suis un lecteur régulier de votre blog.
Merci infininement
#3
Boostmyshop Le 05/01/2012 à 01:42
Bonsoir,

Sauf erreur de ma part, cela peut se faire directement dans le config.xml dans le noeud default
#4
Magentix Le 05/01/2012 à 16:58
Je suis pas sûre, pas trouvé en tout cas, du moins sur une vieille version 1.3.2.4.

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>
#5
BoostMyShop Le 06/01/2012 à 10:28
Bonjour,

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
#6
Magentix Le 06/01/2012 à 10:51
Oui j'ai regardé de ce côté là hier, j'ai fait quelques tests mais sans succès...

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...
#7
BoostMyShop Le 06/01/2012 à 14:28
c'est étonnant car nous utilisons cette méthode pour charger des attributs additionels dans les listing produits
je vais creuser, je reviens vers vous :)
#8
BoostMyShop Le 06/01/2012 à 14:44
Pour clôturer la discussion : ma méthode est valable jusqu'à Magento 1.2........
#9
Magentix Le 06/01/2012 à 14:51
çà marche, bon à savoir en tout cas.
#10
Rédiger un commentaire

Cliquez pour générer un nouveau code

* champs obligatoires