0

我创建了一个不是必填字段的新属性(类型:下拉列表)。

此时,每件商品都会在前端显示“我的属性:n/a ”。

在某些产品中保存任何内容后,magento 在 catalog_product_entity_int 表中为此属性写入一个空值。

但是在前端,属性现在显示为“我的属性:否”而不是“N/A”。

它看起来像一个错误,因为我在编辑新产品时没有触及属性。

有没有办法处理它或在我的 phtml 中应用一些规则?

4

2 回答 2

1

其实这不是bug。这是一个特点。当表中没有该属性
N/A的记录时显示。 当您添加属性时,任何产品的该属性都没有值,但是一旦您保存具有该属性的产品,就会在表中插入一个空值(如您所述)。所以不同于. 所有的魔法都发生在这里。 这些是您感兴趣的行:catalog_product_entity_int
no valuenull value
Mage_Catalog_Block_Product_View_Attributes::getAdditionalData()

if (!$product->hasData($attribute->getAttributeCode())) { // no value in the database
    $value = Mage::helper('catalog')->__('N/A');
} elseif ((string)$value == '') { // empty value in the database
    $value = Mage::helper('catalog')->__('No');  
}

如果您想更改任何内容,请覆盖此方法。
如果您更改任何内容,您可能需要查看Mage_Catalog_Block_Product_Compare_List::getProductAttributeValue().
相同的系统用于在比较产品列表中显示属性值。

于 2013-08-12T19:12:30.477 回答
0

我最终创建了 2 个观察者...一个覆盖Mage_Eav_Model_Entity_Attribute_Frontend_Default中的getValue,另一个覆盖Mage_Catalog_Block_Product_View_Attributes中的getAdditionalData,如下所示:

<?php
class Namespace_Module_Model_Entity_Attribute_Frontend_Default extends Mage_Eav_Model_Entity_Attribute_Frontend_Default{
    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     = Mage::getModel('eav/entity_attribute_source_boolean');
                $options = $opt->getAllOptions();
                if ($options && !is_null($value)) { //added !is_null
                    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;
    }
}

<?php
class Namespace_Module_Block_Product_View_Attributes extends Mage_Catalog_Block_Product_View_Attributes
{
    public function getAdditionalData(array $excludeAttr = array())
    {
        $data = array();
        $product = $this->getProduct();
        $attributes = $product->getAttributes();
        foreach ($attributes as $attribute) {
            if ($attribute->getIsVisibleOnFront() && !in_array($attribute->getAttributeCode(), $excludeAttr)) {
                $value = $attribute->getFrontend()->getValue($product);

                if (!$product->hasData($attribute->getAttributeCode()) || (string)$value == '') { //modified
                    $value = Mage::helper('catalog')->__('N/A');
                } elseif ($attribute->getFrontendInput() == 'price' && is_string($value)) {
                    $value = Mage::app()->getStore()->convertPrice($value, true);
                }

                if (is_string($value) && strlen($value)) {
                    $data[$attribute->getAttributeCode()] = array(
                        'label' => $attribute->getStoreLabel(),
                        'value' => $value,
                        'code'  => $attribute->getAttributeCode()
                    );
                }
            }
        }
        return $data;
    }   
}
于 2013-08-19T12:07:10.053 回答