IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

deux validations de formulaire dans un même module


Sujet :

Symfony PHP

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 188
    Par défaut deux validations de formulaire dans un même module
    Je me pose des questions niveau architecture:

    Considérons un module "événement" et considérons la possibilité à un membre de s'y inscrire.

    Le formulaire correspondant à l'inscription du membre à l'événement se trouve donc dans le template showSuccess.php du module événement.
    Par contre, je me demande comment gérer l'action create qui permet d'ajouter un membre à un événement?
    En fait, j'ai déjà une action create dans mon fichier actions.php de mon module événement qui elle s'occupe de créer un nouvel événement.

    Je ne pense pas que créer un nouveau module pour gérer cette inscription est la meilleure manière de faire.

    Que mettriez-vous comme paramètre à form_tag_for?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php echo form_tag_for($form, '???') ?>
    Merci

  2. #2
    Invité
    Invité(e)
    Par défaut
    T'as qu'a rajouter une action executeAddParticipant(), tu fais une route qui va bien genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    event-add-participant:
      url: /evenement/add-participant
      params: { module: event, action: addParticipant }
    Et tu fais un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <?php echo form_tag_for($form, '@event-add-participant') ?>
    Je ne vois pas en quoi ça ne fonctionnerait pas en tout cas.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 188
    Par défaut
    Il me dit que The route "event-add-participant_create" does not exist.

    Sinon pour l'url dans le routing, c'est plutôt event/1 car mon formulaire fait parti du template showSuccess.php de mon event ?

    Merci

  4. #4
    Invité
    Invité(e)
    Par défaut
    Ah oui en effet, j'utilise jamais le form_tag_for().

    Alors en fait, si tu lui mets '@event-add-participant', il va chercher '@event-add-participant_create' quand c'est une création et '@event-add-participant_update' dans le cas d'une mise à jour (toi ça ne devrait jamais se produire mais bon ...)

    Est-ce que tu ne peux pas plutôt remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    echo form_tag_for($form, '@event-add-participant');
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    echo $form->renderFormTag(url_for('@event-add-participant', array('method' => 'post')));
    Sinon pour l'url dans le routing, c'est plutôt event/1 car mon formulaire fait parti du template showSuccess.php de mon event ?
    Je ne comprends absolument pas ce que tu veux dire là

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 188
    Par défaut
    Pour éviter l'erreur, j'ai déjà utilisé le helper form_tag au lieu de form_tag_for:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <?php echo form_tag('@event-add-participant',
    					array('method' => 'post',
    						  'multipart' => true
    						  )); ?>
    Cela doit être la même chose que le :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo $form->renderFormTag(url_for('@event-add-participant', array('method' => 'post')));

    (J'ai vu ton message après )

    Donc, maintenant, je dois m'occuper de l'action executeAddParticipant.


    J'ai un objet EventParticipant qui a pour attribut event_id, member_id
    et is_notified (case checkbox à cocher).

    Je suppose que je dois appeler la methode processForm.

    Pour le tuto jobeet, elle ressemblait à ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     protected function processForm(sfWebRequest $request, sfForm $form)
      {
        $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));
        if ($form->isValid())
        {
          $job = $form->save();
     
          $this->redirect('job/edit?id='.$job->getId());
        }
      }
    Mais pour mon cas?

    Merci

  6. #6
    Invité
    Invité(e)
    Par défaut
    Et le code de ton formulaire, on peut le voir ?

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 188
    Par défaut
    Voici mon form:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    class EventParticipantForm extends BaseEventParticipantForm
    {
      public function configure()
      {
     
    	  unset( $this['is_guested'], $this['is_accepted']	);
     
    	  $this->widgetSchema['accept'] = new sfWidgetFormInputCheckbox();
     
    	  $this->widgetSchema['member_id'] = new sfWidgetFormChoice(array(
    																		'choices'  => Doctrine_Core::getTable('Participant')->getAll(),
    																		'multiple' => false,
    																		'expanded' => false
    																		));
     
    	  $this->widgetSchema['is_notified'] = new sfWidgetFormChoice(array(
    																 'choices'  => Doctrine_Core::getTable('EventParticipant')->getTypes(),
    																 'multiple' => false,
    																 'expanded' => true
    																 ));
    	  $this->widgetSchema->setLabels(array(
    										   'is_notified'    => 'Je souhaite recevoir les conclusions de cet événement',
    										   'motivation'    => 'Motivation (300 car)',
    										   'accept'    => 'Je souhaite m\'inscrire à cet événement',
    										   ));
     
      }
    }

    Voici le parent de mon form:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    abstract class BaseEventParticipantForm extends BaseFormDoctrine
    {
      public function setup()
      {
        $this->setWidgets(array(
          'event_id'     => new sfWidgetFormInputHidden(),
          'member_id'   => new sfWidgetFormInputText(),
          'is_notified' => new sfWidgetFormInputText(),
          'is_accepted' => new sfWidgetFormInputText(),
          'is_guested'  => new sfWidgetFormInputText(),
          'motivation'  => new sfWidgetFormTextarea(), 
        ));
     
        $this->setValidators(array(
          'member_id'   => new sfValidatorDoctrineChoice(array('model' => $this->getModelName(), 'column' => 'member_id', 'required' => false)),
          'is_notified' => new sfValidatorInteger(array('required' => false)),
          'is_accepted' => new sfValidatorInteger(array('required' => false)),
          'is_guested'  => new sfValidatorInteger(array('required' => false)),
          'motivation'  => new sfValidatorString(array('max_length' => 300, 'required' => false)),
        ));
     
        $this->widgetSchema->setNameFormat('event_participants[%s]');
     
        $this->errorSchema = new sfValidatorErrorSchema($this->validatorSchema);
     
        $this->setupInheritance();
     
        parent::setup();
      }
     
      public function getModelName()
      {
        return 'EventParticipant';
      }
     
    }
    Le membre est choisi dans une liste déroulante pour le moment dans le form mais ensuite il sera mis dans la session de l'utilisateur.

    Merci.

  8. #8
    Invité
    Invité(e)
    Par défaut
    Tu devrais pouvoir utiliser le même processForm alors non ?
    Tu as juste le $this->redirect() à changer je pense.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 188
    Par défaut
    Le formulaire n'est pas correctement validé.

    J'ai changé cette ligne dans le form Base pour obliger l'utilisateur à remplir la textarea "motivation":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       'motivation'  => new sfValidatorString(array('max_length' => 300, 'required' => true)),

    Or, en remplissant le form et en ne remplissant pas ce textarea, je ne vois pas le formulaire se réafficher en affichant le mot required pour le champ motivation mais c'est bien la page addParticipantSuccess.php qui est affiché
    et aucune donnée n'a été entrée en base..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if ($form->isValid())
    		{
    			$form->save();
     
    			$this->setTemplate('index');
    		}

    Comment faire ?

    Merci

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 188
    Par défaut
    J'ai mis "$this->setTemplate('index'); " dans les accolades pour forcer un affichage à l'index du site mais il n'a pas lieu.

  11. #11
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par psgman113 Voir le message
    Le formulaire n'est pas correctement validé.

    J'ai changé cette ligne dans le form Base pour obliger l'utilisateur à remplir la textarea "motivation":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       'motivation'  => new sfValidatorString(array('max_length' => 300, 'required' => true)),
    Il ne faut pas changer le form Base car à la prochaine génération de ton modèle tu perdras cette modification.
    Tu devrais plutot ajouter cette ligne dans le configure() du EventParticipantForm
    Citation Envoyé par psgman113 Voir le message
    Or, en remplissant le form et en ne remplissant pas ce textarea, je ne vois pas le formulaire se réafficher en affichant le mot required pour le champ motivation mais c'est bien la page addParticipantSuccess.php qui est affiché
    et aucune donnée n'a été entrée en base..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if ($form->isValid())
    		{
    			$form->save();
     
    			$this->setTemplate('index');
    		}

    Comment faire ?

    Merci
    Il y a bien un $form->bind() avant le $form->isValid() ? Que contient ton template addParticipantSuccess ?

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 188
    Par défaut
    Oui, le bind est présent:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    		$form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));
     
    		if ($form->isValid())
    		{
    			$form->save();
     
    			$this->setTemplate('index');
    		}

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 188
    Par défaut
    J'ai essayé de tester le formulaire avec un test fonctionnel:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    
    $browser = new sfTestFunctional(new sfBrowser());
    
    	$browser->info('2 - Inscription Member to an event')->	
    	get('/event/2')->
    	with('request')->begin()->
        isParameter('module', 'event')->
        isParameter('action', 'show')->
    	end()->
    	
    	click('Valider', array('event-add-participant' => array(
    	 'member_id'    => '1',
    	 'event_id'     => '1',
    	 'motivation'    => 'très motivé',
    	 'is_notified'   => '0',
    	 'is_accepted'    => '0',
    	 'is_guested'      => '0',
    	 )))->
    	 
    	 
    	
    	with('form')->debug()	->
    	end;

    Voici le résultat en console:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    # get /show/2
    ok 5 - request parameter module is event
    ok 6 - request parameter action is show
    # post /show/addParticipant
     Form debug 
    Submitted values: array (  'member_id' => '0',  'motivation' => '',  'event_id' => '',  '_csrf_token' => '38f31af737589ad1470fcd42fe04874f',)
    Errors: member_id [Invalid.]
    Les valeurs entrées dans mon formulaire dans le test n'ont apparemment pas été prises en compte.
    Je ne sais pas quel string passé en rouge..

Discussions similaires

  1. deux formulaires dans la même jsp
    Par safa baccouche dans le forum Struts 1
    Réponses: 4
    Dernier message: 07/06/2011, 17h18
  2. [1.x] symfony : inclure deux formulaires dans la même page
    Par kari.mourad dans le forum Débuter
    Réponses: 1
    Dernier message: 27/03/2011, 04h33
  3. Envoie de deux formulaires dans le même email.
    Par michab18 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 20/10/2009, 22h41
  4. Deux formulaires dans la même page IE7
    Par antow42 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 16/03/2009, 11h29
  5. Soumettre deux formulaires dans la même fonction.
    Par Bisûnûrs dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 15/11/2006, 23h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo