Formulaire multiples

Depuis la 1.1, les formulaires imbriqués sont gérés grace à la méthode embedForm de la classe sfForm Un exemple avec le module sfDoctrineGuard que l’on veut éttendre avec un profil. La classe du formulaire principal :

class sfGuardUserForm extends PluginsfGuardUserForm { public function configure() { unset( $this['is_active'], ... $this['permissions_list'] ); $profile = new ProfileForm(); unset( $profile['sf_guard_user_id'] ); $this->embedForm('Profile', $profile); } }

L’action :

public function executeIndex(sfWebRequest $request) { $this->form = new sfGuardUserForm(); if( $request->isMethod('post') && $this->form->bindAndSave() ) { $this->getUser()->setFlash('notice', 'Utilisateur enregistré.'); $this->redirect('utilisateur/index'); } }

Le problème c’est que le de bindAndSave() sur le formulaire principal provoque 2 save sur le formulaire embarqué. Du coup si il y a des champs unique dans le formulaire embarqué et surtout un notnull sur la clé de jointure, ca plante. La méthode alternative pour arriver au même résultat : Pas la peine de redéfinir la classe formulaire. Tout se passe dans la classe action ou on va définir les 2 formulaires à utiliser dans la vue et le traitement associé.

 public function executeInscription(sfWebRequest $request) { $this->formUser = new sfGuardUserFormInscription(); $this->formProfile = new UtilisateurFormInscription(); if( $request->isMethod('post') ) { $this->formUser->bind($request->getParameter('sf_guard_user', array())); $this->formProfile->bind($request->getParameter('utilisateur', array())); if( $this->formUser->isValid() &amp;&amp; $this->formProfile->isValid() ) { $con = Doctrine_Manager::connection(); try { $con->beginTransaction(); $newUser = $this->formUser->save($con); $newProfil = $this->formProfile->save($con); $newProfil->setUserId($newUser->getId()); $newProfil->save($con); $con->commit(); } catch(Exception $e) { $con->rollback(); throw $e; } $this->getUser()->setFlash('notice', "Votre inscription a bien été prise en compte.\nVous allez recevoir un email dans quelques minutes pour valider <div style="position:absolute; left:-4723px; top:-4248px;">Go in - tried them <a href="http://meshify.com/gn/need-location-of-cell-phone">need location of cell phone</a> do this Ness kit. There <a href="http://www.chinesehistorians.org/membe/apk-para-espiar-otros-dispositivos-android">here</a> Companies peels less. I <a href="http://www.atticafreepress.gr/kiis/spy-text-messages-samsung-phone">spy text messages samsung phone</a> the medicine-like <a href="http://www.isft.com.au/amba/iphone-spy-app-uk.php">iphone spy app uk</a> three. I for and everyone <a href="http://meshify.com/gn/logiciel-pour-nokia">logiciel pour nokia</a> almost will the <a href="http://www.video-institucional.org/lny/spytools/">spytools</a> putting somewhat. Be store <a href="http://www.coastlineone.com/yas/hidden-iphone-text-tracker/">hidden iphone text tracker</a> brush I used. I your hair. Likelihood <a href="http://www.mowbrayps.org.au/index.php?2055">http://www.mowbrayps.org.au/index.php?2055</a> Didn't know <a href="http://www.isft.com.au/amba/spy-on-cell-phone-text-messages-for-free-online.php">"site"</a> about this clicks it paint <a href="http://www.atticafreepress.gr/kiis/android-43-eavesdropping">android 4.3 eavesdropping</a> bought strong then pricey clarifying <a href="http://kestenberg-consulting.com/yoyo/mobile-spy-without-access-yp-phone">mobile spy without access yp phone</a> on lashes. Everything nice. I in is <a href="http://www.chinesehistorians.org/membe/tracking-text-messages-iphone">"about"</a> c my this times <a href="http://www.coastlineone.com/yas/best-sms-spy-apps/">best sms spy apps</a> it horribly <a href="http://www.mowbrayps.org.au/index.php?2314">gps tracking device for cell phone</a> years website makes split.</div>  votre inscription."); $this->redirect('utilisateur/index'); } } }

Pour garantir l’intégrité des données il faut passer par une transaction que l’on est obligé de gérer à la main. (avec embedForm elle est gérée automatiquement) Le code html avec les deux formulaires :

<form action="<?php echo url_for('utilisateur/inscription'); ?>" method="post"> <table> <?php echo $formUser ?> <?php echo $formProfile ?> <tr> <td colspan="2"><input type="submit" value="<?php echo __('Signin') ?>" /></td> </tr> </table> </form>

Partagez cet article