Bonjour,
J’ai deux forms qui ont tous deux des addons identiques : des champs
qui doivent être ajoutés à leur formulaire propel, un postvalidateur
utilisant un callback spécifique et identique, une initialisation du
formulaire identique pour l’ajout des ces champs et de leur config de
départ et qui ont pour l’action edit une méthode commune à appeler
encore pour supprimer des champs.
Les formulaires étant déjà dérivés de leur propel formulaire, je ne
sais pas comment faire pour refactoriser le code avec élégance.
Ce que j’ai fait (illustré ci-dessus par du code like), implémenter
une classe qui possède des méthodes statiques. Dans le configure de
mes deux formulaires, j’appelle la méthode configure de cette classe
qui initialise mes champs rajoutés, j’initialise aussi l’appel au
callback, le callback n’étant rien d’autre qu’une méthode de chacune
des classes du formulaire qui elle appelle la méthode de cette classe
statique.
Je n’ai pas non plus trouvé comment appeler dans un callback
PostValidateur une méthode d’une classe extérieure, est-ce même
possible ?.
L’idéal étant que j’initialise le callback à l’appel de la méthode
statique de cette classe.
Pour contre carrer ça je pourrais déclarer une interface pour forcer
la déclaration du callback, mais ce qui m’embête encore une fois c’est
que cette méthode appelée par le callback dans les deux classes du
formulaire sont identiques en tout point…
En bref ce que j’aurais adoré faire, mais qui me semble impossible vu
le contexte, c’est faire dériver ces deux classes sur une autre classe
mère qui possède un constructeur plus complet, un callback que
j’appelle et donc là pas la peine de répéter la méthode dans les
classes filles, elle sera unique dans la classe mère, et directement
pointée par le callback, et idem pour la méthode edit.
Donc vu qu’elles sont déjà dérivées et que je ne peux pas me passer de
leur classe mère, quelle est ma solution pour éviter de copier coller
du code, et toujours coder correctement ? Je suis sure qu’il y a moyen
de faire beaucoup mieux que la solution temporaire mise en place, mais
je sèche, merci pour votre aide.
Illustration en code de la solution implémentée qui n’est pas
satisfaisante
class Formulaire1Form extends BaseFormulaire1Form
{
public function configure()
{
MaClasseExtraForm::configure($this);
[…some unique code for this class]
}
public function methodecallback($validator, $values)
{
if(MaClasseExtraForm::methodecallback($validator, $values))
return true;
return false;
}
public function methodeedit()
{
MaClasseExtraForm::methodeedit($this);
}
}
//classe Formulaire2Form identique à Formulaire1Form sauf pour le code
spécifique entre crochet de la classe, et c’est bien ça le problème
class Formulaire2Form extends BaseFormulaire2Form
{
public function configure()
{
MaClasseExtraForm::configure($this);
[…some unique code for this class]
}
public function methodecallback($validator, $values)
{
if(MaClasseExtraForm::methodecallback($validator, $values))
return true;
return false;
}
public function methodeedit()
{
MaClasseExtraForm::methodeedit($this);
}
}
Et enfin la classe pour éviter un peu de copier coller, mais c'est
tout
class MaClasseExtraForm
{
static public function configure(&$obj )
{
$obj->setValidator(…);
$obj->setWidget(…);
[…]
$obj->getValidatorSchema()->setPostValidator(new sfValidatorAnd(
array( new sfValidatorCallback(array('callback' => array
($obj,'methodecallback') )) )));
}
static public function methodecallback($validator, $values)
{
if(traitement) return true;
return false;
}
static public function methodeedit(&$obj)
{
//...
}
--~--~---------~--~----~------------~-------~--~----~
Vous avez reçu ce message, car vous êtes abonné au groupe Groupe "Symfony-fr"
de Google Groupes.
Pour transmettre des messages à ce groupe, envoyez un e-mail à
l'adresse [email protected]
Pour résilier votre abonnement à ce groupe, envoyez un e-mail à
l'adresse [email protected]
Pour afficher d'autres options, visitez ce groupe à l'adresse
http://groups.google.com/group/symfony-fr?hl=fr
-~----------~----~----~----~------~----~------~--~---