目次

05 FormServiceProvider

フォームが簡単に作成できる。

・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を登録しないと、上記のエラーが出ます。

createFormBuilderで指定できるもの一覧

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) )