2010-10-22 7 views
18

J'ai l'accaparement des options d'attribut de Magento comme ceci:Obtenir une liste d'options d'attributs de Magento

<?php 

if ($attribute->usesSource()) { 
    $options = $attribute->getSource()->getAllOptions(false); 
} 

?> 

Il a travaillé bien jusqu'à ce que j'ai essayé d'obtenir les options pour le haut dans l'attribut « couleur » - - Je suis l'erreur suivante:

PHP Fatal error: Call to a member function setAttribute() on a non-object in app/code/core/Mage/Eav/Model/Entity/Attribute/Abstract.php on line 374 

Il semblerait que l'appel getSource() échoue et provoque cette erreur. Est-ce que quelqu'un sait pourquoi cela se produit et comment je peux obtenir des options de couleur?

Merci!

+1

avez-vous été en mesure de le déboguer en direct avec xdebug et votre IDE? Vous pourriez être en mesure de percer dans l'appel de $ attribute-> getSource() pour voir ce qui échoue là-dedans. Je ne connais aucune raison pour laquelle 'color' devrait être différent des autres attributs. –

Répondre

57

On dirait que vous initialisez attribut par vous-même, au lieu d'utiliser processus d'initialisation d'attribut Magento:

Mage::getSingleton('eav/config') 
    ->getAttribute($entityType, $attributeCode) 

Car depuis 1.4.x Magento a des modèles d'attributs distincts pour le modèle de catalogue et les clients et la définition du modèle source par défaut pour catalog_product est maintenant déplacé du modèle d'attribut EAV (Mage_Eav_Model_Entity_Attribute) vers le catalogue (Mage_Catalog_Model_Resource_Eav_Attribute). En conséquence, certains attributs de catalogue ne fonctionneront pas avec le modèle d'attribut EAV. Particulièrement ceux qui utilisent Mage_Eav_Model_Entity_Attribute_Source_Table mais ne le définissent pas explicitement (couleur, fabricant, etc.).

Le code suivant devrait fonctionner parfaitement sur votre installation:

$attribute = Mage::getSingleton('eav/config') 
    ->getAttribute(Mage_Catalog_Model_Product::ENTITY, 'color'); 

if ($attribute->usesSource()) { 
    $options = $attribute->getSource()->getAllOptions(false); 
} 

le modèle moyen Mage_Eav_Model_Config a beaucoup de méthodes utiles, qui peut être utilisé dans votre développement, il ne faut pas hésiter à se pencher sur ce modèle.

+2

Parfait - merci Ivan! –

+0

Merci. En plus de la réponse, quand il s'agit de 'catalog_product', il utilise la classe Mage_Eav_Model_Entity_Attribute_Source_Table et les paramètres sont: getAllOptions ($ withEmpty = true, $ defaultValues ​​= false). Merci encore une fois. –

-1

Désolé pour une réponse incomplète, mais jetez un oeil à la base de données, en particulier dans la colonne backend_model. Je me souviens d'avoir eu ce même problème jusqu'à ce que je mette ce champ en correspondance avec certains champs du système à cet égard.

4
$attribute = Mage::getModel('eav/config')->getAttribute('customer','cateinterest'); 
$options = $attribute->getSource()->getAllOptions(); 
+2

s'il vous plaît ajouter plus de détails sur votre réponse –

+0

Cela fonctionne pour les attributs eav qui ne peuplent pas en utilisant les méthodes ci-dessus – CarComp

6

Le code ci-dessus ne fonctionne pas si le modèle_modèle est vide. L'extrait suivant fait le travail:

$attribute = Mage::getModel('eav/entity_attribute')->loadByCode(Mage_Catalog_Model_Product::ENTITY, 'YOUR_ATTRIBUTE_CODE'); 

/** @var $attribute Mage_Eav_Model_Entity_Attribute */ 
$valuesCollection = Mage::getResourceModel('eav/entity_attribute_option_collection') 
->setAttributeFilter($attribute->getId()) 
->setStoreFilter(0, false); 
+0

S'il vous plaît considérer que cette solution ne prend pas soin de l'ordre de tri des valeurs d'attribut. $ attribute-> getSource() -> getAllOptions (false) fait –

Questions connexes