如何获取至少在一个产品中使用的某些属性的属性值?
答案 0 :(得分:59)
我相信您不是在尝试读取产品模型的属性值,而是获取特定属性的所有已使用值的列表。
普通属性是所有不使用select
或multiselect
输入的属性,而是文本或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));
如果是select
或multiselect
属性,您仍需要将选项ID映射到选项值。如果您获得整数列表而不是人类可读标签(例如color
或manufacturer
属性),则会出现这种情况。
// 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;华硕 ......)