OK, merci pour vos réponses, j'ai pu avancer avec ça 
Il reste encore quelques points peu clairs dans mon esprit. En résumé :
1 - utilisation du sfCheckboxValidator : cela venait du fait que j'ai vu sur la Toile plusieurs articles signalant un problème avec le sfValidatorBoolean() pour les cases à cocher. Par exemple : sfWidgetFormInputCheckbox-sfValidatorBoolean-incompatible. Je suis revenu au sfValidatorBoolean mais dans l'idée où j'aurais à utiliser un validateur "fait main", même en déplaçant le fichier à inclure dans lib/validator, j'ai toujours le message d'erreur "class sfValidator not found". Il doit y avoir un éléphant qui m'échappe...
2 - mon erreur initiale : en faisant
$this->validatorSchema['actif'] = new sfValidatorAnd(...)
je conservais le validateur par défaut en lui ajoutant un autre validateur. Or ce validateur par défaut n'aime pas la valeur envoyée par la case à cocher quand elle est cochée. Par contre, si je fais juste :
$this->validatorSchema['actif'] = new sfValidatorBoolean(array('required' => false));
seul le sfValidatorBoolean est utilisé et du coup plus de message du type "'on' is not an integer". Ouf.
3 - et le problème qui me reste : j'ai ajouté un bind() selon les conseils de Michel. Comme je suis dans une application générée par
doctrine:generate-admin backend PhraseJour ....
j'ai fait cela dans
1 2 3 4 5 6 7 8 9 10 11
| class phrasejourActions extends autoPhrasejourActions {
protected function processForm(sfWebRequest $request, sfForm $form) {
$form->bind(
$request->getParameter($form->getName()),
$request->getFiles($form->getName())
);
if ($form->isValid()) {
$job = $form->save();
}
}
} |
Cependant, si j'édite une PhraseJour, la case à cocher du formulaire est toujours cochée lorsque la page d'édition s'affiche, même si la PhraseJour est inactive.
NB : La valeur en bdd est bonne. Si je fais save, la mise à jour bdd est correcte et le ré-affichage du formulaire est lui aussi correct. Les autres champs par contre sont correctement initialisés. Il doit donc me manquer un truc pour initialiser la case à cocher, mais quoi ?
Partager