Magento - 多选类别属性不保存

时间:2014-12-19 09:49:45

标签: magento attributes categories

我正在使用Magento Community 1.9.0.0。

我已经以编程方式创建了一个自定义类别属性,这是一个多选。该属性可以在我的管理类别部分中看到。当我选择任何值时 - 无论是一个还是多个并按保存,我都会收到成功保存的消息,但值永远不会保存。

然后我还尝试了一个创建类别属性的扩展。这有同样的问题。当我联系支持他们说

类别实体不支持多重选择,因此此类属性不适用于类别。

这是真的吗?多选不适用于CE-1.9上的类别属性吗?

以下是我用来以编程方式创建它的代码:

require_once('app/Mage.php');
Mage::app()->setCurrentStore(Mage::getModel('core/store')->load(Mage_Core_Model_App::ADMIN_STORE_ID));
$installer = new Mage_Sales_Model_Mysql4_Setup;
$attribute  = array(
    'type' => 'text',
    'label'=> 'Room Type',
    'input' => 'multiselect',
    'global' => Mage_Catalog_Model_Resource_Eav_Attribute::SCOPE_GLOBAL,
    'visible' => true,
    'required' => false,
    'user_defined' => true,
    'default' => "",
    'group' => "General Information",
    'option' => array ( 
        'value' => array(
            'kitchen' => array('Kitchen'), 
            'bedroom' => array('Bedroom'), 
            'bathroom' => array('Bathroom'), 
            'loft' => array('Loft'), 
            'basement' => array('Basement'), 
            'lounge' => array('Lounge')
        ) 
    )

);
$installer->addAttribute('catalog_category', 'room_type', $attribute);
$installer->endSetup();

2 个答案:

答案 0 :(得分:1)

@Rian是对的,多选择值作为数组发送,无法处理。但是,我们不必使用观察者。相反,我们应该为属性添加后端模型。 在创建属性数据数组时,将以下行添加到属性数据数组中。

'backend' => 'your_module/category_attribute_backend_related',

在后端模型(Your_Module_Model_Category_Attribute_Backend_Related)中,您应具有以下功能,以帮助正确保存或加载所选选项。

public function beforeSave($object) {
    $attributeCode = $this->getAttribute()->getName();
    if ($attributeCode == 'room_type') {
        $data = $object->getData($attributeCode);
        if (!is_array($data)) {
            $data = array();
        }
        $object->setData($attributeCode, join(',', $data));
    }
    if (is_null($object->getData($attributeCode))) {
        $object->setData($attributeCode, false);
    }
    return $this;
}

public function afterLoad($object) {
    $attributeCode = $this->getAttribute()->getName();
    if ($attributeCode == 'room_type') {
        $data = $object->getData($attributeCode);
        if ($data) {
            $object->setData($attributeCode, explode(',', $data));
        }
    }
    return $this;
}

答案 1 :(得分:0)

所以这个问题有点老了,但是我觉得迟到总比没有好。

类别可以通过多项选择精彩地工作,你只需要帮助它们。多重选择作为数组发送到类别实体,它无法处理,这意味着您最终会得到一个空的多选。你想要做的是将id合并为一个字符串。使用javascript,或者像我一样,使用观察者。

我的multiselect属性称为category_limit

这是config.xml

<events>
    <catalog_category_prepare_save>
        <observers>
            <rianorie_categorylimit_save>
                <class>rianorie_categorylimit/observer</class>
                <method>adjustCategory</method>
            </rianorie_categorylimit_save>
        </observers>
    </catalog_category_prepare_save>
</events>

这是实际工作的观察者:

class RianOrie_CategoryLimit_Model_Observer
{
    public function adjustCategory(Varien_Event_Observer $observer)
    {
        $event = $observer->getEvent();
        $category = $event->getCategory();
        $category->setCategoryLimit(
              implode(',', $category->getCategoryLimit())
        );
    }
}