Questo è un comportamento noto (fastidioso) dei moduli Magento Adminhtml.
Il problema è che se nessun valore è selezionato per il multiselect, nessun valore per quell'attributo viene registrato quando il modulo viene inviato.
Sul lato server, Magento carica il modello, imposta tutti i valori di attributo pubblicati sul modello e lo salva.
Poiché non è stato registrato alcun valore, il valore originale caricato sul modello non è stato aggiornato.
Come soluzione per gli attributi con un modello di origine personalizzato, tendo a fornire un'opzione vuota con un valore di opzione speciale (ad esempio -1
). Questo valore non deve essere 0
o una stringa vuota.
Quindi si specifica un modello di back-end per quell'attributo che controlla quel valore speciale nel metodo. Se viene trovato, il modello di backend disattiva l'attributo sull'istanza del modello.
Ecco un esempio:
Fonte Modello:
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 Modello:
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);
}
}
se si trova una soluzione migliore per favore fatemelo sapere.
Ho capito, grazie per aver condiviso il tuo codice! – adrien54