Salut,

Je débute un nouveau projet avec Symfony 2.0 RC10 et j'ai du mal à comprendre les formulaires et à trouver des exemples.

Dans les versions précédentes, je trouvais appréciable de pouvoir générer beaucoup de choses automatiquement. Là, j'ai pu générer mes entités à partir des fichiers de mapping tirés de ma base de données mais je crois qu'il n'est plus possible de générer automatiquement les formulaires et leurs validateurs.

Est-ce que c'est vrai ? Est-ce que c'est définitif ?

Ce n'est pas dramatique, je peux le faire à la main mais il me faudrait au moins un exemple complet avec l'entité, le formulaire, le contrôleur, la validation et la vue HTML.

entity Client :
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
46
47
48
namespace Autoecole\DataBundle\Entity;
 
/**
 * Autoecole\DataBundle\Entity\Client
 */
class Client
{
    /**
     * @var integer $cliId
     */
    private $cliId;
 
    /**
     * @var string $cliNom
     */
    private $cliNom;
 
 
 
    /**
     * Get cliId
     *
     * @return integer $cliId
     */
    public function getCliId()
    {
        return $this->cliId;
    }
 
    /**
     * Set cliNom
     *
     * @param string $cliNom
     */
    public function setCliNom($cliNom)
    {
        $this->cliNom = $cliNom;
    }
 
    /**
     * Get cliNom
     *
     * @return string $cliNom
     */
    public function getCliNom()
    {
        return $this->cliNom;
    }
formulaire :
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
namespace Autoecole\ClientBundle;
 
use Symfony\Component\Form\Form;
use Symfony\Component\Form\TextField;
use Symfony\Component\Form\TextareaField;
use Symfony\Component\Form\CheckboxField;
use Symfony\Component\Form\HiddenField;
 
class ClientForm extends Form
{
    protected function configure()
    {
        $this->setDataClass( "Autoecole\\DataBundle\\Entity\Client" );
    	//$this->add( "cliId" );
    	$this->add( "cliNom" );
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
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
namespace Autoecole\ClientBundle\Controller;
 
use Autoecole\ClientBundle\ClientForm;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Autoecole\DataBundle\Entity\Client;
 
class DefaultController extends Controller
{
	/**
	 * Liste des clients
	 */
    public function indexAction()
    {
        return $this->render('AutoecoleClientBundle:Default:search.html.twig');
    }
 
    /**
     * Préparation et traitement du formulaire de saisie (ajout ou modification) d'un client
     */
    public function newAction()
    {
    	//créer un nouveau client vide
    	$client = new Client();
 
    	//créer le formulaire
    	$form = ClientForm::create( $this->get('form.context'), 'client' );
 
    	// If a POST request, write the submitted data into $client
	    // and validate the object
	    $form->bind( $this->get('request'), $client );
 
	    // If the form has been submitted and is valid...
	    if ( $form->isValid() )
	    {
	    	//récupérer le entityManager
	    	$em = $this->get( 'doctrine.orm.entity_manager' );
	        $em->persist( $client );
	        $em->flush();
 
	        //afficher le client saisi
	        return $this->render( 'AutoecoleClientBundle:Default:view.html.twig' );
	    }
 
	    // Display the form with the values in $contactRequest
	    return $this->render('AutoecoleClientBundle:Default:edit.html.twig', array(
	        'form' => $form
	    ));
 
    }
J'ai vu dans la documentation qu'il faut utiliser un "form context" (contactRequest dans l'exemple) qui contient les propriétés du formulaire et les contraintes d'intégrité en annotation.

Mais est-ce que je suis obligé d'utiliser un objet particulier pour ça ou est-ce que je peux utiliser ma classe Client ? J'ai essayé

$this->setDataClass( "Autoecole\\DataBundle\\Entity\Client" );

et ça passe mais je dois définir les validateurs à la main alors que les contraintes sont déjà décrites dans le fichier de mapping ? Parce que là, au submit j'ai "SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'Cli_Nom' cannot be null ".

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
Autoecole\DataBundle\Entity\Client:
  type: entity
  table: Client
  fields:
    cliId:
      id: true
      type: integer
      unsigned: false
      nullable: false
      column: Cli_ID
      generator:
        strategy: IDENTITY
    cliNom:
      type: string
      length: 150
      fixed: false
      nullable: false
      column: Cli_Nom
Merci d'avance