SlideShare une entreprise Scribd logo
1  sur  22
Télécharger pour lire hors ligne
Les Formulaire avec
Symfony
Première approche
Meetup Symfony Montpellier
mardi 11 octobre 2016 - Kaliop
Qui suis-je?
Julien Vinber
● Développeur Delphi / PHP depuis 15 ans
● Symfony depuis 2 - 3 ans
● Travail chez l’éditeur de logiciel Yooda depuis 8 ans.
1.
L’art de rendre
compliquer ce qui
était simple.
Sans Symfony
▸ 1 fichier
▸ 25 lignes
Mon premier formulaire
basique
Avec Symfony
▸ 4 fichiers
▸ 247 lignes
Exemple sans Symfony
<?php
if (isset($_GET['valider'])){
$sql = '
INSERT INTO membre (nom, prenom, mail, telephone, date_naissance) VALUES (
''. $_GET['nom'] . '',
''. $_GET['prenom'] . '',
''. $_GET['mail'] . '',
''. $_GET['telephone'] .'',
''. $_GET['dateNaissance'] .'')
';
$mysqli = new mysqli("localhost", "root", "root", "formation");
}
?>
<h2>Ajouter un membre</ h2>
<form>
<label for="nom">Nom :</ label><input id="nom" name="nom" type="text" /><br />
<label for="prenom">Prénom :</ label><input id="prenom" name="prenom" type="text" /><br />
<label for="mail">Mail :</ label><input id="mail" name="mail" type="email" /><br />
<label for="telephone">Téléphone :</ label><input id="telephone" name="telephone" type="tel" /><br />
<label for="dateNaissance">Naissance :</ label><input id="dateNaissance" name="dateNaissance" type="date" /><br />
<button name="valider">Ajouter</ button>
</form>
Extrait avec Symfony
…
…
public function addAction (Request $request )
{
$membre = new Membre();
$form = $this->createForm (MembreType:: class, $membre);
$form->handleRequest ($request );
if ($form->isSubmitted () && $form->isValid ()) {
$em = $this->getDoctrine ()->getManager ();
$em->persist ($membre);
$em->flush();
return $this->redirect ($this->generateUrl ('membre_add'));
}
return array(
'form' => $form->createView ()
);
}
…
…
=> C’est plus complexe
2.
Comprendre le
code
Un formulaire et la pour renseigner un objet
/**
* @ORMEntity
* @ORMTable()
*/
class Membre
{
/**
* @var integer
* @ORMColumn(type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @var string
* @ORMColumn(type="string", length=255)
*/
protected $nom;
/**
* @var string
* @ORMColumn(type="string", length=255)
*/
protected $prenom;
/**
* @var string
* @ORMColumn(type="string", length=255)
*/
protected $mail;
/**
* @var string
* @ORMColumn(type="string", length=25)
*/
protected $telephone;
/**
* @var DateTime
* @ORMColumn(type="date")
*/
protected $dateNaissance;
…
…
…
On décrit un formulaire dans un objet
class MembreType extends AbstractType
{
public function buildForm (FormBuilderInterface $builder , array $options )
{
$builder
->add('nom')
->add ('prenom')
->add ('mail')
->add ('telephone')
->add ('dateNaissance', BirthdayType:: class)
->add ('cree', SubmitType:: class, array('label' => 'Valider'))
;
}
public function configureOptions (OptionsResolver $resolver )
{
$resolver ->setDefaults (array(
'data_class' => 'AppBundleEntityMembre'
));
}
}
Une pincé html
{% extends 'base.html.twig' %}
{% block body %}
<h2>Ajouter un membre</ h2>
{{ form(form) }}
{% endblock %}
Enfin le coeur de notre programme, le contrôleur.
class MembreController extends Controller
{
/**
* @Route("/membre/add", name="membre_add")
* @Template()
*/
public function addAction (Request $request )
{
$membre = new Membre();
$form = $this->createForm (MembreType:: class, $membre);
$form->handleRequest ($request );
if ($form->isSubmitted () && $form->isValid ()) {
$em = $this->getDoctrine ()->getManager ();
$em->persist ($membre);
$em->flush();
return $this->redirect ($this->generateUrl ('membre_add'));
}
return array(
'form' => $form->createView ()
);
}
}
3.
La force des
formulaires
Symfony
Gestion des scripte de modification
/**
* @Route("/membre/{idMembre}", name="membre_add", requirements={"idMembre":"add|d+"})
* @Template()
*/
public function addAction (Request $request , $idMembre )
{
if ($idMembre == 'add'){
$membre = new Membre();
} else {
$membre = $this->getDoctrine ()->getRepository ("AppBundle:Membre")->find($idMembre );
}
$form = $this->createForm (MembreType:: class, $membre);
$form->handleRequest ($request );
if ($form->isSubmitted () && $form->isValid ()) {
$em = $this->getDoctrine ()->getManager ();
if ($idMembre == 'add') {
$em->persist ($membre);
}
$em->flush();
return $this->redirect ($this->generateUrl ('membre_add', array("idMembre" => $membre->getId())));
}
return array(
'form' => $form->createView ()
);
}
Gestion de la validation coter serveur
/**
* @var string
* @ORMColumn(type="string", length=255)
* @AssertNotBlank()
*/
protected $nom;
…
/**
* @var string
* @ORMColumn(type="string", length=255)
* @AssertNotBlank()
* @AssertEmail(
* message = "The email '{{ value }}' is not a valid email.",
* checkMX = true
* )
*/
protected $mail;
Validation personaliser
/**
* @Annotation
*/
class IsTelephone extends Constraint
{
public $message = 'Cela ne ressemble pas à un numéro de téléphone.';
}
…
class IsTelephoneValidator extends ConstraintValidator
{
public function validate ($value, Constraint $constraint )
{
if (!preg_match ('/^0[0-9]{9}$/', $value, $matches )) {
$this->context->buildViolation ($constraint ->message)
->setParameter ('%string%', $value)
->addViolation ();
}
}
}
/**
* @var string
* @ORMColumn(type="string", length=25)
* @AssertNotBlank()
* @AppAssertIsTelephone
*/
protected $telephone;
Champs complexe : choix dans une base
class EtatMembre
{
/**
* @var integer
* @ORMColumn(type="integer")
* @ORMId
* @ORMGeneratedValue(strategy="AUTO")
*/
protected $id;
/**
* @var string
* @ORMColumn(type="string", length=255)
*/
protected $nom;
…
/**
* @ORMManyToOne(targetEntity="EtatMembre",
inversedBy="membre")
* @ORMJoinColumn(referencedColumnName="id")
*/
private $etatMembre;
$builder
->add('nom')
->add ('prenom')
->add ('mail')
->add ('telephone')
->add ('dateNaissance', BirthdayType:: class)
->add ('etatMembre')
->add ('cree', SubmitType:: class,
array('label' => 'Crée le nouveau membre'))
;
Champs complexes : sous formulaire, OneToOne
/**
* @ORMEntity
* @ORMTable()
*/
class Adresse
{
...
class AdresseType extends AbstractType
{
public function
buildForm (FormBuilderInterface $builder ,
array $options )
{
$builder
->add('adresse1')
->add ('complementAdresse')
->add ('codePostal')
->add ('ville')
;
}
public function
configureOptions (OptionsResolver $resolver )
{
$resolver ->setDefaults (array(
'data_class' =>
'AppBundleEntityAdresse'
));
}
}
$builder
->add('nom')
->add ('prenom')
->add ('mail')
->add ('telephone')
->add ('dateNaissance', BirthdayType:: class)
->add ('etatMembre')
->add ('adresse', AdresseType:: class)
->add ('cree', SubmitType:: class, array('label'
=> 'Crée le nouveau membre'))
;
Champs complexes : sous formulaire multiple, OneToMany
Trop de code pour le montrer, mais cela permet d’avoir un
résultat complexe relativement facilement. Pour cela il faut :
▸ Configurer nos entité normalement
▸ Crée le formulaire de notre entité
▸ Ajouter du code JS pour être capable d’ajouter ou
supprimer des ligne
▸ Si le formulaire permet d’éditer un objet existant, alors
il faut ajouter du code pour détecter et supprimer les
sous objet supprimer.
Champs complexes : sous formulaire multiple, OneToMany, exemple
Est plus encore
▸ Protection CSRF ( Cross-site request forgery )
▸ Champs personaliser
▸ Personalisation :
▹ D’un champ
▹ D’un formulaire
▹ De tous les formulaires
▸ …
MERCI.
Des questions?
Documentation officiel :
http://symfony.com/doc/current/forms.html
http://symfony.com/doc/current/validation.html
Source de la présentation :
https://github.com/julienVinber/meetup20161011
Mail : julien@vinber.fr

Contenu connexe

Tendances

Comment Créer Un Site De Membres vol 03
Comment Créer Un Site De Membres vol 03Comment Créer Un Site De Membres vol 03
Comment Créer Un Site De Membres vol 03Patrick Van Hoof
 
PHP 1 - Apprendre les bases
PHP 1 - Apprendre les basesPHP 1 - Apprendre les bases
PHP 1 - Apprendre les basesPierre Faure
 
Uniform Variable Syntax
Uniform Variable SyntaxUniform Variable Syntax
Uniform Variable SyntaxDarkmira
 
Trucs et astuces PHP et MySQL
Trucs et astuces PHP et MySQLTrucs et astuces PHP et MySQL
Trucs et astuces PHP et MySQLDamien Seguy
 
PHP5 - POO
PHP5 - POOPHP5 - POO
PHP5 - POOmazenovi
 
Php mysql cours
Php mysql coursPhp mysql cours
Php mysql courszan
 
PHP 7 et Symfony 3
PHP 7 et Symfony 3PHP 7 et Symfony 3
PHP 7 et Symfony 3Eddy RICHARD
 
SOLID : les principes à l’origine du succès de Symfony et de vos applications
SOLID : les principes à l’origine du succès de Symfony et de vos applicationsSOLID : les principes à l’origine du succès de Symfony et de vos applications
SOLID : les principes à l’origine du succès de Symfony et de vos applicationsVladyslav Riabchenko
 
Open close principle, on a dit étendre, pas extends !
Open close principle, on a dit étendre, pas extends !Open close principle, on a dit étendre, pas extends !
Open close principle, on a dit étendre, pas extends !Engineor
 
Python avancé : Interface graphique et programmation évènementielle
Python avancé : Interface graphique et programmation évènementiellePython avancé : Interface graphique et programmation évènementielle
Python avancé : Interface graphique et programmation évènementielleECAM Brussels Engineering School
 

Tendances (18)

Comment Créer Un Site De Membres vol 03
Comment Créer Un Site De Membres vol 03Comment Créer Un Site De Membres vol 03
Comment Créer Un Site De Membres vol 03
 
PHP 1 - Apprendre les bases
PHP 1 - Apprendre les basesPHP 1 - Apprendre les bases
PHP 1 - Apprendre les bases
 
Uniform Variable Syntax
Uniform Variable SyntaxUniform Variable Syntax
Uniform Variable Syntax
 
Trucs et astuces PHP et MySQL
Trucs et astuces PHP et MySQLTrucs et astuces PHP et MySQL
Trucs et astuces PHP et MySQL
 
SQL et MySQL
SQL et MySQLSQL et MySQL
SQL et MySQL
 
Cours php
Cours phpCours php
Cours php
 
Python avancé : Classe et objet
Python avancé : Classe et objetPython avancé : Classe et objet
Python avancé : Classe et objet
 
Php cours
Php coursPhp cours
Php cours
 
Php1
Php1Php1
Php1
 
La première partie de la présentation PHP
La première partie de la présentation PHPLa première partie de la présentation PHP
La première partie de la présentation PHP
 
PHP5 - POO
PHP5 - POOPHP5 - POO
PHP5 - POO
 
Php mysql cours
Php mysql coursPhp mysql cours
Php mysql cours
 
Javascript
JavascriptJavascript
Javascript
 
PHP 7 et Symfony 3
PHP 7 et Symfony 3PHP 7 et Symfony 3
PHP 7 et Symfony 3
 
SOLID : les principes à l’origine du succès de Symfony et de vos applications
SOLID : les principes à l’origine du succès de Symfony et de vos applicationsSOLID : les principes à l’origine du succès de Symfony et de vos applications
SOLID : les principes à l’origine du succès de Symfony et de vos applications
 
Open close principle, on a dit étendre, pas extends !
Open close principle, on a dit étendre, pas extends !Open close principle, on a dit étendre, pas extends !
Open close principle, on a dit étendre, pas extends !
 
Héritage et redéfinition de méthode
Héritage et redéfinition de méthodeHéritage et redéfinition de méthode
Héritage et redéfinition de méthode
 
Python avancé : Interface graphique et programmation évènementielle
Python avancé : Interface graphique et programmation évènementiellePython avancé : Interface graphique et programmation évènementielle
Python avancé : Interface graphique et programmation évènementielle
 

En vedette

icmi2015_ChaZhang
icmi2015_ChaZhangicmi2015_ChaZhang
icmi2015_ChaZhangZhiding Yu
 
Resume-James Gordon4
Resume-James Gordon4Resume-James Gordon4
Resume-James Gordon4James Gordon
 
Picture presentation!!
Picture presentation!!Picture presentation!!
Picture presentation!!Nin Tut
 
EXTERNAL- Better Self Enablement Overview
EXTERNAL- Better Self Enablement OverviewEXTERNAL- Better Self Enablement Overview
EXTERNAL- Better Self Enablement OverviewDhaneesh ..
 
100 & 101 Thanet Circle presentation 12 15 15
100 & 101 Thanet Circle presentation  12  15 15100 & 101 Thanet Circle presentation  12  15 15
100 & 101 Thanet Circle presentation 12 15 15Victor B. Murray
 
Driving cultural changes to improve Customer Experience
Driving cultural changes to improve Customer Experience Driving cultural changes to improve Customer Experience
Driving cultural changes to improve Customer Experience Christopher Brooks
 
Minteer, 777X Fuel System Team Lead Historical Resume 170201
Minteer, 777X Fuel System Team Lead Historical Resume 170201Minteer, 777X Fuel System Team Lead Historical Resume 170201
Minteer, 777X Fuel System Team Lead Historical Resume 170201David Minteer
 
Agregado para Concreto y Agua de mezcla en Obras
Agregado para Concreto y Agua de mezcla en ObrasAgregado para Concreto y Agua de mezcla en Obras
Agregado para Concreto y Agua de mezcla en ObrasJOHNNY JARA RAMOS
 
Final 1st ppt
Final 1st pptFinal 1st ppt
Final 1st pptrashmi r
 
Temelia cladirii - invatatura apostolilor
Temelia cladirii - invatatura apostolilorTemelia cladirii - invatatura apostolilor
Temelia cladirii - invatatura apostolilorBiserica VIA
 

En vedette (16)

icmi2015_ChaZhang
icmi2015_ChaZhangicmi2015_ChaZhang
icmi2015_ChaZhang
 
After 911_final
After 911_finalAfter 911_final
After 911_final
 
Inservice
InserviceInservice
Inservice
 
Resume-James Gordon4
Resume-James Gordon4Resume-James Gordon4
Resume-James Gordon4
 
Picture presentation!!
Picture presentation!!Picture presentation!!
Picture presentation!!
 
EXTERNAL- Better Self Enablement Overview
EXTERNAL- Better Self Enablement OverviewEXTERNAL- Better Self Enablement Overview
EXTERNAL- Better Self Enablement Overview
 
100 & 101 Thanet Circle presentation 12 15 15
100 & 101 Thanet Circle presentation  12  15 15100 & 101 Thanet Circle presentation  12  15 15
100 & 101 Thanet Circle presentation 12 15 15
 
Driving cultural changes to improve Customer Experience
Driving cultural changes to improve Customer Experience Driving cultural changes to improve Customer Experience
Driving cultural changes to improve Customer Experience
 
Work,energyandpower
Work,energyandpowerWork,energyandpower
Work,energyandpower
 
Minteer, 777X Fuel System Team Lead Historical Resume 170201
Minteer, 777X Fuel System Team Lead Historical Resume 170201Minteer, 777X Fuel System Team Lead Historical Resume 170201
Minteer, 777X Fuel System Team Lead Historical Resume 170201
 
CV manoj
CV manojCV manoj
CV manoj
 
Resume_Sohel
Resume_SohelResume_Sohel
Resume_Sohel
 
Agregado para Concreto y Agua de mezcla en Obras
Agregado para Concreto y Agua de mezcla en ObrasAgregado para Concreto y Agua de mezcla en Obras
Agregado para Concreto y Agua de mezcla en Obras
 
Final 1st ppt
Final 1st pptFinal 1st ppt
Final 1st ppt
 
Bio - Resume
Bio - ResumeBio - Resume
Bio - Resume
 
Temelia cladirii - invatatura apostolilor
Temelia cladirii - invatatura apostolilorTemelia cladirii - invatatura apostolilor
Temelia cladirii - invatatura apostolilor
 

Similaire à Meet up symfony 11 octobre 2016 - Les formulaire

Function oop - bonnes pratiques ms tech days
Function   oop - bonnes pratiques ms tech daysFunction   oop - bonnes pratiques ms tech days
Function oop - bonnes pratiques ms tech daysJean-Pierre Vincent
 
Atelier WordPress: Création d&rsquo;extension WordPress
Atelier WordPress: Création d&rsquo;extension WordPressAtelier WordPress: Création d&rsquo;extension WordPress
Atelier WordPress: Création d&rsquo;extension WordPressIZZA Samir
 
Développement sécurisé d'applications avec Zend Framework
Développement sécurisé d'applications avec Zend FrameworkDéveloppement sécurisé d'applications avec Zend Framework
Développement sécurisé d'applications avec Zend FrameworkMickael Perraud
 
php2 : formulaire-session-PDO
php2 : formulaire-session-PDOphp2 : formulaire-session-PDO
php2 : formulaire-session-PDOAbdoulaye Dieng
 
Créer une barre de progression grâce à PHP 5.4
Créer une barre de progression grâce à PHP 5.4Créer une barre de progression grâce à PHP 5.4
Créer une barre de progression grâce à PHP 5.4🏁 Pierre-Henry Soria 💡
 
Patterns et bonnes pratiques autour de JavaScript
Patterns et bonnes pratiques autour de JavaScriptPatterns et bonnes pratiques autour de JavaScript
Patterns et bonnes pratiques autour de JavaScriptMicrosoft Technet France
 
Javascript ne se limite pas à jquery
Javascript ne se limite pas à jqueryJavascript ne se limite pas à jquery
Javascript ne se limite pas à jqueryneuros
 
Javascript : fondamentaux et OOP
Javascript : fondamentaux et OOPJavascript : fondamentaux et OOP
Javascript : fondamentaux et OOPJean-Pierre Vincent
 
Quoi de neuf dans Zend Framework 1.10 ?
Quoi de neuf dans Zend Framework 1.10 ?Quoi de neuf dans Zend Framework 1.10 ?
Quoi de neuf dans Zend Framework 1.10 ?Mickael Perraud
 
Soutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonySoutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonyVincent Composieux
 
Comment créer un moteur de recherche
Comment créer un moteur de rechercheComment créer un moteur de recherche
Comment créer un moteur de rechercheekofficiel
 
Chiffrement de base de données avec postgresql
Chiffrement de base de données avec postgresqlChiffrement de base de données avec postgresql
Chiffrement de base de données avec postgresqlVincent GRAILLOT
 
Les bonnes pratiques de l'architecture en général
Les bonnes pratiques de l'architecture en généralLes bonnes pratiques de l'architecture en général
Les bonnes pratiques de l'architecture en généralGeoffrey Bachelet
 
Présentation de DBAL en PHP
Présentation de DBAL en PHPPrésentation de DBAL en PHP
Présentation de DBAL en PHPMickael Perraud
 
Introduction aux Web components (DNG Consulting)
Introduction aux Web components (DNG Consulting)Introduction aux Web components (DNG Consulting)
Introduction aux Web components (DNG Consulting)DNG Consulting
 

Similaire à Meet up symfony 11 octobre 2016 - Les formulaire (20)

Cours PHP avancé
Cours PHP avancéCours PHP avancé
Cours PHP avancé
 
Function oop - bonnes pratiques ms tech days
Function   oop - bonnes pratiques ms tech daysFunction   oop - bonnes pratiques ms tech days
Function oop - bonnes pratiques ms tech days
 
Atelier WordPress: Création d&rsquo;extension WordPress
Atelier WordPress: Création d&rsquo;extension WordPressAtelier WordPress: Création d&rsquo;extension WordPress
Atelier WordPress: Création d&rsquo;extension WordPress
 
Développement sécurisé d'applications avec Zend Framework
Développement sécurisé d'applications avec Zend FrameworkDéveloppement sécurisé d'applications avec Zend Framework
Développement sécurisé d'applications avec Zend Framework
 
php2 : formulaire-session-PDO
php2 : formulaire-session-PDOphp2 : formulaire-session-PDO
php2 : formulaire-session-PDO
 
Créer une barre de progression grâce à PHP 5.4
Créer une barre de progression grâce à PHP 5.4Créer une barre de progression grâce à PHP 5.4
Créer une barre de progression grâce à PHP 5.4
 
Patterns et bonnes pratiques autour de JavaScript
Patterns et bonnes pratiques autour de JavaScriptPatterns et bonnes pratiques autour de JavaScript
Patterns et bonnes pratiques autour de JavaScript
 
Javascript ne se limite pas à jquery
Javascript ne se limite pas à jqueryJavascript ne se limite pas à jquery
Javascript ne se limite pas à jquery
 
Javascript : fondamentaux et OOP
Javascript : fondamentaux et OOPJavascript : fondamentaux et OOP
Javascript : fondamentaux et OOP
 
Quoi de neuf dans Zend Framework 1.10 ?
Quoi de neuf dans Zend Framework 1.10 ?Quoi de neuf dans Zend Framework 1.10 ?
Quoi de neuf dans Zend Framework 1.10 ?
 
Soutenance Zend Framework vs Symfony
Soutenance Zend Framework vs SymfonySoutenance Zend Framework vs Symfony
Soutenance Zend Framework vs Symfony
 
Comment créer un moteur de recherche
Comment créer un moteur de rechercheComment créer un moteur de recherche
Comment créer un moteur de recherche
 
Cours php
Cours php Cours php
Cours php
 
Chiffrement de base de données avec postgresql
Chiffrement de base de données avec postgresqlChiffrement de base de données avec postgresql
Chiffrement de base de données avec postgresql
 
Change mind about JS
Change mind about JSChange mind about JS
Change mind about JS
 
Apprenez le jQuery
Apprenez le jQueryApprenez le jQuery
Apprenez le jQuery
 
Les bonnes pratiques de l'architecture en général
Les bonnes pratiques de l'architecture en généralLes bonnes pratiques de l'architecture en général
Les bonnes pratiques de l'architecture en général
 
Présentation de DBAL en PHP
Présentation de DBAL en PHPPrésentation de DBAL en PHP
Présentation de DBAL en PHP
 
PHP &amp; MySQL
PHP &amp; MySQLPHP &amp; MySQL
PHP &amp; MySQL
 
Introduction aux Web components (DNG Consulting)
Introduction aux Web components (DNG Consulting)Introduction aux Web components (DNG Consulting)
Introduction aux Web components (DNG Consulting)
 

Plus de Julien Vinber

Swoole Meetup AFUP¨Montpellier 27/01/2021
Swoole   Meetup  AFUP¨Montpellier 27/01/2021Swoole   Meetup  AFUP¨Montpellier 27/01/2021
Swoole Meetup AFUP¨Montpellier 27/01/2021Julien Vinber
 
Et si on en finissait avec CRUD ?
Et si on en finissait avec CRUD ?Et si on en finissait avec CRUD ?
Et si on en finissait avec CRUD ?Julien Vinber
 
Php 7.4 2020-01-28 - afup
Php 7.4   2020-01-28 - afupPhp 7.4   2020-01-28 - afup
Php 7.4 2020-01-28 - afupJulien Vinber
 
Meet up symfony 16 juin 2017 - Les PSR
Meet up symfony 16 juin 2017 -  Les PSRMeet up symfony 16 juin 2017 -  Les PSR
Meet up symfony 16 juin 2017 - Les PSRJulien Vinber
 
Meetup symfony 30 janvier 2017 - événement
Meetup symfony 30 janvier 2017 - événementMeetup symfony 30 janvier 2017 - événement
Meetup symfony 30 janvier 2017 - événementJulien Vinber
 

Plus de Julien Vinber (8)

PHP8.2_SF8.2.pdf
PHP8.2_SF8.2.pdfPHP8.2_SF8.2.pdf
PHP8.2_SF8.2.pdf
 
Sulu LE CMS Ultime
Sulu LE CMS UltimeSulu LE CMS Ultime
Sulu LE CMS Ultime
 
Swoole Meetup AFUP¨Montpellier 27/01/2021
Swoole   Meetup  AFUP¨Montpellier 27/01/2021Swoole   Meetup  AFUP¨Montpellier 27/01/2021
Swoole Meetup AFUP¨Montpellier 27/01/2021
 
Et si on en finissait avec CRUD ?
Et si on en finissait avec CRUD ?Et si on en finissait avec CRUD ?
Et si on en finissait avec CRUD ?
 
Php 7.4 2020-01-28 - afup
Php 7.4   2020-01-28 - afupPhp 7.4   2020-01-28 - afup
Php 7.4 2020-01-28 - afup
 
Symfony vs laravel
Symfony vs  laravelSymfony vs  laravel
Symfony vs laravel
 
Meet up symfony 16 juin 2017 - Les PSR
Meet up symfony 16 juin 2017 -  Les PSRMeet up symfony 16 juin 2017 -  Les PSR
Meet up symfony 16 juin 2017 - Les PSR
 
Meetup symfony 30 janvier 2017 - événement
Meetup symfony 30 janvier 2017 - événementMeetup symfony 30 janvier 2017 - événement
Meetup symfony 30 janvier 2017 - événement
 

Meet up symfony 11 octobre 2016 - Les formulaire

  • 1. Les Formulaire avec Symfony Première approche Meetup Symfony Montpellier mardi 11 octobre 2016 - Kaliop
  • 2. Qui suis-je? Julien Vinber ● Développeur Delphi / PHP depuis 15 ans ● Symfony depuis 2 - 3 ans ● Travail chez l’éditeur de logiciel Yooda depuis 8 ans.
  • 3. 1. L’art de rendre compliquer ce qui était simple.
  • 4. Sans Symfony ▸ 1 fichier ▸ 25 lignes Mon premier formulaire basique Avec Symfony ▸ 4 fichiers ▸ 247 lignes
  • 5. Exemple sans Symfony <?php if (isset($_GET['valider'])){ $sql = ' INSERT INTO membre (nom, prenom, mail, telephone, date_naissance) VALUES ( ''. $_GET['nom'] . '', ''. $_GET['prenom'] . '', ''. $_GET['mail'] . '', ''. $_GET['telephone'] .'', ''. $_GET['dateNaissance'] .'') '; $mysqli = new mysqli("localhost", "root", "root", "formation"); } ?> <h2>Ajouter un membre</ h2> <form> <label for="nom">Nom :</ label><input id="nom" name="nom" type="text" /><br /> <label for="prenom">Prénom :</ label><input id="prenom" name="prenom" type="text" /><br /> <label for="mail">Mail :</ label><input id="mail" name="mail" type="email" /><br /> <label for="telephone">Téléphone :</ label><input id="telephone" name="telephone" type="tel" /><br /> <label for="dateNaissance">Naissance :</ label><input id="dateNaissance" name="dateNaissance" type="date" /><br /> <button name="valider">Ajouter</ button> </form>
  • 6. Extrait avec Symfony … … public function addAction (Request $request ) { $membre = new Membre(); $form = $this->createForm (MembreType:: class, $membre); $form->handleRequest ($request ); if ($form->isSubmitted () && $form->isValid ()) { $em = $this->getDoctrine ()->getManager (); $em->persist ($membre); $em->flush(); return $this->redirect ($this->generateUrl ('membre_add')); } return array( 'form' => $form->createView () ); } … …
  • 7. => C’est plus complexe
  • 9. Un formulaire et la pour renseigner un objet /** * @ORMEntity * @ORMTable() */ class Membre { /** * @var integer * @ORMColumn(type="integer") * @ORMId * @ORMGeneratedValue(strategy="AUTO") */ protected $id; /** * @var string * @ORMColumn(type="string", length=255) */ protected $nom; /** * @var string * @ORMColumn(type="string", length=255) */ protected $prenom; /** * @var string * @ORMColumn(type="string", length=255) */ protected $mail; /** * @var string * @ORMColumn(type="string", length=25) */ protected $telephone; /** * @var DateTime * @ORMColumn(type="date") */ protected $dateNaissance; … … …
  • 10. On décrit un formulaire dans un objet class MembreType extends AbstractType { public function buildForm (FormBuilderInterface $builder , array $options ) { $builder ->add('nom') ->add ('prenom') ->add ('mail') ->add ('telephone') ->add ('dateNaissance', BirthdayType:: class) ->add ('cree', SubmitType:: class, array('label' => 'Valider')) ; } public function configureOptions (OptionsResolver $resolver ) { $resolver ->setDefaults (array( 'data_class' => 'AppBundleEntityMembre' )); } }
  • 11. Une pincé html {% extends 'base.html.twig' %} {% block body %} <h2>Ajouter un membre</ h2> {{ form(form) }} {% endblock %}
  • 12. Enfin le coeur de notre programme, le contrôleur. class MembreController extends Controller { /** * @Route("/membre/add", name="membre_add") * @Template() */ public function addAction (Request $request ) { $membre = new Membre(); $form = $this->createForm (MembreType:: class, $membre); $form->handleRequest ($request ); if ($form->isSubmitted () && $form->isValid ()) { $em = $this->getDoctrine ()->getManager (); $em->persist ($membre); $em->flush(); return $this->redirect ($this->generateUrl ('membre_add')); } return array( 'form' => $form->createView () ); } }
  • 14. Gestion des scripte de modification /** * @Route("/membre/{idMembre}", name="membre_add", requirements={"idMembre":"add|d+"}) * @Template() */ public function addAction (Request $request , $idMembre ) { if ($idMembre == 'add'){ $membre = new Membre(); } else { $membre = $this->getDoctrine ()->getRepository ("AppBundle:Membre")->find($idMembre ); } $form = $this->createForm (MembreType:: class, $membre); $form->handleRequest ($request ); if ($form->isSubmitted () && $form->isValid ()) { $em = $this->getDoctrine ()->getManager (); if ($idMembre == 'add') { $em->persist ($membre); } $em->flush(); return $this->redirect ($this->generateUrl ('membre_add', array("idMembre" => $membre->getId()))); } return array( 'form' => $form->createView () ); }
  • 15. Gestion de la validation coter serveur /** * @var string * @ORMColumn(type="string", length=255) * @AssertNotBlank() */ protected $nom; … /** * @var string * @ORMColumn(type="string", length=255) * @AssertNotBlank() * @AssertEmail( * message = "The email '{{ value }}' is not a valid email.", * checkMX = true * ) */ protected $mail;
  • 16. Validation personaliser /** * @Annotation */ class IsTelephone extends Constraint { public $message = 'Cela ne ressemble pas à un numéro de téléphone.'; } … class IsTelephoneValidator extends ConstraintValidator { public function validate ($value, Constraint $constraint ) { if (!preg_match ('/^0[0-9]{9}$/', $value, $matches )) { $this->context->buildViolation ($constraint ->message) ->setParameter ('%string%', $value) ->addViolation (); } } } /** * @var string * @ORMColumn(type="string", length=25) * @AssertNotBlank() * @AppAssertIsTelephone */ protected $telephone;
  • 17. Champs complexe : choix dans une base class EtatMembre { /** * @var integer * @ORMColumn(type="integer") * @ORMId * @ORMGeneratedValue(strategy="AUTO") */ protected $id; /** * @var string * @ORMColumn(type="string", length=255) */ protected $nom; … /** * @ORMManyToOne(targetEntity="EtatMembre", inversedBy="membre") * @ORMJoinColumn(referencedColumnName="id") */ private $etatMembre; $builder ->add('nom') ->add ('prenom') ->add ('mail') ->add ('telephone') ->add ('dateNaissance', BirthdayType:: class) ->add ('etatMembre') ->add ('cree', SubmitType:: class, array('label' => 'Crée le nouveau membre')) ;
  • 18. Champs complexes : sous formulaire, OneToOne /** * @ORMEntity * @ORMTable() */ class Adresse { ... class AdresseType extends AbstractType { public function buildForm (FormBuilderInterface $builder , array $options ) { $builder ->add('adresse1') ->add ('complementAdresse') ->add ('codePostal') ->add ('ville') ; } public function configureOptions (OptionsResolver $resolver ) { $resolver ->setDefaults (array( 'data_class' => 'AppBundleEntityAdresse' )); } } $builder ->add('nom') ->add ('prenom') ->add ('mail') ->add ('telephone') ->add ('dateNaissance', BirthdayType:: class) ->add ('etatMembre') ->add ('adresse', AdresseType:: class) ->add ('cree', SubmitType:: class, array('label' => 'Crée le nouveau membre')) ;
  • 19. Champs complexes : sous formulaire multiple, OneToMany Trop de code pour le montrer, mais cela permet d’avoir un résultat complexe relativement facilement. Pour cela il faut : ▸ Configurer nos entité normalement ▸ Crée le formulaire de notre entité ▸ Ajouter du code JS pour être capable d’ajouter ou supprimer des ligne ▸ Si le formulaire permet d’éditer un objet existant, alors il faut ajouter du code pour détecter et supprimer les sous objet supprimer.
  • 20. Champs complexes : sous formulaire multiple, OneToMany, exemple
  • 21. Est plus encore ▸ Protection CSRF ( Cross-site request forgery ) ▸ Champs personaliser ▸ Personalisation : ▹ D’un champ ▹ D’un formulaire ▹ De tous les formulaires ▸ …
  • 22. MERCI. Des questions? Documentation officiel : http://symfony.com/doc/current/forms.html http://symfony.com/doc/current/validation.html Source de la présentation : https://github.com/julienVinber/meetup20161011 Mail : julien@vinber.fr