2010-10-22 9 views
18

he estado agarrando opciones de atributo de Magento, así:Obtener una lista de opciones de atributo de Magento

<?php 

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

?> 

Se ha estado trabajando bien hasta que traté de hacer las opciones para el construido en el atributo 'color' - - tengo el siguiente error:

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 

al parecer, la llamada getSource() falla y provoca este error. ¿Alguien sabe por qué sucede esto y cómo puedo obtener opciones de color?

Gracias!

+1

¿Ha podido depurarlo en vivo con xdebug y su IDE? Es posible que pueda explorar la llamada $ attribute-> getSource() para ver qué falla allí. No sé de ninguna razón por la cual 'color' debería ser diferente a otros atributos. –

Respuesta

57

Parece que inicializar el atributo por sí mismo, en lugar de utilizar Magento atribuyen proceso de inicialización:

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

Porque desde 1.4.x Magento tiene modelos de atributos separados para catálogo y clientes de modelo y definición del modelo de la fuente por defecto para catalog_product ahora se mueve del modelo de atributo EAV (Mage_Eav_Model_Entity_Attribute) al catálogo uno (Mage_Catalog_Model_Resource_Eav_Attribute).

Como resultado, algunos atributos de catálogo no funcionarán con el modelo de atributo EAV. Particularmente aquellos que usan Mage_Eav_Model_Entity_Attribute_Source_Table pero no lo definen explícitamente (color, fabricante, etc.).

El siguiente fragmento de código debería funcionar perfectamente en su instalación:

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

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

Por cierto Mage_Eav_Model_Config modelo tiene una gran cantidad de métodos de votos, que se puede utilizar en su desarrollo, por lo que no dude en buscar en Este modelo.

+2

Perfecto - gracias Ivan! –

+0

Gracias. Además de la respuesta, cuando se trata de 'catálogo_producto' usa la clase Mage_Eav_Model_Entity_Attribute_Source_Table y los parámetros son: getAllOptions ($ conEmpty = true, $ defaultValues ​​= false). Gracias una vez más. –

-1

Disculpe por una respuesta incompleta, pero eche un vistazo a la base de datos, específicamente en la columna backend_model. Me parece que recuerdo tener este mismo problema hasta que establecí este campo para que coincida con algunos de los campos del sistema a este respecto.

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

por favor agregue más detalles sobre su respuesta –

+0

Esto funciona para los atributos eav que no se pueblan utilizando los métodos anteriores – CarComp

6

El código anterior no funciona si el resource_model está vacío. El siguiente fragmento hace el trabajo:

$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

Tenga en cuenta que esta solución no se ocupa del orden de los valores de los atributos. $ attribute-> getSource() -> getAllOptions (false) no –

Cuestiones relacionadas