====== 05 FormServiceProvider ====== フォームが簡単に作成できる。 ・controler 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 フォームテスト
{{ form_widget(form) }}
===== エラー ===== 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を登録しないと、上記のエラーが出ます。 ===== createFormBuilderで指定できるもの一覧 ===== [[http://symfony.com/doc/current/book/forms.html#built-in-field-types|Built-in Field Types]] ===== class, placeholderの指定方法 ===== 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'} } ) }} ===== csrf対策でトークン ===== 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) )