有没有更简单的方法来获取属性的前端值?

时间:2011-08-18 10:46:12

标签: magento attributes magento-1.5

我有一组属性代码,我需要获取以下值:

$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而不是其前端值。

虽然上面的代码有效,但是获取值似乎还有很长的路要走,但更重要的是它运行速度很慢。是否有更快/更明智的方法来获取产品属性的前端值?

修改
我现在有以下内容(在处理imageqty之类的特殊情况之后),这种情况在眼睛上看起来更容易,但似乎运行得更快(尽管我不知道为什么):

$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;

如果有人可以改善这一点(使其更简单/更有效),请发表回答。

3 个答案:

答案 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()