Флажки типа объекта формы не удаляют неотмеченные элементы

Я использую два объекта, имеющих отношение ManyToMany, Jobsite, имеющий свойство worker, и наоборот. У меня есть форма 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
            ))
...

Так кто-нибудь знает, что не так со стилем флажков (несколько + расширенный)? Я знаю, что непроверенные входы ничего не отправляют, значит ли это, что мне нужно вручную перебирать рабочих в событии формы, чтобы применить правильные изменения? Ну, я также заметил, что он не работает с полем множественного выбора, когда ни один элемент не выбран, это, вероятно, связано с тем же эффектом «ничего не отправлено, если пусто».


person David    schedule 08.01.2016    source источник


Ответы (1)


Ну, для множественного выбора необходимо проверить, установлено ли поле, если не применить пустой массив в качестве данных поля, то распространение данных в порядке, пустой набор удалит элементы из таблицы отношений... Но это не так. разрешить несколько флажков :(

    $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
person David    schedule 11.01.2016