Comment obtenir une valeur d'attribut de produit spécifique si je connais l'ID de produit sans charger le produit entier?
Mage::getResourceModel('catalog/product')->getAttributeRawValue($productId, 'attribute_code', $storeId);
Une façon que je connaisse:
$product->getResource()->getAttribute($attribute_code)
->getFrontend()->getValue($product)
vous pouvez utiliser
<?php echo $product->getAttributeText('attr_id') ?>
Veuillez voir la réponse de Daniel Kocherga, car cela fonctionnera dans la plupart des cas.
En plus de cette méthode pour obtenir la valeur de l'attribut, vous souhaiterez parfois obtenir l'étiquette select
ou multiselect
. Dans ce cas, j'ai créé cette méthode que je stocke dans une classe d'assistance:
/**
* @param int $entityId
* @param int|string|array $attribute atrribute's ids or codes
* @param null|int|Mage_Core_Model_Store $store
*
* @return bool|null|string
* @throws Mage_Core_Exception
*/
public function getAttributeRawLabel($entityId, $attribute, $store=null) {
if (!$store) {
$store = Mage::app()->getStore();
}
$value = (string)Mage::getResourceModel('catalog/product')->getAttributeRawValue($entityId, $attribute, $store);
if (!empty($value)) {
return Mage::getModel('catalog/product')->getResource()->getAttribute($attribute)->getSource()->getOptionText($value);
}
return null;
}
Il semble impossible d'obtenir de la valeur sans charger le modèle de produit. Si vous regardez le fichier app/code/core/Mage/Eav/Modèle/Entity/Attribute/Frontend/Abstract.php, vous verrez la méthode
public function getValue(Varien_Object $object)
{
$value = $object->getData($this->getAttribute()->getAttributeCode());
if (in_array($this->getConfigField('input'), array('select','boolean'))) {
$valueOption = $this->getOption($value);
if (!$valueOption) {
$opt = new Mage_Eav_Model_Entity_Attribute_Source_Boolean();
if ($options = $opt->getAllOptions()) {
foreach ($options as $option) {
if ($option['value'] == $value) {
$valueOption = $option['label'];
}
}
}
}
$value = $valueOption;
}
elseif ($this->getConfigField('input')=='multiselect') {
$value = $this->getOption($value);
if (is_array($value)) {
$value = implode(', ', $value);
}
}
return $value;
}
Comme vous pouvez le constater, cette méthode nécessite que l'objet chargé récupère des données (3ème ligne).
Nous devons d’abord nous assurer que l’attribut souhaité est chargé, puis le sortir. Utilisez ceci:
$product = Mage::getModel('catalog/product')->load('<product_id>', array('<attribute_code>'));
$attributeValue = $product->getResource()->getAttribute('<attribute_code>')->getFrontend()->getValue($product);
Essaye ça
$attribute = $_product->getResource()->getAttribute('custom_attribute_code');
if ($attribute)
{
echo $attribute_value = $attribute ->getFrontend()->getValue($_product);
}
Vous n'avez pas besoin de charger tout le produit .Les collections Magentos sont très puissantes et intelligentes.
$collection = Mage::getModel('catalog/product')->getCollection();
$collection->addAttributeToFilter('entity_id', $product->getId());
$collection->addAttributeToSelect('manufacturer');
$product = $collection->getFirstItem();
$manufacturer = $product->getAttributeText('manufacturer');
Au moment où vous appelez getFirstItem (), la requête sera exécutée et le produit obtenu est très minime:
[status] => 1
[entity_id] => 38901
[type_id] => configurable
[attribute_set_id] => 9
[manufacturer] => 492
[manufacturer_value] => JETTE
[is_salable] => 1
[stock_item (Varien_Object)] => Array
(
[is_in_stock] => 1
)
Celui-ci fonctionne
echo $_product->getData('ATTRIBUTE_NAME_HERE');
Vous pouvez obtenir une valeur d'attribut de la manière suivante
$model = Mage::getResourceModel('catalog/product');
$attribute_value = $model->getAttributeRawValue($productId, 'attribute_code', $storeId);