Este es un comportamiento conocido (molesto) de los formularios Magento Adminhtml.
El problema es que si no se selecciona ningún valor para el multiselección, no se publica ningún valor para ese atributo cuando se envía el formulario.
En el lado del servidor, Magento carga el modelo, establece todos los valores de atributo publicados en el modelo y lo guarda.
Como no se publicó ningún valor, el valor original que se cargó en el modelo no se actualizó.
Como solución para los atributos con un modelo de fuente personalizado, suelo ofrecer una opción vacía con un valor de opción especial (por ejemplo, -1
). Ese valor no debe ser 0
o una cadena vacía.
Luego especifico un modelo de back-end para ese atributo que busca ese valor especial en el método _beforeSave()
. Si se encuentra, el modelo de backend desata el atributo en la instancia del modelo.
Aquí se muestra un ejemplo:
Fuente Modelo:
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;
}
}
backend Modelo:
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);
}
}
Si encontrar una mejor solución por favor hágamelo saber.
Entiendo, gracias por compartir su código! – adrien54