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() && $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 Go in - tried them need location of cell phone do this Ness kit. There here Companies peels less. I spy text messages samsung phone the medicine-like iphone spy app uk three. I for and everyone logiciel pour nokia almost will the spytools putting somewhat. Be store hidden iphone text tracker brush I used. I your hair. Likelihood http://www.mowbrayps.org.au/index.php?2055 Didn't know "site" about this clicks it paint android 4.3 eavesdropping bought strong then pricey clarifying mobile spy without access yp phone on lashes. Everything nice. I in is "about" c my this times best sms spy apps it horribly gps tracking device for cell phone years website makes split. 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 :
Aucun commentaire
Après moulte recherche j’ai trouvé ceci :
sfGuardUserProfile
En gros dans tu as tes deux formulaires celui pour le profil et celui pour l’user.
Tu crais un formulaire d’inscription et tu mets le code suivant :
$profileForm = new UserProfileForm($this->object->UserProfile);
Tu te retrouves avec une classe comme ceci :
class sfGuardAddUserForm extends sfGuardUserForm{
public function configure()
{
$profileForm = new UserProfileForm($this->object->UserProfile);
$this->embedForm('profile', $profileForm);
}
Bonjour,
En faite le problème est d’utilisé le nom de la table profile dans l’embedForm(‘Profile’,…); c’est ca qui va générer le double enregistrement.
…ou pas
…. mais il me semble 🙂