====== 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
フォームテスト
===== エラー =====
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) )