フォームが簡単に作成できる。
・controler
<?php require_once __DIR__.'/vendor/autoload.php'; use Silex\Provider\FormServiceProvider; $app = new Silex\Application(); $app['debug'] = true; $app->register(new FormServiceProvider()); $app->register(new Silex\Provider\TranslationServiceProvider(), array( 'locale_fallback' => 'en', )); /* Twig Provider 登録 ---------------- */ $app->register(new Silex\Provider\TwigServiceProvider(), array( 'twig.path' => __DIR__ . '/views', 'twig.options' => array( 'autoescape' => true, ), )); $app->match('/form', function() use($app) { $data = array( 'name' => 'Your name', 'email' => 'Your email', ); $form = $app['form.factory']->createBuilder('form', $data) ->add('name') ->add('email') ->add('gender', 'choice', array( 'choices' => array(1 => 'male', 2 => 'female'), 'expanded' => true, )) ->getForm(); if ('POST' == $app['request']->getMethod()) { $form->bind($app['request']); if ($form->isValid()) { $data = $form->getData(); // do something with the data // redirect somewhere //return $app->redirect('...'); return print_r($data); } } // display the form return $app['twig']->render('form.html.twig', array('form' => $form->createView())); }); $app->run();
・form.html.twig
<html> <body> フォームテスト <form action="#" method="post"> {{ form_widget(form) }} <input type="submit" name="submit" /> </form> </body> </html>
Twig_Error_Syntax: The filter "trans" does not exist in "form_div_layout.html.twig" at line 73
https://github.com/fabpot/Silex/issues/271
TranslationServiceProviderを登録しないと、上記のエラーが出ます。
PHP側で行う場合
->add('username', 'text', array( 'attr' => array( 'placeholder'=>'User Name', 'class'=>'span_name', ) ) )
Twig側で行う場合
{{ form_widget(form.password, { 'attr': { 'class': 'span_name' , 'placeholder' : 'User Name'} }) }}
PHP側で行う場合
->add('username', 'text', array( 'label_attr' => array( 'class' => 'control-label' ) ) )
Twig側で行う場合
{{ form_label(form.username, null, { 'label_attr': { 'class': 'control-label'} } ) }}
Twig テンプレートのなかで form_widget_form.comment のように個別のプロパティを指定すると、
isValid メソッドが常に false を返してしまいます。
レンダリングされていないすべてのフィールドをレンダリングします。
{{ form_label(form.username) }} {{ form_errors(form.username) }} {{ form_widget(form.username}} {{ form_label(form.password) }} {{ form_errors(form.password) }} {{ form_widget(form.password, { 'attr': { 'class': 'span2', 'placeholder' : 'Password'} }) }} {{ form_rest(form) }}
もしくは、csrf対策のトークンを設定しない場合は、下記のように「'csrf_protection' ⇒ false)」してあげる。
$form = $app['form.factory']->createBuilder('form', $data, array('csrf_protection' => false) )