2013-04-01 2 views
9

엔티티 필드 내에서 선택된 값을 설정하려고합니다. 나는이 주제에 대해 본 적이 많은 논의에 따라, 나는 data 옵션을 설정하려고하지만이 기본적으로 값 중 하나를 선택하지 않습니다 더 좀 것으로 나타났습니다 찾고으로Symfony2 - 엔티티 필드에 대해 선택된 값을 설정하십시오.

class EventType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('place', 'entity', array(
       'class' => 'RoyalMovePhotoBundle:Place', 
       'property' => 'name', 
       'empty_value' => "Choisissez un club", 
       'mapped' => false, 
       'property_path' => false, 
       'data' => 2 
      )) 
      ->add('begin') 
      ->add('end') 
      ->add('title') 
      ->add('description') 
     ; 
    } 

    // ... 
} 

사람들은 엔티티에 대한 양식 매핑을 비활성화해야했습니다. 즉, 논리적 보인다 그래서

가 도움이 될 수 있다면 ... 성공없이 옵션 'mapped' => false를 추가하려고 여기 내 컨트롤러 :

class EventController extends Controller 
{ 
    // ... 

    public function addAction() 
    { 
     $request = $this->getRequest(); 
     $em = $this->getDoctrine()->getManager(); 

     $event = new Event(); 
     $form = $this->createForm(new EventType(), $event); 

     $formHandler = new EventHandler($form, $request, $em); 

     if($formHandler->process()) { 
      $this->get('session')->getFlashBag()->add('success', "L'évènement a bien été ajouté."); 
      return $this->redirect($this->generateUrl('photo_event_list')); 
     } 

     return $this->render('RoyalMovePhotoBundle:Event:add.html.twig', array(
      'form' => $form->createView() 
     )); 
    } 
} 

그리고 EventHandler 클래스 :

class EventHandler extends AbstractHandler 
{ 
    public function process() 
    { 
     $form = $this->form; 
     $request = $this->request; 

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

      if($form->isValid()) { 
       $this->onSuccess($form->getData()); 
       return true; 
      } 
     } 

     return false; 
    } 

    public function onSuccess($entity) 
    { 
     $em = $this->em; 

     $em->persist($entity); 
     $em->flush(); 
    } 
} 

나는 지금 막 붙어있어, 아이디어가있는 사람이 있니?

답변

24

당신은 당신의 필드의 데이터를 설정할 필요가 :

 
    
    class EventController extends Controller 
    { 
     // ... 

     public function addAction() 
     { 
      $request = $this->getRequest(); 
      $em = $this->getDoctrine()->getManager(); 

      $event = new Event(); 
      $form = $this->createForm(new EventType(), $event); 

      // ------------------------------------------- 
      // Suppose you have a place entity.. 
      $form->get('place')->setData($place); 
      // That's all.. 
      // ------------------------------------------- 

      $formHandler = new EventHandler($form, $request, $em); 

      if($formHandler->process()) { 
       $this->get('session')->getFlashBag()->add('success', "L'évènement a bien été ajouté."); 
       return $this->redirect($this->generateUrl('photo_event_list')); 
      } 

      return $this->render('RoyalMovePhotoBundle:Event:add.html.twig', array(
       'form' => $form->createView() 
      )); 
     } 
    } 

+1

나는 정말로 기억하지 못한다. 그러나 나는 성공 전에 이것을 이미 시도해 보았다고 생각한다. 글쎄, 나는이 솔루션을 지금은 (이 프로젝트에서 더 이상 일하고 있지 않다) 해결할 수 없기 때문에 응답으로 받아 들일 것이다. 더 논리적 인 방법 인 것 같다. – Nesk

7

양식에 옵션이 표시되도록하려면 해당 값을 항목 자체에 설정해야합니다.

$place = $repository->find(2); 
$entity->setPlace($place); 
$form = $this->createForm(new SomeFormType(), $entity); 
.... 
+0

사실, 첫 번째 의견을 드려 죄송합니다. 오류가 발생했습니다. –

+1

사실, 나는 이미 이것을했지만 그 질문에서 언급하는 것을 잊어 버렸다. 나는 그것을 편집했다. 도와 줘서 고맙다. – Nesk

0

당신이 query_builder 옵션을 사용하고 data 옵션은 수집 인스턴스를 기대하고 돈 때 ' t은 특정 필드에만 setDatas을 추가하여 컨트롤러를 터치하려고합니다. 이미 쿼리 작성기와 다시 채우는 optio ID가 있습니다. 양식 유형 클래스 NS, 당신은 다음과 같은 선택을 다시 채울 수 있습니다 실제 사용 사례의 예를

:

'data' => $entities_selected->getQuery()->getResult(), // Repopulation 
'query_builder' => $entities, 

편집

추가 기능에서 다음
// Querybuilder instance with filtered selectable options 
$entities = $qb_all; 
// Querybuilder instance filtered by repopulating options (those that must be marked as selected) 
$entities_selected = $qb_filtered; 

() 메소드를

다음 요소로 렌더링 된 확인란 그룹을 다시 채우려는 경우

Label: What is your favourite meal?

4 Checkboxes: Pasta, Pizza, Spaghetti, Steak

그리고 당신은이 개 체크 박스를 다시 채워야 할 :

Pizza, Steak

$qb_all는 4 개 선택 체크 박스

$qb_filtered 일 것와 QueryBuilder 인스턴스 것 Reopulating Ch가있는 새로운 추가 QueryBuilder 인스턴스 eckboxes Pizza, Steak. 이전 버전의 "필터링 된"버전입니다.non-mapped 엔티티 선택 필드

+0

설명해주십시오. 실제 사용 케이스에서'$ qb_all '은 무엇이고'$ qb_filtered'는 무엇입니까? –

+0

@ bought777 내 게시물에 EDIT를 추가했습니다. 그것의 더 명확한 지금? –

0

, 내가 가장 쉬운 발견 callablechoice_attr 옵션을 사용했던 방법. 이렇게하면 선택 항목 집합을 반복하고 조건에 따라 사용자 지정 특성을 추가 할 수 있으며 확장 된 특성, 여러 특성 및 사용자 지정 특성 옵션을 사용할 수 있습니다.

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('place', 'entity', array(
      //... 
      'choice_attr' => function($place) { 
       $attr = []; 
       if ($place->getId() === 2) { 
        $attr['selected'] = 'selected'; 
        //for expanded use $attr['checked'] = 'checked'; 
       } 
       return $attr; 
      } 
     )) 
     //... 
    ; 
} 
관련 문제