Magento:如何获得产品中使用的属性值

时间:2012-03-04 21:52:47

标签: magento

如何获取至少在一个产品中使用的某些属性的属性值?

4 个答案:

答案 0 :(得分:59)

我相信您不是在尝试读取产品模型的属性值,而是获取特定属性的所有已使用值的列表。

“普通”属性

普通属性是所有不使用selectmultiselect输入的属性,而是文本或textarea字段或类似的属性。

对于这些属性,请使用:

// specify the attribute code
$attributeCode = 'name';

// build and filter the product collection
$products = Mage::getResourceModel('catalog/product_collection')
        ->addAttributeToFilter($attributeCode, array('notnull' => true))
        ->addAttributeToFilter($attributeCode, array('neq' => ''))
        ->addAttributeToSelect($attributeCode);

// get all distinct attribute values
$usedAttributeValues = array_unique($products->getColumnValues($attributeCode));

“选项”属性

如果是selectmultiselect属性,您仍需要将选项ID映射到选项值。如果您获得整数列表而不是人类可读标签(例如colormanufacturer属性),则会出现这种情况。

// specify the select or multiselect attribute code
$attributeCode = 'color';

// build and filter the product collection
$products = Mage::getResourceModel('catalog/product_collection')
        ->addAttributeToFilter($attributeCode, array('notnull' => true))
        ->addAttributeToFilter($attributeCode, array('neq' => ''))
        ->addAttributeToSelect($attributeCode);

$usedAttributeValues = array_unique($products->getColumnValues($attributeCode));

// ---- this is the different part compared to the previous example ----

// fetch the attribute model
$attributeModel = Mage::getSingleton('eav/config')
        ->getAttribute('catalog_product', $attributeCode);

// map the option id's to option labels
$usedAttributeValues = $attributeModel->getSource()->getOptionText(
    implode(',', $usedAttributeValues)
);

// $usedAttributeValues now contains an array of used values in human readable format

直接数据库查询示例

根据您要执行此操作的位置,以下是在不使用产品集合的情况下获取值的示例。效率稍高。
仅在资源模型中使用以下代码,与DB相关代码所属的代码一样 这是一个教育示例,展示如何使用Magento的EAV表

// specify the attribute code
$attributeCode = 'color';

// get attribute model by attribute code, e.g. 'color'
$attributeModel = Mage::getSingleton('eav/config')
        ->getAttribute('catalog_product', $attributeCode);

// build select to fetch used attribute value id's
$select = Mage::getSingleton('core/resource')
        ->getConnection('default_read')->select()
        ->from($attributeModel->getBackend()->getTable(), 'value')
        ->where('attribute_id=?', $attributeModel->getId())
        ->distinct();

// read used values from the db
$usedAttributeValues = Mage::getSingleton('core/resource')
        ->getConnection('default_read')
        ->fetchCol($select);

// map used id's to the value labels using the source model
if ($attributeModel->usesSource())
{
    $usedAttributeValues = $attributeModel->getSource()->getOptionText(
        implode(',', $usedAttributeValues)
    );
}

// $usedAttributeValues now contains an array of used option value labels

答案 1 :(得分:14)

使用此行。

$_product->getAttributeText('attribute_code');

希望这会有所帮助

感谢

答案 2 :(得分:2)

如果'height'是产品属性。我们可以使用以下代码来获得产品高度。

$product->getHeight();

如果'weight'是产品属性。我们可以使用以下代码来获得产品重量。

$product->getWeight();

答案 3 :(得分:1)

我需要一个函数来获取属性的所有值,这些值在特定类别中使用。 我写了这个函数,这不是问题作者所需要的 但也许它会对某人有所帮助。

    private function _getUsedAttribute($attributeCode, $categoryName)
{
    $category = Mage::getModel('catalog/category')->loadByAttribute('name', $categoryName);
    $attributeModel = Mage::getSingleton('eav/config')->getAttribute('catalog_product', $attributeCode);

    $sql = "SELECT DISTINCT(cpev.value)
            FROM catalog_product_entity_varchar cpev
            LEFT JOIN catalog_category_product ccp ON ccp.product_id = cpev.entity_id
            WHERE 
                cpev.attribute_id = {$attributeModel->getId()} AND
                ccp.category_id = {$category->getId()} AND
                cpev.value IS NOT NULL AND
                cpev.value <> ''";

    $data = $this->_getReadConnection()->fetchAll($sql);
    $usedAttributes = array(); 

    foreach ($data as $_item) {
        $_ids = explode(',', $_item['value']);
        foreach ($_ids as $_id) {
            if (empty($usedAttributes[$_id])) {                    
                $usedAttributes[$_id] = $attributeModel->getSource()->getOptionText($_id);
            }
        }            
    }
    natsort($usedAttributes);

    return $usedAttributes;  
}    

/**
 * read connection     
 */
protected function _getReadConnection() {
    return Mage::getSingleton('core/resource')->getConnection('core_read');
}  


print_r($this->_getUsedAttribute('device_brand', 'Phones'));

阵列(     [204] =&gt;宏碁     [40] =&gt;阿尔卡特     [237] =&gt; Allview     [128] =&gt;苹果     [225] =&gt;华硕 ......)