1

<option>選択した属性をタグに追加しようとしています

{% for product in form.products %}
   {# of course this should only done inside a if, 
      but for testing purpose, it's okay #}

   {{ form_widget(product, { 'attr': {'selected': 'selected'} }) }}

{% endfor %}

ただし、これは機能しません。ここの symfony2 ドキュメントからのまったく同じコピー & ペーストでも機能しません: http://symfony.com/doc/current/book/forms.html#rendering-each-field-by-hand

FormType à la 内にフォーム要素を追加しています。

public function buildForm(FormBuilderInterface $builder, array $options) {
        parent::buildForm($builder, $options);
        $builder
        ->add('products', 'entity', array('attr' => array('class' => 'choseable input-xlarge'), 
              'property_path' => false, 'label' => 'form.products.title', 'class' => 'Test\Bundle\Entity\Product', 'choices' => $products, 'multiple' => true, 'empty_value' => 'form.products.placeholder'));
}

$products上記の例では、すべての変数 ( ) は問題ありません。

問題はありますか?

Symfony 2.1.9-dev を使用しています。

4

2 に答える 2

0

コードにはいくつかの問題があります。わかりやすくするために、以下のコードを再フォーマットしました。

public function buildForm(FormBuilderInterface $builder, array $options) {
    parent::buildForm($builder, $options);

    $builder->add('products', 'entity', array(
        'attr' => array('class' => 'choseable input-xlarge'), 
        'property_path' => false,
        'label' => 'form.products.title',
        'class' => 'Test\Bundle\Entity\Product',
        'choices' => $products,
        'multiple' => true,
        'empty_value' => 'form.products.placeholder'
    ));
}
  1. フォーム タイプにクラス継承を使用しないでください (もちろん拡張を除くAbstractType)。getParent()代わりに、他のタイプを拡張するために使用します。
  2. <option>タグの属性を手動で設定することはできません。タグを手動でレンダリングする必要があります。
  3. 選択肢を選択済みとしてマークするには、デフォルト データをフィールドに渡す必要があります。通常、デフォルトを取得するためにここで呼び出されますが、 に設定しgetProducts()て無効にしました。そのため、オプションを使用して手動でデフォルトを設定する必要があります。isであるため、デフォルトは配列/コレクションである必要があることに注意してください。property_pathfalsedatamultipletrue
  4. を手動で渡していますがchoices、これは悪い習慣です。このオプションを削除するだけで、エンティティ フィールド自体が DB からの選択肢をクエリし、必要なステートメントを最適化してパフォーマンスを向上させることができます。
  5. コードをフォーマットします。本当。:P
于 2013-05-04T11:51:21.097 に答える