Débuter avec les formulaires
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:
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:
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:
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:
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