1

このシナリオを想像してみてください。私たちの会社には、グラフィック、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]、フォームの名前、フィールドの名前を抽出し、それらを連結して値を検索する「動的」ルックアップメソッドを持っている可能性があります。
出来ますか?

4

2 に答える 2

1

Symfony2にフォームフィールドの名前を設定させることができますが、私はそれを提案しません:$formBuilder->add('dummyfield', 'text', array( 'attr' => array('name' => 'yournamehere') ) );

あるいは(これも悪い考えです)、これを行うことができます。これでは、フォームAPIを使用することもできません。$this->getRequest()->get('whatever_the_field_name_is');

または、Sf2で生成された名前に基づいて、リクエストに要素をハックリに追加してからバインドすることもできます(存在する値をコピーします)。

または、ここに記載されているように、(bindRequestの代わりに)フォームコンポーネントのbindメソッドを利用できます。

しかし、真剣に...フォームビルダーAPIを使用するだけです。あなたの人生は楽になります、そしてそれはフレームワークが何のためにあるのかではありませんか?:)

于 2012-06-27T00:52:09.893 に答える
1

Symfony 2は、テンプレート言語としての小枝に基づいています。彼にそれを使わせてください:

{{ form_label(form.field) }}

このようなものを生成します:

<label for="field">field</label>

フォームをレンダリングするために、使用可能なすべての関数を使用できます。

{{ form_label() }}
{{ form_widget() }}
{{ form_errors() }}

これらの関数によってレンダリングされるものをカスタマイズしたい場合は、Symfony2のドキュメントで定義されているようにtwigテンプレートをオーバーライドできます。

それ以外の場合、本当に醜いものが必要な場合は、この種の構文を使用できます。

{{ myform.vars.value.myField }}
于 2012-06-25T10:56:58.507 に答える