-->

构建具有在教义集合为每个实体复选框形式(Build a form having a checkbox

2019-07-19 02:17发布

我为显示实体的集合过滤的HTML表格,我要显示的每个行中的复选框为将所选择的实体添加到会话变种形式的一部分。

我在想,每个复选框应具备的实体ID作为其价值,我会得到的ID从表单字段数据的数组(OK,所以价值应该是间接裁判的实体,但为求简单)。

我试图创建一个单一的实体类型字段的表单类型,映射到实体的id属性,并嵌入到具有收藏类型字段另一种形式的类型。

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()
;

当窗体渲染,是身份字段中的一个标签,但没有小部件。

它甚至有可能在这个特殊的方式来使用实体和集合类型的字段? 如果是这样,什么可能我是做错了什么?

Answer 1:

我认为这会回答你的问题。

忘记FooEntitySelectionType 。 添加property_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()
;

然后在接收到该发布数据的控制器动作:

$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]) }}

    {# ... #}


Answer 2:

如果有人正在寻找的的Symfony> = 2.3解决方案

你必须改变这一点:

    $data = $form->getData();
    $ids  = array();
    foreach ($data['foo_id'] as $entity) {
        $ids[] = $entity->getId();
    }

为此:

    $data = $form['foo_id']->getData();
    $ids = array();
    foreach ($data as $entity) {
        $ids[] = $entity->getId();
    }


Answer 3:

我创建的symfony捆绑在一个可配置的方式呈现实体复选框表的集合。 虽然已经有一段时间,因为这个问题被问,我希望这可以帮助别人与此同样的问题。



文章来源: Build a form having a checkbox for each entity in a doctrine collection