Magento产品属性获得价值


Answers:



40

我知道的一种方式:

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

3
谢谢。这就是我想要的。
里卡多·马丁斯

4
我是magento的新手。为什么要使用$product两次?
Mr_Green

28
@Mr_Green因为这是Magento。没有“为什么”得到一个合理的答案。
nakajuice 2015年

@Mr_Green,这并不是说要使用两次:第二行是第一行的延续。您正在对getAttribute()返回的对象调用getFrontend()。
Scott Buchanan 2015年

26

您可以使用

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

2
这段代码很好用。我搜索了许多博客,但是没有人对我有用。非常好。
Patel Dixit 2014年

3
此代码的工作,只有当产品模型包含的属性值,当你只知道产品ID将无法正常工作
吉日Chmiel的

1
这适用于下拉列表之类的属性,但是如果属性是一个简单的文本字段,则需要其他函数。说该属性为my_name,则代码变为$ product-> getMyName()
Ken

1
@Ken,如果您需要从产品中获取动态属性,则可以使用$product->getData('my_name')
pavlindrom,2015年

那我们将获得期权ID?$ product-> getAttributeId('attr_id')???
snh_nl

9

请参阅Daniel Kocherga的答案,因为它在大多数情况下都会为您服务。

除了用于获取属性值的方法外,有时您可能还希望获取aselect或标签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';

但是,您将不得不基于属性的bac​​kend_type(eav_attribute中的字段)从正确的表中获取值,因此它至少需要执行1个附加查询。


谢谢!看起来不错,但并非所有属性都是varchar,并且3个select包含项也不是很好。也许使用join更好?
丹尼斯·奥布霍夫(DenisÓbukhov)2011年

我可能是错的,但据我所知,选择和联接之间没有太大区别,因为它们由查询处理器优化。但是,考虑到并非所有属性都是varchar,首先需要获取要获取的属性的bac​​kend_type,然后使用表sprintf('catalog_product_entity_%s',$ backend_type)^^。但是使用FIND_IN_SET也无法获得其他类型,因此您也必须为此找到一些东西。祝好运!
Lucas Moeskops,2011年

-2

如果您有一个名为my_attr的text / textarea属性,则可以通过以下方式获取它: product->getMyAttr();


我问过“不加载整个产品”
DenisÓbukhov,2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.