2011-08-18 10 views
7

tengo una serie de códigos de atributos, que necesito para obtener los valores de:¿Hay una forma más simple de obtener el valor de interfaz de un atributo?

$attributes = array(
    'Category'   => 'type', 
    'Manufacturer'  => 'brand', 
    'Title'    => 'meta_title', 
    'Description'  => 'description', 
    'Product Link'  => 'url_path', 
    'Price'    => 'price', 
    'Product-image link' => 'image', 
    'SKU'    => 'sku', 
    'Stock'    => 'qty', 
    'Condition'   => 'condition', 
    'Shipping cost'  => 'delivery_cost'); 

Después de iteración a través de una colección de productos consigo los valores frontend de los atributos de este modo:

$attributeId = Mage::getResourceModel('eav/entity_attribute') 
    ->getIdByCode('catalog_product', $attribute_code); 
$attribute = Mage::getModel('catalog/resource_eav_attribute') 
    ->load($attributeId); 
$value = $attribute->getFrontend()->getValue($product); 

Simplemente usar $product->getDate($attribute) no funcionará con listas desplegables y selecciones múltiples, simplemente devuelve su identificación y no su valor de interfaz.

Mientras que el código anterior funciona, parece ser un largo camino para obtener el valor, pero lo más importante es que funciona bastante lento. ¿Existe una manera más rápida/más sensata de obtener los valores frontend de los atributos del producto?

Editar
ahora tengo el siguiente (después de tratar con casos especiales como image y qty), que es un poco más fácil en los ojos y no parecen correr más rápido (aunque no sé por qué):

$inputType = $product->getResource() 
        ->getAttribute($attribute_code) 
        ->getFrontend() 
        ->getInputType(); 

switch ($inputType) { 
case 'multiselect': 
case 'select': 
case 'dropdown': 
    $value = $product->getAttributeText($attribute_code); 
    if (is_array($value)) { 
     $value = implode(', ', $value); 
    } 
    break; 
default: 
    $value = $product->getData($attribute_code); 
    break; 
} 

$attributesRow[] = $value; 

Si alguien puede mejorar esto (hacerlo más simple/más eficiente), por favor envíe una respuesta.

+2

Tome un vistazo a este artículo http://blog.chapagain.com.np/magento-how-to-get-attribute-name-and- valor/ –

+1

Gracias, artículo útil. – Jamie

Respuesta

11

Para listas desplegables y multiselectos y solo con productos (este no es un truco general de EAV) puede usar getAttributeText().

$value = $product->getAttributeText($attribute_code); 
+0

Gracias por señalar eso. Me pregunté cómo fue que ese método funcionó en algunos atributos y no en otros. – Jamie

0

Depende de cómo se haya configurado el atributo (es accesible desde el contexto que está tratando de llegar a él?), Pero la forma más sencilla suele ser así (por meta_title, por ejemplo):

$product->getMetaTitle() 
+0

Gracias, pero algunos atributos pueden no ser accesibles usando el método mágico getter. – Jamie

3

En la versión 1.7, $product->getAttributeText($attribute_code) no está funcionando para mí en la página del producto. Al principio pensé que era porque el atributo no estaba en el índice catalog_product_flat. Pero resultó que el atributo estaba allí. En cualquier caso, el siguiente código funciona para mí. Intento el código simple, luego recurro al código EAV.

Así que estoy usando código como este:

$value = $product->getAttributeText($attribute_code); // first try the flat table? 
if(empty($value)) { // use the EAV tables only if the flat table doesn't work 
    $value = $product->getResource()->getAttribute($attribute_code)->getFrontend()->getValue($product); 
} 
+1

Estaba recuperando una colección de productos, y al hacer 'getValue ($ product)' estaba devolviendo ''No''. Cambié '$ product' a' Mage :: getModel ('catalog/product') -> load ($ product-> getEntityId()) 'y obtuve un producto cuyos métodos irían a la base de datos. De lo contrario, el código trataría de obtener los datos de su matriz interna de valores. En circunstancias normales, espero que el código anterior funcione bien. – pavlindrom

Cuestiones relacionadas