Атрибут продукта Magento получает ценность

82

Как получить конкретное значение атрибута продукта, если я знаю идентификатор продукта, не загружая продукт целиком?

Денис Обухов
источник
1
Не
лучший

Ответы:

141
Mage::getResourceModel('catalog/product')->getAttributeRawValue($productId, 'attribute_code', $storeId);
Даниэль Кочерга
источник
1
как получить текст варианта этого? кто-нибудь знает?
Жуткая точка с запятой
2
Для тех, для кого это важно: этот метод доступен только в 1.6+
JMTyler
40

Способ, который я знаю:

$product->getResource()->getAttribute($attribute_code)
        ->getFrontend()->getValue($product)
Лукас Моэскопс
источник
3
Благодарю. Это было то, что я искал.
Рикардо Мартинс
4
Я новичок в magento .. зачем использовать $productдва раза?
Mr_Green
29
@Mr_Green Потому что это Magento. Нет разумного ответа «почему».
nakajuice
@Mr_Green, это не значит, что нужно использовать его два раза: вторая строка является продолжением первой. Вы вызываете getFrontend () для объекта, возвращаемого getAttribute ().
Скотт Бьюкенен
26

вы можете использовать

<?php echo $product->getAttributeText('attr_id')  ?> 
Рахи
источник
2
этот код работает хорошо. Я искал много блогов, но ни один код не работал у меня, кроме этого. Действительно мило.
Патель Диксит
3
этот код работает только тогда, когда модель продукта содержит значение атрибута, когда вы знаете только идентификатор продукта, он не будет работать
Jiří Chmiel
1
Это работает для атрибутов, таких как раскрывающиеся списки, но если атрибут является простым текстовым полем, тогда требуется другая функция. Скажем, атрибут my_name, тогда код станет $ product-> getMyName ()
Кен
1
@Ken, если вам нужно получить от продукта динамический атрибут, то вы можете использовать$product->getData('my_name')
pavlindrom
И как мы получим идентификатор варианта? $ product-> getAttributeId ('attr_id') ???
snh_nl 08
9

См. Ответ Даниэля Кочерги , так как в большинстве случаев он сработает для вас.

В дополнение к этому методу для получения значения атрибута вы можете иногда захотеть получить метку selectили multiselect. В этом случае я создал этот метод, который храню во вспомогательном классе:

/**
 * @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;
}
Тайлер В.
источник
8

Кажется, невозможно получить ценность без загрузки модели продукта. Если вы посмотрите на файл app / code / core / Mage / Eav / Model / Entity / Attribute / Frontend / Abstract.php, вы увидите метод

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

Как видите, этот метод требует, чтобы загруженный объект получил от него данные (3-я строка).

азаколюкин
источник
5

Сначала мы должны убедиться, что нужный атрибут загружен, а затем вывести его. Использовать этот:

$product = Mage::getModel('catalog/product')->load('<product_id>', array('<attribute_code>'));
$attributeValue = $product->getResource()->getAttribute('<attribute_code>')->getFrontend()->getValue($product);
Света Оксен
источник
4

Попробуй это

 $attribute = $_product->getResource()->getAttribute('custom_attribute_code');
    if ($attribute)
    {
        echo $attribute_value = $attribute ->getFrontend()->getValue($_product);
    }
Кешав Калра
источник
2

Вам не нужно загружать весь продукт. Коллекции Magentos очень мощные и умные.

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

В тот момент, когда вы вызываете getFirstItem (), запрос будет выполнен, и результат будет минимальным:

[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
    )
Эйдамос
источник
1

Этот работает-

echo $_product->getData('ATTRIBUTE_NAME_HERE');
th3pirat3
источник
2
Вопрос был «без загрузки всего продукта».
Денис Обухов
0

Вы можете получить значение атрибута следующим образом

$model = Mage::getResourceModel('catalog/product');
$attribute_value = $model->getAttributeRawValue($productId, 'attribute_code', $storeId);
Магический код
источник
-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 />';
        }
    }
}

все, что вы будете использовать для получения заказа пользовательских опций ценного продукта в Magento 2: https://www.mageplaza.com/how-get-value-product-custom-option-cart-order-magento-2.html

Висент Нгуен
источник
-2

Я полагаю, вы могли бы написать метод, который делал бы это напрямую через sql.

Это выглядело бы примерно так:

Переменные:

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

Запрос:

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

Вам нужно будет получить значение из правильной таблицы на основе атрибута backend_type (поле в eav_attribute), хотя для этого потребуется как минимум 1 дополнительный запрос.

Лукас Моэскопс
источник
Благодаря! Выглядит хорошо, но не все атрибуты являются varchar, и 3 включения выбора не подходят. Может лучше использовать join?
Денис Обухов 03
Возможно, я ошибаюсь, но, насколько мне известно, нет большой разницы между select и join, поскольку они оптимизированы обработчиком запросов. Но, поскольку не все атрибуты являются varchar, вам сначала нужно получить backend_type атрибута, который вы хотите получить, а затем использовать таблицу sprintf ('catalog_product_entity_% s', $ backend_type) ^^. Но также нельзя получить другие типы с помощью FIND_IN_SET, поэтому вам также придется найти что-то для этого. Удачи!
Лукас Моэскопс
-2

Если у вас есть атрибут text / textarea с именем my_attr, вы можете получить его: product->getMyAttr();

Шахрок
источник
Я спросил «не загружая продукт целиком»
Денис Обухов