2010-10-22 11 views
18

Ho afferrando le opzioni degli attributi da Magento in questo modo:Ottenere un elenco di opzioni di attributo da Magento

<?php 

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

?> 

è lavorato bene fino a quando ho cercato di ottenere le opzioni per il costruito nel attributo 'colore' - - ho ottenuto il seguente errore:

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 

sembrerebbe che la chiamata getSource() non riesce e causa questo errore. Qualcuno sa perché questo accade e come posso ottenere le opzioni di colore?

Grazie!

+1

sei stato in grado di eseguire il debug di live con xdebug e il tuo IDE? Potresti essere in grado di eseguire il drill nella chiamata $ attribute-> getSource() per vedere cosa sta fallendo lì. Non conosco alcun motivo per cui 'color' dovrebbe essere diverso dagli altri attributi. –

risposta

57

Sembra che si inizializza l'attributo da soli, invece di usare Magento attribuiscono processo di inizializzazione:

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

Perché da 1.4.x di Magento ha modelli di attributi separati per catalogo e clienti del modello e definizione del modello di origine di default per catalog_product ora viene spostato dal modello di attributo EAV (Mage_Eav_Model_Entity_Attribute) a quello di catalogo (Mage_Catalog_Model_Resource_Eav_Attribute).

Di conseguenza, alcuni attributi del catalogo non funzioneranno con il modello di attributo EAV. In particolare quelli che usano Mage_Eav_Model_Entity_Attribute_Source_Table ma non lo definiscono esplicitamente (colore, produttore, ecc.).

Il seguente frammento di codice dovrebbe funzionare perfettamente sul vostro impianto:

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

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

A proposito Mage_Eav_Model_Config modello ha un sacco di metodi utile, che può essere utilizzato nel vostro sviluppo, quindi non esitate a guardare in questo modello.

+2

Perfetto - grazie Ivan! –

+0

Grazie. In aggiunta alla risposta, quando si ha a che fare con 'catalog_product' usa la classe Mage_Eav_Model_Entity_Attribute_Source_Table ei parametri sono: getAllOptions ($ withEmpty = true, $ defaultValues ​​= false). Grazie ancora una volta. –

-1

Siamo spiacenti per una risposta incompleta, ma date un'occhiata al database, in particolare nella colonna backend_model. Mi sembra di ricordare di avere lo stesso problema fino a quando non ho impostato questo campo per abbinare alcuni dei campi di sistema in questo senso.

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

si prega di aggiungere ulteriori dettagli sulla risposta –

+0

Questo funziona per gli attributi eav che non popolano con i metodi sopra indicati – CarComp

6

Il codice sopra riportato non funziona se resource_model è vuoto. Il seguente frammento fa il lavoro:

$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

Si prega di considerare che questa soluzione non si preoccupa del tipo di ordinamento dei valori degli attributi. $ attribute-> getSource() -> getAllOptions (false) sì –

Problemi correlati