13

フィルタリングされたエンティティのコレクションの html テーブルを表示しています。選択したエンティティをセッション変数に追加するフォームの一部として、各行にチェックボックスを表示したいと考えています。

各チェックボックスには値としてエンティティ ID が必要であり、フォーム フィールド データから ID の配列を取得する必要があると考えています (よろしいので、値はエンティティへの間接的な参照である必要がありますが、シンプルさ)。

エンティティの id プロパティにマップされ、コレクション型フィールドを持つ別のフォーム Type に埋め込まれた、単一のエンティティ型フィールドを持つフォーム Type を作成しようとしました。

class FooEntitySelectByIdentityType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('foo_id', 'entity', array(
            'required'  => false,
            'class'    => 'MeMyBundle:FooEntity',
            'property' => 'id',
            'multiple' => true,
            'expanded' => true
        ));
    }

# ...

class FooEntitySelectionType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('identity', 'collection', array(
            'type'   => new FooEntitySelectByIdentityType,
            'options'  => array(
                'required' => false,
                'multiple' => true,
                'expanded' => true,
                'attr'     => array('class' => 'foo')
            ),
        ));
    }

# ...

コントローラーでは、エンティティのコレクションを初期データとして使用してフォームが作成されます

$form = $this
    ->createForm(
        new \Me\MyBundle\Form\Type\FooEntitySelectionType,
        $collection_of_foo
    )
    ->createView()
;

フォームがレンダリングされると、ID フィールドのラベルが 1 つ表示されますが、ウィジェットは表示されません。

この特定の方法でエンティティとコレクション タイプのフィールドを使用することさえ可能ですか? もしそうなら、私は何が間違っているのでしょうか?

4

3 に答える 3

8

これであなたの質問に答えられると思います。

を忘れてくださいFooEntitySelectionTypeproperty_pathフィールド オプションを に追加し、オプションをFooEntitySelectByIdentityTypeに設定しdata_classますnull

class FooEntitySelectByIdentityType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('foo_id', 'entity', array(
            'required'      => false,
            'class'         => 'MeMyBundle:FooEntity',
            'property'      => 'id',
            'property_path' => '[id]', # in square brackets!
            'multiple'      => true,
            'expanded'      => true
        ));
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class'      => null,
            'csrf_protection' => false
        ));
    }

# ...

コントローラーで、次をビルドしますFooEntitySelectByIdentityType

$form = $this
    ->createForm(
        new \Me\MyBundle\Form\Type\FooEntitySelectByIdentityType,
        $collection_of_foo
    )
    ->createView()
;

次に、POST されたデータを受け取るコントローラー アクションで:

$form = $this
    ->createForm(new \Me\MyBundle\Form\Type\FooEntitySelectByIdentityType)
;
$form->bind($request);
if ($form->isValid()) {
    $data = $form->getData();
    $ids  = array();
    foreach ($data['foo_id'] as $entity) {
        $ids[] = $entity->getId();
    }
    $request->getSession()->set('admin/foo_list/batch', $ids);
}

最後に、小枝テンプレートで:

{# ... #}
{% for entity in foo_entity_collection %}
    {# ... #}

    {{ form_widget(form.foo_id[entity.id]) }}

    {# ... #}
于 2013-02-01T19:11:43.250 に答える
2

構成可能な方法でエンティティのコレクションをチェックボックス テーブルとしてレンダリングするためのsymfony バンドルを作成します。この質問が出されてからしばらく経ちましたが、これが同じ種類の問題を抱えている他の人に役立つことを願っています.

于 2016-04-18T14:00:29.460 に答える