我创建了一个不是必填字段的新属性(类型:下拉列表)。
此时,每件商品都会在前端显示“我的属性:n/a ”。
在某些产品中保存任何内容后,magento 在 catalog_product_entity_int 表中为此属性写入一个空值。
但是在前端,属性现在显示为“我的属性:否”而不是“N/A”。
它看起来像一个错误,因为我在编辑新产品时没有触及属性。
有没有办法处理它或在我的 phtml 中应用一些规则?
我创建了一个不是必填字段的新属性(类型:下拉列表)。
此时,每件商品都会在前端显示“我的属性:n/a ”。
在某些产品中保存任何内容后,magento 在 catalog_product_entity_int 表中为此属性写入一个空值。
但是在前端,属性现在显示为“我的属性:否”而不是“N/A”。
它看起来像一个错误,因为我在编辑新产品时没有触及属性。
有没有办法处理它或在我的 phtml 中应用一些规则?
其实这不是bug。这是一个特点。当表中没有该属性
N/A
的记录时显示。
当您添加属性时,任何产品的该属性都没有值,但是一旦您保存具有该属性的产品,就会在表中插入一个空值(如您所述)。所以不同于.
所有的魔法都发生在这里。
这些是您感兴趣的行:catalog_product_entity_int
no value
null 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()
.
相同的系统用于在比较产品列表中显示属性值。
我最终创建了 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;
}
}