Atributo del producto Magento Obtener valor

82

¿Cómo obtener un valor de atributo de producto específico si conozco el ID del producto sin cargar el producto completo?

Denis Óbukhov
fuente
1
No es una gran respuesta, pero podría crear un modelo que
consulte

Respuestas:

141
Mage::getResourceModel('catalog/product')->getAttributeRawValue($productId, 'attribute_code', $storeId);
Daniel Kocherga
fuente
1
¿Cómo obtener el texto de la opción de esto? ¿alguien sabe?
Punto y coma temido
2
Para aquellos a quienes les importa: este método solo está disponible en 1.6+
JMTyler
40

Una forma que yo conozco:

$product->getResource()->getAttribute($attribute_code)
        ->getFrontend()->getValue($product)
Lucas Moeskops
fuente
3
Gracias. Era lo que buscaba.
Ricardo Martins
4
Soy nuevo en magento .. ¿por qué usar $productdos veces?
Mr_Green
28
@Mr_Green Porque esto es Magento. Ningún 'por qué' obtiene una respuesta razonable.
nakajuice
@Mr_Green, esto no quiere decir que lo use dos veces: la segunda línea es una continuación de la primera. Está llamando a getFrontend () en el objeto devuelto por getAttribute ().
Scott Buchanan
26

puedes usar

<?php echo $product->getAttributeText('attr_id')  ?> 
Rakhi
fuente
2
este código funciona bien. Busqué en muchos blogs pero ningún código funcionó para mí excepto este. Muy agradable.
Patel Dixit
3
este código solo funciona cuando el modelo del producto contiene el valor del atributo, cuando solo conoce la identificación del producto, no funcionará
Jiří Chmiel
1
Esto funciona para atributos como listas desplegables, pero si el atributo es un campo de texto simple, se necesita una función diferente. Digamos que el atributo es my_name, luego el código se convierte en $ product-> getMyName ()
Ken
1
@Ken, si necesita obtener un atributo dinámico del producto, puede usarlo$product->getData('my_name')
pavlindrom
¿Y cómo obtendríamos el ID de opción? $ producto-> getAttributeId ('attr_id') ???
snh_nl
9

Consulte la respuesta de Daniel Kocherga , ya que funcionará para usted en la mayoría de los casos.

Además de ese método para obtener el valor del atributo, es posible que a veces desee obtener la etiqueta de un selecto multiselect. En ese caso, he creado este método que almaceno en una clase auxiliar:

/**
 * @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;
}
Tyler V.
fuente
8

Parece imposible obtener valor sin cargar el modelo de producto. Si echas un vistazo al archivo app / code / core / Mage / Eav / Model / Entity / Attribute / Frontend / Abstract.php, verás el método

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;
}

Como puede ver, este método requiere un objeto cargado para obtener datos de él (tercera línea).

azakolyukin
fuente
5

Primero debemos asegurarnos de que el atributo deseado esté cargado y luego generarlo. Utilizar esta:

$product = Mage::getModel('catalog/product')->load('<product_id>', array('<attribute_code>'));
$attributeValue = $product->getResource()->getAttribute('<attribute_code>')->getFrontend()->getValue($product);
Sveta Oksen
fuente
4

Prueba esto

 $attribute = $_product->getResource()->getAttribute('custom_attribute_code');
    if ($attribute)
    {
        echo $attribute_value = $attribute ->getFrontend()->getValue($_product);
    }
Keshav Kalra
fuente
2

No tienes que cargar todo el producto. Las colecciones de Magentos son muy poderosas e inteligentes.

$collection = Mage::getModel('catalog/product')->getCollection();
$collection->addAttributeToFilter('entity_id', $product->getId());
$collection->addAttributeToSelect('manufacturer');
$product = $collection->getFirstItem();
$manufacturer = $product->getAttributeText('manufacturer');

En el momento en que llame a getFirstItem (), la consulta se ejecutará y el producto resultante es mínimo:

[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
    )
Eydamos
fuente
1

Este funciona

echo $_product->getData('ATTRIBUTE_NAME_HERE');
th3pirat3
fuente
2
La pregunta era "sin cargar el producto completo".
Denis Óbukhov
0

Puede obtener el valor del atributo de la siguiente manera

$model = Mage::getResourceModel('catalog/product');
$attribute_value = $model->getAttributeRawValue($productId, 'attribute_code', $storeId);
Magecode
fuente
-1

$orderId = 1; // YOUR ORDER ID
$items = $block->getOrderItems($orderId);
 
foreach ($items as $item) {
    $options = $item->getProductOptions();        
    if (isset($options['options']) && !empty($options['options'])) {        
        foreach ($options['options'] as $option) {
            echo 'Title: ' . $option['label'] . '<br />';
            echo 'ID: ' . $option['option_id'] . '<br />';
            echo 'Type: ' . $option['option_type'] . '<br />';
            echo 'Value: ' . $option['option_value'] . '<br />' . '<br />';
        }
    }
}

todas las cosas que usará para recuperar el pedido del carrito de opciones personalizadas de productos de valor en Magento 2: https://www.mageplaza.com/how-get-value-product-custom-option-cart-order-magento-2.html

Vicent Nguyen
fuente
-2

Podría escribir un método que lo haría directamente a través de sql, supongo.

Se vería algo como esto:

Variables:

$store_id = 1;
$product_id = 1234;
$attribute_code = 'manufacturer';

Consulta:

SELECT value FROM eav_attribute_option_value WHERE option_id IN (
    SELECT option_id FROM eav_attribute_option WHERE FIND_IN_SET(
        option_id, 
        (SELECT value FROM catalog_product_entity_varchar WHERE
            entity_id = '$product_id' AND 
            attribute_id = (SELECT attribute_id FROM eav_attribute WHERE
                attribute_code='$attribute_code')
        )
    ) > 0) AND
    store_id='$store_id';

Sin embargo, tendría que obtener el valor de la tabla correcta según el backend_type del atributo (campo en eav_attribute), por lo que se necesita al menos 1 consulta adicional.

Lucas Moeskops
fuente
¡Gracias! Se ve bien, pero no todos los atributos son varchar y 3 inclusiones selectas no son buenas. ¿Quizás es mejor usar unirse?
Denis Óbukhov
Puede que esté equivocado, pero hasta donde yo sé, no hay una gran diferencia entre seleccionar y unirse, ya que están optimizados por el procesador de consultas. Pero con respecto a que no todos los atributos son varchar, primero debe obtener el backend_type del atributo que desea obtener y luego usar la tabla sprintf ('catalog_product_entity_% s', $ backend_type) ^^. Pero los otros tipos tampoco se pueden obtener usando FIND_IN_SET, por lo que también tendrá que encontrar algo para eso. ¡Buena suerte!
Lucas Moeskops
-2

Si tiene un atributo text / textarea llamado my_attr, puede obtenerlo de la siguiente manera: product->getMyAttr();

Shahroq
fuente
He preguntado "sin cargar el producto completo"
Denis Óbukhov