Атрибут продукту Magento Отримати вартість


Відповіді:



40

Я знаю про це:

$product->getResource()->getAttribute($attribute_code)
        ->getFrontend()->getValue($product)

3
Дякую. Це те, що я шукав.
Рікардо Мартінс,

4
Я новачок у magento .. навіщо використовувати $productдва рази?
Mr_Green

28
@Mr_Green Бо це Magento. Ні "чому" отримує розумну відповідь.
nakajuice

@Mr_Green, це не означає використовувати його двічі: другий рядок є продовженням першого. Ви викликаєте getFrontend () для об’єкта, який повертає getAttribute ().
Скотт Бьюкенен

26

ви можете використовувати

<?php echo $product->getAttributeText('attr_id')  ?> 

2
цей код працює добре. Я шукав у багатьох блогах, але жоден код для мене не працював, крім цього. Дійсно приємно.
Patel Dixit

3
цей код працює лише тоді, коли модель товару містить значення атрибута, коли ви знаєте лише ідентифікатор товару, це не буде працювати
Jiří Chmiel

1
Це працює для таких атрибутів, як випадаючі списки, але якщо атрибут є простим текстовим полем, тоді потрібна інша функція. Скажімо, атрибут my_name, тоді код стає $ product-> getMyName ()
Кен

1
@Ken, якщо вам потрібно отримати динамічний атрибут із продукту, тоді ви можете використовувати$product->getData('my_name')
pavlindrom

І як би ми отримали ідентифікатор варіанту? $ product-> getAttributeId ('attr_id') ???
snh_nl

9

Будь ласка , дивіться Daniel Кочерга в відповідь , як це буде працювати для вас в більшості випадків.

На додаток до цього методу для отримання значення атрибута, іноді вам може знадобитися отримати мітку 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
    )


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?
Денис Обухов

Можливо, я помиляюся, але, наскільки я знаю, немає великої різниці між select та join, оскільки вони оптимізовані процесором запитів. Але що стосується не всіх атрибутів, які є varchar, то спочатку потрібно отримати тип backkend_атрибута, який потрібно отримати, а потім використовувати таблицю sprintf ('catalog_product_entity_% s', $ backend_type) ^^. Але також інші типи неможливо отримати за допомогою FIND_IN_SET, тому вам також доведеться знайти щось для цього. Удачі!
Lucas Moeskops

-2

Якщо у вас є атрибут text / textarea з ім'ям my_attr, ви можете отримати його за допомогою: product->getMyAttr();


Я запитав "без завантаження цілого товару"
Денис Обухов,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.