2016-01-08 2 views
1

Я использую два объекта, имеющих отношение ManyToMany, Jobsite, имеющее свойство worker и наоборот. У меня есть форма JobsiteType, которая предлагает список рабочих для выбора или нет, она работает достаточно с несколькими выборами: select или unselect хорошо распространяются в db, но при использовании флажков это не работает: unselect item не удаляет его из отношение таблица. Я использую Symfony 2.8 V, вот несколько деталей:Элементы типа формы формы не удаляют непроверенные элементы

// Entity Jobsite

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

// Entity работник

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

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

ответ

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

EDIT Правильный ответ

так просто, как представить флаг, который удалить пустые вещи

// contoller 
$form->submit($request, true);// second arg true is the trick 
Смежные вопросы