2013-08-08 7 views
5

확인란이 있는데 확인란이있는 항목을 찾아서 데이터베이스에만 보내고 싶습니다. 그래서 이것을 만들었습니다 :Symfony의 Form Event를 사용하여 양식에 전송 된 일부 데이터를 제거하십시오.

class NotNeededFieldsSubscriber implements EventSubscriberInterface 
{ 
    public static function getSubscribedEvents() 
    { 
     return array(FormEvents::PRE_BIND => 'preBindData'); 
    } 

    public function preBindData(FormEvent $event) 
    {  
     $data = $event->getData(); 

     $count = count($data['items']); 

     for ($i=0; $i < $count; $i++){ 
      if (!array_key_exists('enabled', $data['items'][$i])){ 
       unset($data['items'][$i]);    
      } 
     }  

     $event->setData($data); 

    } 
} 

$ event-> getData가 내가 원하는 것을 정확히 볼 수 있는지 테스트합니다. ?!

$form = $this->formFactory->create(new ItemType(), $item); 

     if ($request->isMethod('POST')) { 
      $form->bind($request);   
       if ($form->isValid()) { 

        $this->em->persist($item); 
        $this->em->flush(); 
       } 
     } 

     return $this->redirect($this->router->generate('home')); 

문제 여전히 확인하고 선택하지 않은 항목은 데이터베이스 :(에 있는지

왜, 어떻게 사전에 대단히이 감사를 해결하기 위해 어떤 아이디어를 :) : 컨트롤러에서

은 "D는 특히 http://symfony.com/doc/current/cookbook/form/form_collections.html#allowing-tags-to-be-removed

: 확인란 모음이 사실이기 때문에

+0

ItemType 자체 내에서 이벤트를 바인딩 했습니까? http://symfony.com/doc/current/cookbook/form/dynamic_form_modification.html#adding-an-event-subscriber-to-a-form-class – stefancarlton

+0

예, 있습니다 :(데이터 배열이 정확합니다. 하지만 컨트롤러에 체크인 할 때'$ item'은 여전히 ​​모든 데이터를 가지고 있습니다 .. – Faery

+0

아, 레코드를 편집하고 있습니까? 데이터를 제거하여 설정을 해제하면 덮어 쓰지 않습니다. 예 : unset을 바꾸어보십시오 , $ data [ 'items'] [$ i] = 0; – stefancarlton

답변

0

, 어쩌면 당신은 문서의이 부분을 참조해야합니다 octrine : 데이터베이스 지속성 보장 "부분. 데이터베이스에 아직 저장되어 있지 않은 상태로 수동으로 제거해야합니다.

 // filter $originalTags to contain tags no longer present 
    foreach ($task->getTags() as $tag) { 
     foreach ($originalTags as $key => $toDel) { 
      if ($toDel->getId() === $tag->getId()) { 
       unset($originalTags[$key]); 
      } 
     } 
    } 

    // remove the relationship between the tag and the Task 
    foreach ($originalTags as $tag) { 
     // remove the Task from the Tag 
     $tag->getTasks()->removeElement($task); 

     // if it were a ManyToOne relationship, remove the relationship like this 
     // $tag->setTask(null); 

     $em->persist($tag); 

     // if you wanted to delete the Tag entirely, you can also do that 
     // $em->remove($tag); 
    }