Nous allons créer un formulaire de contact dans la page About
Dans index.php
$app->register(new Silex\Provider\FormServiceProvider());
$app->register(new Silex\Provider\TranslationServiceProvider());
$app->register(new Silex\Provider\ValidatorServiceProvider());
Dans la route /about
// Create builder
$form_builder = $app['form.factory']->createBuilder();
// Set method and action
$form_builder->setMethod('post');
$form_builder->setAction($app['url_generator']->generate('about'));
// Add input
$form_builder->add('name','text');
$form_builder->add('submit','submit');
// Create form
$form = $form_builder->getForm();
Nous devons envoyer le formulaire à Twig
Dans la route /about, avant le return
// Send the form to the view
$data = array(
'contact_form' => $contact_form->createView()
);
Dans la vue /view/about.twig
{{ form(contact_form) }}
$app->match('/about', function() use ($app) {
/* ... */
})
->bind('about');
$app->match('/about', function(Symfony\Component\HttpFoundation\Request $request) use ($app)
{
/* ... */
})
->bind('about');
use Symfony\Component\HttpFoundation\Request;
/* ... */
$app->match('/about', function(Request $request) use ($app)
{
/* ... */
})
->bind('about');
La variable $form possède plusieurs méthodes qui vont permettre de tester/gérer les données envoyées
Dans la route /about après $contact_form = $form_builder->getForm();
// Handle request
$contact_form->handleRequest($request);
// Is submited
if($contact_form->isSubmitted())
{
// Get form data
$form_data = $contact_form->getData();
// Is valid
if($contact_form->isValid())
{
// Send email here
// Redirect to success page
echo '';
print_r($form_data);
echo '
';
exit;
}
}
$form_builder->add(
'name',
'text',
array(
'label' => 'Your name',
'trim' => true,
'max_length' => 50,
'required' => true,
)
);
$form_builder->add(
'email',
'email',
array(
'label' => 'Your email',
'trim' => true,
'max_length' => 50,
'required' => true,
)
);
$form_builder->add(
'subject',
'choice',
array(
'label' => 'Subject',
'required' => true,
'empty_value' => 'Choose a subject',
// 'multiple' => true,
// 'expanded' => true,
'choices' => array(
'Informations' => 'Informations',
'Proposition' => 'Proposition',
'Other' => 'Other',
)
)
);
$form_builder->add(
'message',
'textarea',
array(
'label' => 'Message',
'trim' => true,
'max_length' => 50,
'required' => true,
)
);
Une contrainte se créée de la manière suivante
new Symfony\Component\Validator\Constraints\NotEqualTo(
array(
'value' => 'fuck',
'message' => 'Be polite you shithead'
)
)
La syntaxe est lourd et longue, mais il existe une astuce
Il suffit de rajouter la ligne suivante au début du script php
use Symfony\Component\Validator\Constraints;
et de créer la contrainte ainsi
new Constraints\NotEqualTo(
array(
'value' => 'fuck',
'message' => 'Be polite you shithead'
)
)
Exemple complet avec le champ Name
$form_builder->add(
'name',
'text',
array(
'label' => 'Your name',
'trim' => true,
'max_length' => 50,
'required' => true,
'constraints' => array(
new Constraints\NotEqualTo(
array(
'value' => 'fuck',
'message' => 'Be polite you shithead'
)
)
),
)
);
Résultat
{{ form(contact_form) }}
{{ form_start(contact_form) }}
{{ form_widget(contact_form.name) }}
{{ form_widget( contact_form.name, { attr : { placeholder : 'John' } } ) }}
Exemple complet dans contact.twig
{{ form_start(contact_form) }}
{{ form_label(contact_form.name) }}
{{ form_widget(contact_form.name,{attr:{placeholder:'John'}}) }}
{{ form_errors(contact_form.name) }}
{{ form_label(contact_form.email) }}
{{ form_widget(contact_form.email,{attr:{placeholder:'john.snow@gmail.com'}}) }}
{{ form_errors(contact_form.email) }}
{{ form_widget(contact_form.subject,{attr:{class:'browser-default'}}) }}
{{ form_errors(contact_form.subject) }}
{{ form_label(contact_form.message) }}
{{ form_widget(contact_form.message,{attr:{placeholder:'u know nothing',class:'materialize-textarea'}}) }}
{{ form_errors(contact_form.message) }}
{{ form_widget(contact_form.submit,{attr:{class:'btn'}}) }}
{{ form_end(contact_form) }}
Rajouter le service
$app->register(new Silex\Provider\SwiftmailerServiceProvider(), array(
'swiftmailer.options' => array(
'host' => 'smtp.gmail.com',
'port' => 465,
'username' => 'hetic.p2018.smtp@gmail.com',
'password' => 'heticp2018smtp',
'encryption' => 'ssl',
'auth_mode' => 'login'
)
));
Le service est configuré pour envoyer des mails à partir du serveur SMTP de google avec un compte perso
Envoyer le mail
Dans la route /about lorsque le formulaire est validé
$message = \Swift_Message::newInstance();
$message->setSubject($form_data['subject'].' ('.$form_data['email'].')');
$message->setFrom(array($form_data['email']));
$message->setTo(array('bruno.simon@hetic.net'));
$message->setBody($form_data['message']);
$app['mailer']->send($message);
return $app->redirect($app['url_generator']->generate('about'));
Vous connaissez les formulaire Silex/Symfony