このシナリオを想像してみてください。私たちの会社には、グラフィック、css、htmlなどを「再生」する従業員がいます。
私たちの新しいプロジェクトはsymfony2の下で生まれるので、私たちはいくつかのばかげた-しかし「本物の」-ものを試しています(dbからの認証、フォームからのデータの送信、dbへの永続化など)。
問題
私が知る限り、サイトで見つけたsymfony2の「本」(ここで見つけることができます)から学んだように、フォームを作成およびレンダリングするための「自動化された」方法があります。
1)この方法でフォームをコントローラーに組み込みます
$form = $this->createFormBuilder($task)
->add('task','text'),
->add('dueDate','date'),
->getForm();
return $this->render('pathToBundle:Controller:templateTwig',
array('form'=>$form->createview());
2)templateTwig
テンプレートをレンダリングする
{{ form_widget(form) }} // or single rows method
3)コントローラー(データを送信できるルートがあるものと同じ)に、送信された情報を取り戻します
if($rquest->getMethod()=='POST'){
$form->bindRequest($request);
/* and so on */
}
シナリオに戻る
私たちのグラフィック従業員は、コントローラーにアクセスしたり、phpやその他のものを作成したりしたくありません。そこで彼は、「型破りな」(symfony2の観点からは、HTMLの観点からは従来型の)メソッドを使用して小枝テンプレートを作成します。
/* into twig template */
<form action="{{ path('SestanteUserBundle_homepage') }}" method="post" name="userForm">
<div>
USERNAME: <input type="text" name="user_name" value="{{ user.username}}"/>
</div>
<div>
EMAIL: <input type="text" name="user_mail" value="{{ user.email }}"/>
</div>
<input type="hidden" name="user_id" value="{{ id }}" />
<input type="submit" value="modifica i dati">
</form>
さて、データの送信を処理するコントローラーに入ると、そのようなことをします
public function indexAction(Request $request)
{
if($request->getMethod() == 'POST'){ // sono arrivato per via di un submit, quindi devo modificare i dati prima di farli vedere a video
$defaultData = array('message'=>'ho visto questa cosa in esempio, ma non capisco se posso farne a meno');
$form = $this->createFormBuilder($defaultData)
->add('user_name','text')
->add('user_mail','email')
->add('user_id','integer')
->getForm();
$form->bindRequest($request); //bindo la form ad una request
$data = $form->getData(); //mi aspetto un'array chiave=>valore
/* .... */
$data
送信されたフォームのkey、valueを含む配列が含まれることを期待していました。
それは真実ではないことがわかりました。しばらくグーグルして他の「悪い」アイデアを試してみた後、私たちはそれに固執しました。
それで、phpコードを直接処理できない「グラフィックオフィス」がある場合、フォームからコントローラーにどのようにインターフェースすることができますか?
更新
Symfony2は、フォームのフィールド名とルックアップに異なる規則を使用しているようです。特に、私のフォームの名前がaddUser
で、userName
フィールドの名前がである場合、フィールドの名前はAddUser[username]
、フォームの名前、フィールドの名前を抽出し、それらを連結して値を検索する「動的」ルックアップメソッドを持っている可能性があります。
出来ますか?