Атрибут продукта Magento Get Value



Answers

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

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

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




Кажется невозможным получить стоимость без загрузки модели продукта. Если вы посмотрите на файл 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-я строка).




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

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



Вам не нужно загружать весь продукт. Коллекции 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
    )



Вы можете написать метод, который будет делать это напрямую через 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 дополнительный запрос.




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

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



Related