Pour résoudre ce problème, vous pouvez également utiliser un rendu d'entrée pour cela. L'inconvénient est que vous devez le faire pour chaque type d'entrée et le définir via la configuration pour chaque attribut.
Pour ce faire, utilisez la clé input_renderer lorsque vous utilisez addAttribute un attribut ou frontend_input_renderer lorsque vous utilisez updateAttribute . Exemple:
$installer->addAttribute(Mage_Catalog_Model_Product::ENTITY, 'yourattribute', array(
// ...
// won't be used actually as you use a custom renderer (constant equals to text), but I'm not sure what omitting this will have as effect..
'input' => Mage_Catalog_Model_Product_Option::OPTION_GROUP_TEXT,
'input_renderer' => 'yourns_yourmodule/adminhtml_product_helper_form_disabledText',
'frontend_class' => 'disabled',
'note' => 'This field is disabled',
// ...
));
Ensuite, avec votre classe, Yourns_Yourmodule_Block_Adminhtml_Product_Helper_Form_DisabledText
étendez la classe d'entrée que vous utiliseriez réellement. Pour un champ de texte, ce serait Varien_Data_Form_Element_Text
. Pour les sélections, ce serait Varien_Data_Form_Element_Select
et ainsi de suite.
Ajoutez maintenant votre code comme celui-ci pour désactiver l'attribut, en écrasant la getHtml
méthode, en définissant l'attribut et en renvoyant le code HTML réel pour le champ de saisie:
public function getHtml()
{
// Set disabled
$this->setReadonly(true, true);
return parent::getHtml();
}
La méthode peut être trouvée dans lib / Varien / Data / Form / Abstract.php qui sera héritée par tous les champs des éléments d'entrée du formulaire, elle devrait donc toujours être disponible.
/**
* Disable elements
*
* @param boolean $readonly
* @param boolean $useDisabled
* @return Varien_Data_Form_Abstract
*/
public function setReadonly($readonly, $useDisabled = false)
{
if ($useDisabled) {
$this->setDisabled($readonly);
$this->setData('readonly_disabled', $readonly);
} else {
$this->setData('readonly', $readonly);
}
foreach ($this->getElements() as $element) {
$element->setReadonly($readonly, $useDisabled);
}
return $this;
}
Il est probablement judicieux d'inclure la classe désactivée dans la configuration d'attribut comme indiqué ci-dessus pour visualiser la possibilité d'entrée refusée. Vous pouvez probablement aussi l'utiliser $this->addClass('disabled')
dans la méthode, je n'ai pas encore essayé cela.