Это известное (раздражающее) поведение форм Magento Adminhtml.
Проблема заключается в том, что если не выбрано значение для множественного выбора, никакое значение для этого атрибута не публикуется при отправке формы.
На стороне сервера Magento затем загружает модель, устанавливает все опубликованные значения атрибута в модели и сохраняет ее.
Поскольку никакое значение не было опубликовано, исходное значение, которое было загружено в модель, не было обновлено..
В качестве решения для атрибутов с пользовательской исходной моделью я стараюсь предоставить пустую опцию со значением специальной опции (например, -1
).Это значение не должно быть 0
или пустой строкой.
Затем я указываю внутреннюю модель для этого атрибута, которая проверяет это специальное значение в методе _beforeSave()
.Если найдено, бэкэнд-модель отменяет атрибут в экземпляре модели.
Вот пример:
Исходная модель:
class Your_Module_Model_Entity_Attribute_Source_Example
extends Mage_Eav_Model_Entity_Attribute_Source_Abstract
{
const EMPTY = '-1';
public function getAllOptions()
$options = array(
array('value' => 1, 'label' => 'One'),
array('value' => 2, 'label' => 'Two'),
array('value' => 3, 'label' => 'Three')
);
if ($this->getAttribute()->getFrontendInput() === 'multiselect')
{
array_unshift($options, array('value' => self::EMPTY, 'label' => ''));
}
return $options;
}
}
Бэкэнд-модель:
class Your_Module_Model_Entity_Attribute_Backend_Example
extends Mage_Eav_Model_Entity_Attribute_Backend_Abstract
{
public function beforeSave($object)
{
$code = $this->getAttribute()->getAttributeCode();
$value = $object->getData($code);
if ($value == Your_Module_Model_Entity_Attribute_Source_Example::EMPTY)
{
$object->unsetData($code);
}
return parent::beforeSave($object);
}
}
Если вы найдете лучший обходной путь, пожалуйста, дайте мне знать.