Zend_Form : disable ou disabled ?

Je viens de tomber sur quelque chose d'assez bizarre, à tel point que je me demande si je suis bien réveillé ce lundi matin. J'ai un vilain bogue que j'essaie d'éradiquer pour bien commencer ma semaine. Le problème concerne une case à cocher. C'est un des éléments de formulaire le plus mal foutu car il n'est soumis que lorsqu'il est coché. Pour pallier à ce problème, l'aide de vue formCheckbox ajoute un champ caché juste avant l'input de de type checkbox avec la valeur correspondant à la case décochée. Ce qui nous donne l'HTML suivant :

<input type="hidden" name="ma_case_a_cocher" value="0">
<input type="checkbox" name="ma_case_a_cocher" id="ma_case_a_cocher" value="1">

Grace à cette astuce, quand la case est cochée, la valeur 1 est passée dans le champ ma-case-a-cocher. Si la case n'est pas cochée, l'input de type checkbox est ignoré et c'est donc la valeur de l'input de type hidden qui est prise en compte (0 dans notre cas).

Le problème avec cette approche, c'est que lorsque vous désactivez l'élément de formulaire, aucune valeur ne doit être soumise par l'élément et donc il ne faut pas générer le champ hidden. Zend_View_Helper_FormCheckbox gère correctement ce cas, mais avec une particularité assez déroutante.

En effet, l'attribut qui permet de désactiver un élément de formulaire se nomme disabled. On devrait donc pouvoir désactiver un élément de formulaire avec le code suivant :

<?php
$form
->ma_case_a_cocher->setAttrib('disabled''disabled');
?>

Si vous essayez ce code, vous constaterez qu'il semble fonctionner. L'attribut disabled est bien positionné dans le HTML résultant. Cependant, dans le cas d'une case à cocher, le champ caché est bien généré alors qu'il ne devrait pas l'être.

J'ai trouvé la source du problème en examinant le code de Zend_View_Helper_FormElement : la méthode _getInfo recherche un attribut nommé disable au lieu de disabled pour considérer qu'un champ est désactivé.

Le code correct est donc :

<?php
$form
->ma_case_a_cocher->setAttrib('disable''disable');
?>

Et oui, il y a un rapport de bogue ouvert sur le sujet : http://framework.zend.com/issues/browse/ZF-9149. En attendant vous êtes prévenus...

Add new comment