0

シナリオ:

  1. ステップ 1: 古い Web サービスから情報を取得する
  2. ステップ 2: x のラジオ ボタンをフォームに追加しますが、x は Web サービスからの情報に依存します

ドキュメントに示されているように、イベント サブスクライバー クラスを追加する必要があることを理解しています。

$event には setData メソッドがあります。おそらく私はそれを使用する必要があります。コントローラーからこのメソッドにアクセスするにはどうすればよいですか?

追加情報: Doctrine を使用しています。現在、Doctrine エンティティを作成しており、これを次のようなフォームに渡しています。

$product = new Product(); $form = $this->createForm(new ProductType(), $product);
4

2 に答える 2

0

$event オブジェクトで setData() を実行する必要はありません。データに従って希望する方法でon POST_SET_DATAフォームを構築するロジックを実装する必要があります。

次に、Web サービスの応答を使用して (コントローラー内で) フォームを初期化する必要があります。

(注: SET_DATA フォーム イベントはバージョン 2.1 以降非推奨です。バージョン 2.3 では確実に削除されます)

アップデート:

配列をフォーム データとして設定し、 aDataTransformerを使用してフォームのデータを必要な方法で構造化できます。前回のサンフランシスコ Symfony Liveで、 Symfony 2 Form TricksData Transformation 部分をご覧ください。

于 2013-02-12T14:02:26.737 に答える
0

これが私の最終的な解決策です。これが最善の方法であるかどうかわからないため、この回答は、より経験豊富な他の Symfony ユーザーがより良い解決策を考え出すことを奨励するために正しいとマークされていません。

このソリューションで気に入らない点は、製品エンティティ全体をフォームに渡すことができなくなり、オプション配列に各属性を個別に追加する必要があることです。

とにかく、それが現在実装されている方法です:

動的データは、オプション配列を createForm() の 2 番目のパラメーターとして使用して渡されます。

  // ExampleController.php

  use Acme\ExampleBundle\Entity\Product;
  public function addAction()
  {
     // choices contains the dynamic data I am fetching from the webservice in my actual code
     $choices = array("key1" => "value1", "key2" => "value2");

     // now create a new Entity
     $product = new Product();

     // and some attributes already have values for some reason
     $product->setPrice(42);

     $form = $this->createForm(new AddproductType(), 
              array(
                 "choices" => $choices,
                 "price"   => $product->getPrice() 
               )
            );
     if ($request->isMethod('POST')) {
        $form->bind($request);
        if ($form->isValid()) {
          // ... standard symfony stuff here
        }
     }
    return array(
        'form' => $form->createView()
    );
 }

そしてフォームクラスです。イベント リスナー部分と setDefaultOptions メソッドに注意してください。

// ProductType.php

namespace Acme\ExampleBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;


class ProductType extends AbstractType
{

  public function buildForm(FormBuilderInterface $builder, array $options)
  {
    $formFactory = $builder->getFormFactory();
    $builder->addEventListener(
        FormEvents::PRE_SET_DATA,
        function (\Symfony\Component\Form\FormEvent $event) use ($formFactory) {

                // get the option array passed from the controller
                $options = $event->getData();

                $choices = $options["choices"];
                $event->getForm()->add(
                // add a new element with radio buttons to the form
                $formFactory->createNamed("my_dynamic_field_name", "choice", null, array(
                        "empty_value" => "Choose an option",
                        "label" => "My dynamic field: ",
                        "choices" => $choices
                    )
                )
            );

        }
    );

    // ... add other form elements
    $builder->add("price", "text");
    // ..
 }

 public function setDefaultOptions(OptionsResolverInterface $resolver)
 {
    // register choices as a potential option
    $resolver->setDefaults(array(
        'choices' => null
    ));
 }
}
于 2013-02-24T12:59:44.813 に答える