Подтвердить что ты не робот

Magento: получить пользовательское значение атрибута без загрузки всего продукта

В настоящее время я использую это для получения значения настраиваемого атрибута:

$_item = $this->getProduct()->getId();
$_product = $_product = Mage::getModel('catalog/product')->load($_item);  
$optionvalue = $_product->getCustomAttributeValue();
echo $optionvalue;

Интересно, есть ли более простой способ получить это пользовательское значение без загрузки всего продукта?

4b9b3361

Ответ 1

Это зависит от того, какая версия Magento вы используете. Различные версии имеют разные предложения. Если вы используете версию сообщества версии 1.6+, модуль каталога имеет очень хороший метод для вас!

Попробуйте следующее:

$_item = $this->getProduct()->getId();
$_resource = $this->getProduct()->getResource();
$optionValue = $_resource->getAttributeRawValue($_item, 'custom_attribute_value', Mage::app()->getStore());
echo $optionvalue;

Если вам интересно, вы можете погрузиться в Mage_Catalog_Model_Resource_Abstract, чтобы посмотреть, что делает этот маленький парень. Это, по сути, просто запрос (по общему признанию, довольно сложный, как правило, EAV) для получения одного атрибута, который вы запрашивали (или нескольких атрибутов, которые вы просили, поскольку вы также можете передать массив).

Ответ 2

Я просто хочу улучшить ответ @JMTyler, потому что я узнал, что вам не нужна реальная модель продукта, чтобы получить getResource()

Итак, вы можете просто сделать это с идентификатором продукта и использовать одноэлементный (это было бы лучше, если вы делаете это в цикле, чтобы вы на самом деле не создавали модель много раз)

$product_id = 10075;
$_resource = Mage::getSingleton('catalog/product')->getResource();
$optionValue = $_resource->getAttributeRawValue($product_id,  [ATTRIBUTE_ID/ATTRIBUTE_CODE], Mage::app()->getStore());
echo $optionValue;

Ответ 3

Другим простым способом является добавление этого "custom_attribute" в список атрибутов, которые можно получить по умолчанию, когда вы проверяете данные продукта из позиции предложения.

Если вы уже создали настраиваемый модуль в файле config.xml, добавьте это.

<global>
    ...
    <sales>
        <quote>
            <item>
                <product_attributes>
                    <custom_attribute />
                </product_attributes>
            </item>
        </quote>
    </sales>
    ...
</global>

Ответ 4

Это может не обеспечить многого, если есть какое-либо преимущество в производительности; однако он получит только значение атрибута и другие столбцы:

$collection = Mage::getModel('catalog/product')
    ->getCollection()
    ->addAttributeToFilter('entity_id', $_item);
$collection->getSelect()
    ->reset('columns')
    ->columns(array('[custom attribute code]'));
$value = $collection->getFirstItem()
    ->getData('[custom attribute code]');

Вы также можете использовать прямой SQL, хотя я бы не рекомендовал его, если производительность не была реальной проблемой:

$connection = Mage::getSingleton('core/resource')->getConnection('core_read');
$sql = <<<SQL
    SELECT `value`
    FROM catalog_product_entity_[backend type]
    WHERE entity_id = {$_item}
      AND attribute_id = [attribute ID]
SQL;
$row = $connection->fetchRow($sql);
$value = $row['value'];