Magento et collections : chargement automatique des attributs produits

  • De le 05 juillet 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)
  }
}
commentaires

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