Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks > symfony
symfony Forum d'entraide sur le framework PHP symfony. Avant de poster : cours symfony et FAQ symfony
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 04/08/2011, 20h13   #1
Membre du Club
 
Inscription : février 2008
Messages : 207
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 207
Points : 66
Points : 66
Par défaut juxtaposer 2 formulaires "identiques" mais n'en valider qu'un des deux

Bonjour,

Je me retrouve face à un problème un peu épineux.

Je dois gérer la gestion de dons en ligne selon deux fréquences: une fois, ou chaque mois.

Dans ma bdd, j'ai une table don, avec montant_libre, montant_choix, donateur_id, frequence_id.

Cette table est reliée à une table fréquence, bien sûr (ponctuel / mensuel) et à la table des donateurs.

Actuellement, j'ai contourné mon problème d'une façon qui ne satisfait pas le client. J'ai créé deux boutons: "je donne une fois", "je donne chaque mois", et quand on clique sur l'un des deux, on a le formulaire adéquat avec les montants proposés adéquats (qui sont différents selon la fréquence)

On remplit le formulaire, le valide, et on est redirigé vers une page qui nous demande de cliquer sur un bouton paypal qui gère le don ponctuel ou mensuel.

MAIS le client ne veut pas de ces deux boutons de fréquence. Il veut qu'on ait les deux grilles côte à côte avec un entête "je donne une fois" / "je donne chaque mois".

Au départ, naïvement, j'ai juxtaposé les deux formulaires avec les deux boutons de validation. Bien évidemment, comme l'autre formulaire n'était pas rempli, j'ai eu des messages d'erreur "required".

Ensuite, j'ai tenté de ne faire qu'un seul formulaire, mais je me suis alors retrouvé avec mes champs en double.

En effet, mon formulaire est alors celui-ci:

Code :
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
                                                <form action="<?php echo url_for('donationTest/createDon') ?>" method="POST">
 
                                                    <fieldset>
                                                        <div class="form-row">
<?php if (isset($formDonPonctuel['montant_choix'])): ?>
                                                            <b><?php echo $formDonPonctuel['montant_choix']->renderLabel('Montant: ') ?></b>
                                                            <br/>
 
                                                            <?php echo $formDonPonctuel['montant_choix']->render() ?>
 
                                                            <div class ="form-field-errors">
                                                                <?php echo $formDonPonctuel['montant_choix']->renderError() ?>
                                                            </div>
                                                        </div>
                                                        <?php endif; ?>
                                                        <div class="form-row">
<?php if (isset($formDonPonctuel['montant_libre'])): ?>
                                                            <b><?php echo $formDonPonctuel['montant_libre']->renderLabel('Montant libre: ') ?></b>
                                                            <br/>
 
                                                            <?php echo $formDonPonctuel['montant_libre']->render() ?>&nbsp;€
 
                                                            <div class ="form-field-errors">
                                                                <?php echo $formDonPonctuel['montant_libre']->renderError() ?>
                                                            </div>
                                                            <?php endif; ?>
                                                        </div>
                                                        <div class="form-row">
<?php if (isset($formDonPonctuel['frequence_don_id'])): ?>
                                                            <b><?php echo $formDonPonctuel['frequence_don_id']->renderLabel('Fréquence: ') ?></b>
                                                            <br/>
 
                                                            <?php echo $formDonPonctuel['frequence_don_id']->render() ?>
 
                                                            <div class ="form-field-errors">
                                                                <?php echo $formDonPonctuel['frequence_don_id']->renderError() ?>
                                                            </div>
                                                            <?php endif; ?>
                                                        </div>
                                                    </fieldset>
 
                                                    <br/>
 
                                                    <fieldset>
                                                        <div class="form-row">
<?php if (isset($formDonMensuel['montant_choix'])): ?>
                                                            <b><?php echo $formDonMensuel['montant_choix']->renderLabel('Montant: ') ?></b>
                                                            <br/>
 
                                                            <?php echo $formDonMensuel['montant_choix']->render() ?>
 
                                                            <div class ="form-field-errors">
                                                                <?php echo $formDonMensuel['montant_choix']->renderError() ?>
                                                            </div>
                                                            <?php endif; ?>
                                                        </div>
                                                        <div class="form-row">
<?php if (isset($formDonMensuel['montant_libre'])): ?>
                                                            <b><?php echo $formDonMensuel['montant_libre']->renderLabel('Montant libre: ') ?></b>
                                                            <br/>
 
                                                            <?php echo $formDonMensuel['montant_libre']->render() ?>&nbsp;€
 
                                                            <div class ="form-field-errors">
                                                                <?php echo $formDonMensuel['montant_libre']->renderError() ?>
                                                            </div>
                                                            <?php endif; ?>
                                                        </div>
                                                        <div class="form-row">
<?php if (isset($formDonMensuel['frequence_don_id'])): ?>
                                                            <b><?php echo $formDonMensuel['frequence_don_id']->renderLabel('Fréquence: ') ?></b>
                                                            <br/>
 
                                                            <?php echo $formDonMensuel['frequence_don_id']->render() ?>
 
                                                            <div class ="form-field-errors">
                                                                <?php echo $formDonMensuel['frequence_don_id']->renderError() ?>
                                                            </div>
                                                            <?php endif; ?>
                                                        </div>
                                                    </fieldset>
<?php if (isset($formDonponctuel['id'])): ?>
                                                    <?php echo $formDonPonctuel->renderHiddenFields() ?>
                                                    <?php endif; ?>
 
                                                    <?php if (isset($formDonMensuel['id'])): ?>
                                                    <?php echo $formDonMensuel->renderHiddenFields() ?>
                                                    <?php endif; ?>
 
                                                    <br/>
 
                                                    <div>
                                                        <button type="submit">
                                                            Procéder au paiement
                                                        </button>
                                                    </div>
                                                </form>
La raison des if(isset(...)), c'est parce que symfony me disait que les valeurs étaient inconnues, comme je ne remplissais que la moitié du formulaire.

A présent, deux soucis:
- les champs sont en double, car j'ai deux champs don[montant_libre], deux champs don[montant_choix], et surtout deux champs don[frequence_don_id] !
- quand je remplis une partie du formulaire, c'est le second don[frequence_don_id] qui est pris en compte, à savoir "je donne chaque mois".

Du coup, je tourne en rond... les valeurs des montants proposés sont différentes selon la fréquence de donation, ce qui fait que je ne peux proposer une seule grille... par contre, il y a sûrement un moyen pour n'avoir qu'un champ don[montant_libre], mais c'est la transmission de l'information de la fréquence qui me pose problème...

Je vais bien sûr continuer à chercher, mais si quelqu'un a rencontré ce type de problème, je ne serais pas contre une suggestion.

Merci par avance et désolé de ce long post!

Johnny
johnny3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2011, 21h17   #2
Rédacteur
 
Avatar de jreaux62
 
Homme Jérôme Réaux
Webdesigner
Inscription : août 2008
Messages : 2 993
Détails du profil
Informations personnelles :
Nom : Homme Jérôme Réaux
Âge : 45
Localisation : France, Pas de Calais (Nord Pas de Calais)

Informations professionnelles :
Activité : Webdesigner
Secteur : Arts - Culture

Informations forums :
Inscription : août 2008
Messages : 2 993
Points : 5 786
Points : 5 786
Envoyer un message via Skype™ à jreaux62
Bonjour,
il faut juste séparer "physiquement" les 2 formulaires :
Code :
1
2
3
4
5
6
7
8
9
<form .....>
	<!-- contenu du 1er formulaire -->
	<button type="submit">Procéder au paiement</button>
</form>
 
<form .....>
	<!-- contenu du 2eme formulaire -->
	<button type="submit">Procéder au paiement</button>
</form>
Cela dit ... ton problème vient de la vérification au moment du "submit", c'est ca ?
C'est plus un problème d'id=".." que de name="..."
Autant on peut avoir plusieurs fois le même name, autant les ids doivent etre uniques.
__________________
"Ce qui se conçoit bien s'énonce clairement - Et les mots pour le dire arrivent aisément."
Nicolas Boileau-Despréaux, Homme de lettres français (1636-1711), principal théoricien de l'esthétique classique.
Site perso Mes tutos DVP : Gestion-Affichage de Nouvelles - Affichage en tableau HTML - Fonctions de redimensionnement d'images
jreaux62 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/08/2011, 23h02   #3
Membre du Club
 
Inscription : février 2008
Messages : 207
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 207
Points : 66
Points : 66
Bonjour jreaux62,

C'est ce que j'avais fait au départ, à la différence près que mes champs étaient en double.

J'ai donc modifié mes formulaires pour que le premier ait
Code :
$this->widgetSchema->setNameFormat('donPonctuel[%s]');
et que le second ait
Code :
$this->widgetSchema->setNameFormat('donMensuel[%s]');
Ainsi, mes champs ne vont pas être en double. Du coup, mes formulaires se présentent ainsi:

Code :
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
 
<div class="text-box">
 
                                            <div class="wrapper">
                                                <br/>
 
                                                <?php if ($sf_user->hasFlash('GlobalError')): ?>
                                                    <div class="global error">
                                                        <b> <?php echo $sf_user->getFlash('GlobalError') ?></b>
                                                    </div>
                                                <?php endif; ?>
                                                <?php if ($sf_user->hasFlash('GlobalError2')): ?>
                                                    <div class="global error">
                                                        <b> <?php echo $sf_user->getFlash('GlobalError2') ?></b>
                                                    </div>
                                                <?php endif; ?>
 
 
                                                <br/>
 
                                                <form action="<?php echo url_for('donation/createDonPonctuel') ?>" method="POST" enctype="multipart/form-data">
 
                                                    <fieldset>
 
                                                        <div class="form-row">
 
                                                            <b><?php echo $formDonPonctuel['montant_choix']->renderLabel('Montant: ') ?></b>
                                                            <br/>
 
                                                            <?php echo $formDonPonctuel['montant_choix']->render() ?>
 
                                                            <div class ="form-field-errors">
                                                                <?php echo $formDonPonctuel['montant_choix']->renderError() ?>
                                                            </div>
                                                        </div>
                                                        <div class="form-row">
 
                                                            <b><?php echo $formDonPonctuel['montant_libre']->renderLabel('Montant libre: ') ?></b>
                                                            <br/>
 
                                                            <?php echo $formDonPonctuel['montant_libre']->render() ?>&nbsp;€
 
                                                            <div class ="form-field-errors">
                                                                <?php echo $formDonPonctuel['montant_libre']->renderError() ?>
                                                            </div>
                                                        </div>
                                                    </fieldset>
 
                                                    <?php echo $formDonPonctuel->renderHiddenFields() ?>
 
                                                    <br/>
 
                                                    <div>
                                                        <button type="submit">
                                                            Procéder au paiement
                                                        </button>
                                                    </div>
                                                </form>
                                            </div>
                                        </div>
 
                                        <div class="text-box">
                                            <div class="wrapper">
                                                <br/>
 
                                                <?php if ($sf_user->hasFlash('GlobalError')): ?>
                                                    <div class="global error">
                                                        <b> <?php echo $sf_user->getFlash('GlobalError') ?></b>
                                                    </div>
                                                <?php endif; ?>
                                                <?php if ($sf_user->hasFlash('GlobalError2')): ?>
                                                    <div class="global error">
                                                        <b> <?php echo $sf_user->getFlash('GlobalError2') ?></b>
                                                    </div>
                                                <?php endif; ?>
 
                                                <br/>
                                                <form action="<?php echo url_for('donation/createDonMensuel') ?>" method="POST" enctype="multipart/form-data">
 
                                                    <fieldset>
                                                        <div class="form-row">
 
                                                            <b><?php echo $formDonMensuel['montant_choix']->renderLabel('Montant: ') ?></b>
                                                            <br/>
 
                                                            <?php echo $formDonMensuel['montant_choix']->render() ?>
 
                                                            <div class ="form-field-errors">
                                                                <?php echo $formDonMensuel['montant_choix']->renderError() ?>
                                                            </div>
                                                        </div>
                                                        <div class="form-row">
 
                                                            <b><?php echo $formDonMensuel['montant_libre']->renderLabel('Montant libre: ') ?></b>
                                                            <br/>
 
                                                            <?php echo $formDonMensuel['montant_libre']->render() ?>&nbsp;€
 
                                                            <div class ="form-field-errors">
                                                                <?php echo $formDonMensuel['montant_libre']->renderError() ?>
                                                            </div>
                                                        </div>
                                                    </fieldset>
 
                                                    <?php echo $formDonMensuel->renderHiddenFields() ?>
 
                                                    <br/>
 
                                                    <div>
                                                        <button type="submit">
                                                            Procéder au paiement
                                                        </button>
                                                    </div>
                                                </form>
                                            </div>
                                        </div>
Je retente et je te dis si ça fonctionne (ça me paraissait effectivement la solution la plus logique, mais il est vrai que je n'avais pas pensé aux champs ayant le même id)

Merci encore pour ton aide. Je te tiens au courant.

Johnny
johnny3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/08/2011, 00h15   #4
Membre du Club
 
Inscription : février 2008
Messages : 207
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 207
Points : 66
Points : 66
Bon, je ne m'en sortais pas avec tous les fichiers que j'avais créés, alors j'ai fait un CRUD test et... ça a marché! Merci beaucoup!

Pour les personnes qui rencontreraient un problème similaire, je mets ici mon code:

Le fichier actions.class.php:
Code :
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
 
class donationCRUDActions extends sfActions
{
 
    public function executeIndex(sfWebRequest $request)
    {
        $this->dons = Doctrine_Core::getTable('don')
                ->createQuery('a')
                ->execute();
    }
 
    public function executeShow(sfWebRequest $request)
    {
        $this->don = Doctrine_Core::getTable('don')->find(array($request->getParameter('id')));
        $this->forward404Unless($this->don);
    }
 
    public function executeNew(sfWebRequest $request)
    {
        $this->formDonPonctuel = new donPonctuelFormCRUD();
        $this->formDonMensuel = new donMensuelFormCRUD();
    }
 
    public function executeCreateDonPonctuel(sfWebRequest $request)
    {
        $this->forward404Unless($request->isMethod(sfRequest::POST));
 
        $this->formDonPonctuel = new donPonctuelFormCRUD();
 
        $this->processFormDonPonctuel($request, $this->formDonPonctuel);
 
        $this->setTemplate('new');
    }
 
    public function executeCreateDonMensuel(sfWebRequest $request)
    {
        $this->forward404Unless($request->isMethod(sfRequest::POST));
 
        $this->formDonMensuel = new donMensuelFormCRUD();
 
        $this->processFormDonMensuel($request, $this->formDonMensuel);
 
        $this->setTemplate('new');
    }
 
    protected function processFormDonPonctuel(sfWebRequest $request, sfForm $form)
    {
        $donateur = $this->getUser()->getProfileDonateur()->getId();
 
        $frequenceDonPonctuelId = Doctrine_Core::getTable('frequenceDon')->findOneBySlug('je-paie-une-fois')->getId();
 
        $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));
        if ($form->isValid())
        {
            $form->getObject()->setFrequenceDonId($frequenceDonPonctuelId);
            $form->getObject()->setDonateurId($donateur);
 
            $don = $form->save();
 
            $this->redirect('donationCRUD/index');
        }
    }
 
    protected function processFormDonMensuel(sfWebRequest $request, sfForm $form)
    {
        $donateur = $this->getUser()->getProfileDonateur()->getId();
 
        $frequenceDonPonctuelId = Doctrine_Core::getTable('frequenceDon')->findOneBySlug('je-paie-chaque-mois')->getId();
 
        $form->bind($request->getParameter($form->getName()), $request->getFiles($form->getName()));
        if ($form->isValid())
        {
            $form->getObject()->setFrequenceDonId($frequenceDonPonctuelId);
            $form->getObject()->setDonateurId($donateur);
 
            $don = $form->save();
 
            $this->redirect('donationCRUD/index');
        }
    }
 
}

Le fichier newSuccess.php:
Code :
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
 
<h1>New Don</h1>
 
JE DONNE UNE FOIS:
 
<form action="<?php echo url_for('donationCRUD/createDonPonctuel') ?>" method="POST">
 
    <fieldset>
 
        <div class="form-row">
 
            <b><?php echo $formDonPonctuel['montant_choix']->renderLabel('Montant: ') ?></b>
            <br/>
 
            <?php echo $formDonPonctuel['montant_choix']->render() ?>
 
            <div class ="form-field-errors">
                <?php echo $formDonPonctuel['montant_choix']->renderError() ?>
            </div>
        </div>
        <div class="form-row">
 
            <b><?php echo $formDonPonctuel['montant_libre']->renderLabel('Montant libre: ') ?></b>
            <br/>
 
            <?php echo $formDonPonctuel['montant_libre']->render() ?>&nbsp;€
 
            <div class ="form-field-errors">
                <?php echo $formDonPonctuel['montant_libre']->renderError() ?>
            </div>
        </div>
 
    </fieldset>
 
    <?php echo $formDonPonctuel->renderHiddenFields() ?>
 
    <br/>
 
    <div>
        <button type="submit">
            Procéder au paiement
        </button>
    </div>
</form>
 
 
 
 
 
JE DONNE CHAQUE MOIS:
 
<form action="<?php echo url_for('donationCRUD/createDonMensuel') ?>" method="POST">
 
    <fieldset>
 
        <div class="form-row">
 
            <b><?php echo $formDonMensuel['montant_choix']->renderLabel('Montant: ') ?></b>
            <br/>
 
            <?php echo $formDonMensuel['montant_choix']->render() ?>
 
            <div class ="form-field-errors">
                <?php echo $formDonMensuel['montant_choix']->renderError() ?>
            </div>
        </div>
        <div class="form-row">
 
            <b><?php echo $formDonMensuel['montant_libre']->renderLabel('Montant libre: ') ?></b>
            <br/>
 
            <?php echo $formDonMensuel['montant_libre']->render() ?>&nbsp;€
 
            <div class ="form-field-errors">
                <?php echo $formDonMensuel['montant_libre']->renderError() ?>
            </div>
        </div>
 
    </fieldset>
 
    <?php echo $formDonMensuel->renderHiddenFields() ?>
 
    <br/>
 
    <div>
        <button type="submit">
            Procéder au paiement
        </button>
    </div>
</form>

Le formulaire donPonctuel, non customisé:
Code :
1
2
3
4
5
6
7
8
9
 
<?php
class donPonctuelFormCRUD extends BasedonForm
{
  public function configure()
  {
      unset ($this['created_at'], $this['updated_at'], $this['donateur_id'], $this['frequence_don_id']);
  }
}
Le formulaire donMensuel est identique (ceci est une aberration ici, mais au final, les deux formulaires seront différents car auront une grille tarifaire différente)


Mon fichier baseDonForm, pour que l'on voit comment est construit le formulaire:
Code :
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
38
39
40
 
abstract class BasedonForm extends BaseFormDoctrine
{
  public function setup()
  {
    $this->setWidgets(array(
      'id'               => new sfWidgetFormInputHidden(),
      'montant_libre'    => new sfWidgetFormInputText(),
      'montant_choix'    => new sfWidgetFormInputText(),
      'frequence_don_id' => new sfWidgetFormDoctrineChoice(array('model' => $this->getRelatedModelName('frequenceDon'), 'add_empty' => false)),
      'donateur_id'      => new sfWidgetFormDoctrineChoice(array('model' => $this->getRelatedModelName('donateur'), 'add_empty' => false)),
      'created_at'       => new sfWidgetFormDateTime(),
      'updated_at'       => new sfWidgetFormDateTime(),
    ));
 
    $this->setValidators(array(
      'id'               => new sfValidatorChoice(array('choices' => array($this->getObject()->get('id')), 'empty_value' => $this->getObject()->get('id'), 'required' => false)),
      'montant_libre'    => new sfValidatorInteger(array('required' => false)),
      'montant_choix'    => new sfValidatorInteger(array('required' => false)),
      'frequence_don_id' => new sfValidatorDoctrineChoice(array('model' => $this->getRelatedModelName('frequenceDon'))),
      'donateur_id'      => new sfValidatorDoctrineChoice(array('model' => $this->getRelatedModelName('donateur'))),
      'created_at'       => new sfValidatorDateTime(),
      'updated_at'       => new sfValidatorDateTime(),
    ));
 
    $this->widgetSchema->setNameFormat('don[%s]');
 
    $this->errorSchema = new sfValidatorErrorSchema($this->validatorSchema);
 
    $this->setupInheritance();
 
    parent::setup();
  }
 
  public function getModelName()
  {
    return 'don';
  }
 
}
Encore merci pour ton aide. Il me reste à présent à retravailler sur les messages d'erreur, mais c'est déjà une grande avancée pour moi.

Merci pour tout,
Johnny
johnny3 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h45.


 
 
 
 
Partenaires

Hébergement Web