表单实体类型复选框不会删除未选中的项目

时间:2016-01-08 07:38:27

标签: symfony symfony-forms symfony-2.8

我使用两个具有ManyToMany关系的实体,Jobsite具有workers属性,反之亦然。我有一个表单JobsiteType,它提出了一个工作列表来选择与否,它与多个select非常相似:select或unselect在db中很好地传播,但是当使用复选框时它不起作用:unselect item不会从中删除它关系表。 我正在使用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;
    ...

// JobsiteType

    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
            ))
...

那么有谁知道复选框样式有什么问题(多个+扩展)?我知道未经检查的输入什么都不发送,所以它是否意味着我必须在表单事件中手动循环工作以应用正确的更改?我还注意到,当没有选择任何项目时,它不能与多个选择框一起使用,它可能与相同的“没有任何已发送的空白”效果相关。

1 个答案:

答案 0 :(得分: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
相关问题