我有一组属性代码,我需要获取以下值:
$attributes = array(
'Category' => 'type',
'Manufacturer' => 'brand',
'Title' => 'meta_title',
'Description' => 'description',
'Product Link' => 'url_path',
'Price' => 'price',
'Product-image link' => 'image',
'SKU' => 'sku',
'Stock' => 'qty',
'Condition' => 'condition',
'Shipping cost' => 'delivery_cost');
在遍历产品集合之后,我得到了属性的前端值,如下所示:
$attributeId = Mage::getResourceModel('eav/entity_attribute')
->getIdByCode('catalog_product', $attribute_code);
$attribute = Mage::getModel('catalog/resource_eav_attribute')
->load($attributeId);
$value = $attribute->getFrontend()->getValue($product);
简单地使用$product->getDate($attribute)
将无法使用下拉列表和多项选择,它只返回其ID而不是其前端值。
虽然上面的代码有效,但是获取值似乎还有很长的路要走,但更重要的是它运行速度很慢。是否有更快/更明智的方法来获取产品属性的前端值?
修改
我现在有以下内容(在处理image
和qty
之类的特殊情况之后),这种情况在眼睛上看起来更容易,但似乎运行得更快(尽管我不知道为什么):
$inputType = $product->getResource()
->getAttribute($attribute_code)
->getFrontend()
->getInputType();
switch ($inputType) {
case 'multiselect':
case 'select':
case 'dropdown':
$value = $product->getAttributeText($attribute_code);
if (is_array($value)) {
$value = implode(', ', $value);
}
break;
default:
$value = $product->getData($attribute_code);
break;
}
$attributesRow[] = $value;
如果有人可以改善这一点(使其更简单/更有效),请发表回答。
答案 0 :(得分:12)
对于下拉菜单和多项选择,仅限产品(这不是一般的EAV技巧),您可以使用getAttributeText()
。
$value = $product->getAttributeText($attribute_code);
答案 1 :(得分:3)
在版本1.7中,$product->getAttributeText($attribute_code)
在产品页面上不适用于我。起初我以为是因为该属性不在catalog_product_flat索引中。但事实证明,属性就在那里。无论如何,以下代码适用于我。我尝试简单的代码,然后再回到EAV代码。
所以我使用的代码如下:
$value = $product->getAttributeText($attribute_code); // first try the flat table?
if(empty($value) ) { // use the EAV tables only if the flat table doesn't work
$value = $product->getResource()->getAttribute($attribute_code)->getFrontend()->getValue($product);
}
答案 2 :(得分:0)
这取决于您如何设置属性(可以从您尝试访问它的上下文访问它?),但最简单的方法通常是这样的(例如,对于meta_title):
$product->getMetaTitle()