Bonjour,

Je débute avec SF2 et je cherche à faire mon premier formulaire (de contact, mais je n'en suis pas encore à envoyer des mails). J'essaie de suivre essentiellement la doc officielle (site Symfony2 donc). La version de SF2 sur laquelle je travaille est la 2.4.1.

Voici mes fichiers :

Le contrôleur :

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
// src/Open/OpcBundle/Controller/OpcController.php
 
namespace Open\OpcBundle\Controller;
 
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Open\OpcBundle\Entity\Contact;
use Open\OpcBundle\Form\Type\ContactType;
 
public function contactAction(Request $request) {      
      $contact = new Contact();
 
      $form = $this->createForm(new ContactType(), $contact);
 
      $form->handleRequest($request);
 
      if ($form->isValid()) {
         return $this->redirect($this->generateUrl('contact_success'));
      }      
 
      return $this->render("OpenOpcBundle:Opc:contact.html.twig", array("form" => $form->createView()));
   }  
}
L'entité :

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
38
39
40
41
42
43
44
45
 
<?php
// src/Open/OpcBundle/Entity/Contact.php
 
namespace Open\OpcBundle\Entity;
 
class Contact {
   protected $nom;
   protected $courriel;
   protected $commune;
   protected $sujet;
   protected $msg;
 
public function getNom() {
      return $this->nom;
   }
 
   public function setNom($nom) {
      $this->name = $nom;
   }
 
   public function getCourriel() {
      return $this->courriel;
   }
 
   public function setCourriel($courriel) {
      $this->courriel = $courriel;
   }
 
   public function getSujet() {
      return $this->sujet;
   }
 
   public function setSujet($sujet) {
      $this->sujet = $sujet;
   }
 
   public function getMsg() {
      return $this->msg;
   }
 
   public function setMsg($msg) {
      $this->message = $message;
   }   
}
Ma classe FormType :

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
 
<?php
# src/Open/OpcBundle/Form/Type/ContactType.php
namespace Open\OpcBundle\Form;
 
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
 
class ContactType extends AbstractType {
 
   public function buildForm(FormBuilderInterface $builder, array $options) {
      $builder->add('contact');
      $builder->add('nom', 'text', array('max_length' => 30, 'label' => 'Prénom, nom*', 'trim' => true, 'attr' => array('size'=>'30')))
              ->add('courriel', 'email', array('max_length' => 255, 'label' => 'Adresse email*', 'trim' => true, 'attr' => array('size'=>'30')))
               ->add('sujet', 'text', array('max_length' => 255, 'label' => 'Objet*', 'trim' => true, 'attr' => array('size'=>'30')))
      ->add('msg', 'textarea', array('attr' => array('rows' => '10','cols' => '80')))
      ->add('submit', 'submit');
   }
 
   public function getName() {
      return "Contact";
   }
}
Le template contact.twig.html :

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
 
{% extends "OpenOpcBundle:Opc:layout.html.twig" %}
{% block main %}	       
<h1>Contact</h1>
 
{{ form_start(form) }}
    {{ form_errors(form) }}
 
    <p>{{ form_label(form.nom) }}{{ form_widget(form.nom) }} </p>
    {{ form_errors(form.nom) }}
 
    <p>{{ form_label(form.courriel) }} {{ form_widget(form.courriel) }}</p>
    {{ form_errors(form.courriel) }}
 
    <p>{{ form_label(form.sujet) }} {{ form_widget(form.sujet) }}</p>
    {{ form_errors(form.sujet) }}
 
    <p>{{ form_label(form.msg) }} {{ form_widget(form.msg) }}</p>
    {{ form_errors(form.msg) }}
 
    <p class="txtcenter">{{ form_widget(form.submit, { 'label': 'Envoyer' }) }}</p>
{{ form_end(form) }}
{% endblock main %}
Route pour contact :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
open_opc_contact:
    pattern: /contact
    defaults: { _controller: OpenOpcBundle:Opc:contact }
    requirements:
        _method: POST
Un fichier validation.yml :

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
# Open/OpcBundle/Resources/config/validation.yml
Open\OpcBundle\Entity\Contact:
    properties:
    nom:
        - NotBlank: ~
            message: Le champ Prénom, nom n'est pas renseigné.
        - Type:
        type: alpha
            message: Le champ Prénom, nom n'est pas renseigné.    
    courriel:    
        - Email:
            message: '{{ value }}' n'est pas une adresse email valide.
    sujet:    
        - NotBlank: ~     
        message: Le champ Sujet n'est pas renseigné.
    msg:    
        - NotBlank: ~       
        message: Le champ Message n'est pas renseigné.
Dans le fichier app/config/config.yml, j'ai activé le yaml :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
framework:
    # validation: { enable_annotations: true }
    validation: { enabled: true }
Dans ces 2 derniers fichiers YAML j'ai bien veillé à l'indentation de 4 espaces (je précise car cela n'apparaît bien pas sur ce post).

Je rencontre 2 problèmes :

- Problème 1 : j'ai le message d'erreur Variable "form" does not exist in OpenOpcBundle:Opc:contact.html.twig at line 6.
- Problème 2 : avant d'avoir le message d'erreur du problème 1, le profiler indiquait que le formulaire n'était pas soumis (menu > forms) pourtant dans menu > requests les données sont postées. J'ai aussi noté dans le profiler que le jeton CSRF est invalide.

Merci de votre aide.