Bonjour,
J'expose mon souci.
Contexte : je suis le tuto Jobeet et je me suis permis de dériver...
J'ai créé un module supplémentaire me permettant de créer des pages administrables : info
j'ai voulu insérer un formulaire dans l'une de ses pages. Pour cela j'ai procédé ainsi :
- création d'un model JobeetContactForm hérité directement de sfForm
- création d'un partial _form_email dans le module info
- création d'une méthode executeSend() dans action.class.php controllant l'envoi des données formulaire et faisant appel à une autre méthode sendForm()
Quand je fais un envoi je suis bien retourné vers le bon template, il y a bel et bien une validation des champs qui s'applique mais je perd toutes les valeurs entrées et le _csrf_token ! Et donc à partir de là mon formulaire est bloqué car toujour invalide.
Je vous fournis ici les codes des divers méthodes et templates :
Ah oui, petite précision il y a une inclusion d'un second partial dans le premier mais ça ne devrait pas influer...
lib/form/doctrine/JobeetContactForm.class.php
apps/frontend/modules/info/actions/actions.class.php [extrait]
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 class JobeetContactForm extends sfForm { public function configure() { $this->widgetSchema['nom'] = new sfWidgetFormInput(); $this->widgetSchema['email'] = new sfWidgetFormInput(); $this->widgetSchema['type'] = new sfWidgetFormChoice(array( 'choices' => Doctrine::getTable('JobeetInfo')->getTypes(), 'multiple' => false, 'expanded' => false, 'label' => 'Profession' )); $this->widgetSchema['sujet'] = new sfWidgetFormChoice(array( 'choices' => Doctrine::getTable('JobeetInfo')->getDemandes(), 'multiple' => false, 'expanded' => false )); $this->widgetSchema['message'] = new sfWidgetFormTextarea(); // validators $this->validatorSchema['nom'] = new sfValidatorString(array( 'min_length' => 3, 'required' => true )); $this->validatorSchema['email'] = new sfValidatorEmail(array( 'required' => true )); $this->validatorSchema['message'] = new sfValidatorString(array( 'min_length' => 3, 'max_length' => 600, 'required' => true )); // erreur $this->errorSchema = new sfValidatorErrorSchema($this->validatorSchema); } }
Et maintenant les templates...
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 public function executeShow(sfWebRequest $request) { $this->forward404Unless($this->jobeet_info = Doctrine_Core::getTable('JobeetInfo')->find(array($request->getParameter('id')))); $this->form_email = new JobeetContactForm(); } ... public function executeSend(sfWebRequest $request){ $this->forward404Unless($request->isMethod(sfRequest::POST) || $request->isMethod(sfRequest::PUT)); $this->forward404Unless($this->jobeet_info = Doctrine_Core::getTable('JobeetInfo')->find(2)); $this->form_email = new JobeetContactForm(); $this->sendForm($request, $this->form_email); $this->setTemplate("show"); } ... protected function sendForm(sfWebRequest $request, sfForm $form_email){ //$form_email->bind($request->getParameter("devis")); $form_email->bind($request->getParameter($form_email->getName())); if($form_email->isValid()){ $sujet = $request->getParameter("sujet"); $message = "<h3>$sujet</h3> <p>nom : ".$request->getParameter('nom')."<br /> email : ".$request->getParameter('email')."<br /> Société de type : ".$request->getParameter('type')."<br /> </p><p>-- Message --</p>".$request->getParameter('message'); $email = Swift_Message::newInstance($sujet) ->setFrom($request->getParameter('email')) ->setTo("contact@bibi.com") ->setBody($message,"text/html"); $this->getMailer()->send($email); $this->redirect('info/4'); } }
apps/frontend/modules/info/templates/showSuccess.php
l'appel conditionnel sert à n'afficher le formulaire que lorsque l'action show reçoit l'id=2 qui est la page de contact.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 <?php if($jobeet_info->getId() == 2): ?> <?php include_partial("info/form_email", array('form_email' => $form_email, "jobeet_info" => $jobeet_info)); ?> <?php endif; ?>
apps/frontend/modules/info/templates/_form_email.php
Je ne comprends pas, il faudrait sans doute que je passe un objet en argument au formulaire pour qu'il retrouve ses données mais le _csrf_token ??? Bref je sèche.
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 <?php use_stylesheets_for_form($form_email) ?> <?php use_javascripts_for_form($form_email) ?> <?php include_partial("fck", array("textarea_id" => "message", "gt" => "info"));?> <h3>Laissez-nous un message... </h3> <dfn>Merci de renseigner ce formulaire afin de répondre au mieux à votre demande.</dfn> <form name="devis" id="devis" action="<?php echo url_for('info/send?id=2') ?>" method="post" <?php $form_email->isMultipart() and print 'enctype="multipart/form-data" '; ?>> <table> <tfoot> <tr> <td colspan="2"><center> <span class="art-button-wrapper"> <span class="l"></span> <span class="r"></span> <input type="submit" value="Send" class="art-button"/> </span> </center> </td> </tr> </tfoot> <tbody> <?php echo $form_email; ?> </tbody> </table> </form>
Peut-êtr m'y suis-je mal pris depuis le départ ?Quelqu'un a-t-il une piste ? Je précise que si le formulaire est valide tout se passe bien et je suis bien renvoyé vers la bonne page. Si je rajoute un else en fin de méthode sendForm() avec un redirect vers une page d'échec j'affiche la bonne page aussi mais ce que je veux c'est revenir au formulaire invalide et permettre de le corriger !
Partager