1

我正在使用两个具有 ManyToMany 关系的实体,Jobsite 具有 workers 属性,反之亦然。我有一个表单 JobsiteType ,它建议选择或不选择工作人员列表,它适用于多个选择:选择或取消选择在数据库中很好地传播,但在使用复选框时它不起作用:取消选择项目不会从中删除关系表。我正在使用 Symfony v 2.8,这里有一些细节:

// 实体工地

class Jobsite {
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\ManyToMany(targetEntity="UserWorker", inversedBy="jobsites", cascade={"all"})
     * @ORM\JoinTable(name="jobsite_worker")
     */
    protected $workers;
...

// 实体工作者

class UserWorker {
    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\ManyToMany(targetEntity="Jobsite", mappedBy="workers", cascade={"all"})
     */
    protected $jobsites;
    ...

// 工作地点类型

    public function buildForm(FormBuilderInterface $builder, array $options) {
        ...
        $builder
            ->add('workers', EntityType::class, array(
                'class' => 'MyBundle:UserWorker',
                'choice_label' => 'name',
                'choices_as_values' => true,
                'by_reference' => false,
                'multiple' => true,
                'expanded' => true,// if false, multiple select is working almost well !
                'label' => 'label.workers',
                'required' => false,
                'choices' => $workers,// list of possible workers
            ))
...

那么有人知道复选框样式(多个+扩展)有什么问题吗?我知道未经检查的输入什么也不发送,这是否意味着我必须在表单事件中手动循环通过工作人员以应用正确的更改?好吧,我还注意到,当没有选择任何项目时,它不适用于多个选择框,它可能与相同的“如果为空则不发送”效果有关。

4

1 回答 1

0

好吧,对于多选,需要检查是否设置了字段,如果没有应用一个空数组作为字段数据,那么数据传播是可以的,空集将从关系表中删除项目......但它没有解决多个复选框:(

    $builder
        ...
        ->addEventListener( FormEvents::PRE_SUBMIT, function(FormEvent $event) {
                $form = $event->getForm();
                $data = $event->getData();

                // the trick : allow empty selection (reset list)
                if(!isset($data['workers'])){   $data['workers'] = [];}

                $event->setData($data);
            }
        )

编辑正确答案

就像一个删除空东西的提交标志一样简单

// contoller
$form->submit($request, true);// second arg true is the trick
于 2016-01-11T08:41:39.623 回答