Il arrive parfois que l’on ai besoin d’une information précise sur un produit, sans avoir envie de le loader (car les load, c’est le mal!).
Pour récupérer un attribut de produit sans load, deux méthodes sont possibles :
La méthode Collection
$productId = 25; // A noter que l'ID produit on l'a souvent sous la main dans une variable $model = Mage::getModel('catalog/product') ->getCollection() ->addAttributeToSelect('attribute_code') ->addAttributeToFilter('entity_id',$productId) ->getFirstItem(); $attribute_value = $model->getAttributeCode();
On récupère donc le seul résultat de notre collection avec le « getFirstItem » ce qui nous donne accès à notre attribut de produit que le a ajouté dans le « addAttributeToSelect ».
La méthode AttributeRawValue
En une seule et une seule ligne de code, vous pouvez récupérer la valeur de l’attribut produit désiré :
$productId = 25; $attribute_value = Mage::getResourceModel('catalog/product')->getAttributeRawValue($productId, 'attribute_code');
Un 3ème paramètre est possible, vous pouvez mettre au choix un objet de type store, ou le storeId directement.
$productId = 25; $attribute_value = Mage::getResourceModel('catalog/product')->getAttributeRawValue($productId, 'attribute_code', 1);
Et si je veux plusieurs valeurs?
Si vous voulez plusieurs valeurs, pour les collections, il vous faudra mettre un array dans votre addAttributeToSelect :
$model = Mage::getModel('catalog/product') ->getCollection() ->addAttributeToSelect(array('attribute_code','attribute_code_bis')) ->addAttributeToFilter('entity_id',$productId) ->getFirstItem(); $attribute_value = $model->getAttributeCode(); $attribute_value_bis = $model->getAttributeCodeBis();
Et en AttributeRawValue, une ligne par attribut :
$rc = Mage::getResourceModel('catalog/product'); $attribute_value = $rc->getAttributeRawValue($productId, 'attribute_code'); $attribute_value_bis = $rc->getAttributeRawValue($productId, 'attribute_code_bis');
Lequel choisir?
Les performances sont proches entre les deux méthodes, en tout cas bien meilleures qu’avec un load ! Si votre méthode est amenée à être appelée plusieurs fois, la méthode « getAttributeRawValue » s’en sort mieux. Si elle sera appelée une seule fois (lors du chargement d’une page, ou d’un script), le getCollection prend la tête.
Les résultats des performances sont disponibles dans ce merveilleux article en Anglais :
How to get product’s attribute with getAttributeRawValue() in Magento (Get product attribute without load on Magento)
Récupérer le label de votre attribut
Et quand c’est un menu déroulant ? Comment avoir la valeur textuelle ?
Grâce aux méthodes ci-dessus, vous obtiendrez la « value_id » de votre attribut. Mais parfois, on souhaite avoir le libellé de cet attribut ! Dans ce cas, il vous suffit de faire la manipulation suivante :
// Not loading the product, just creating one simple instance $product = Mage::getModel('catalog/product') ->setStoreId($store_id) // Set a store ID to define the language, 0 for Admin ->setAttributeCode($attribute_value); // Respect Camel case for your setter $attribute_label= $product->getAttributeText('attribute_code');
Si vous avez déjà une instance de votre produit sous la main, il vous suffit juste de faire ceci :
// Not loading the product, just creating one simple instance $attribute_label = $product ->setStoreId($store_id) // Set a store ID to define the language, 0 for Admin ->setAttributeCode($attribute_value) // Respect Camel case for your setter ->getAttributeText('attribute_code');
Méthode pour récupérer le label d’une option d’attribut en SQL (avec store_id)
Voici une petit méthode, que vous pouvez mettre dans un helper, qui prend en paramètre la valeur récupérée pour votre attribut ainsi que le store id (optionnel) :
public function getAttributeOptionValue($optionId, $storeId = 0){ $db = Mage::getSingleton('core/resource')->getConnection('core_read'); $query = 'SELECT value FROM eav_attribute_option_value WHERE (store_id = '.$storeId.' OR store_id = 0) AND option_id = '.$optionId.' ORDER BY store_id DESC LIMIT 0,1'; try{ $row = $db->fetchRow($query); } catch(Exception $e){ return false; } if(empty($row) || !isset($row['value'])){ return false; } return $row['value']; }