2013-04-01 13 views
9

Sto provando a impostare un valore selezionato all'interno di un campo entità. In accordo con molte discussioni che ho visto su questo argomento, ho cercato di impostare l'opzione data ma questo non seleziona uno dei seguenti valori di default:Symfony2 - Imposta un valore selezionato per il campo entità

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

    // ... 
} 

In cerca di più ho scoperto che alcuni le persone dovevano disattivare la mappatura del modulo all'entità. Che sembra logico quindi ho provato ad aggiungere 'mapped' => false alle opzioni, ma senza successo ...

Se può aiutare, ecco il mio controller:

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

E la classe 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(); 
    } 
} 

Sono un po 'bloccato in questo momento, c'è qualcuno che ha un'idea?

risposta

24

Hai solo bisogno di impostare i dati del tuo campo:

 
    
    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

Non ricordo davvero, ma penso di aver già provato questo prima, senza successo. Beh, accetterò questo come una risposta dato che al momento non riesco a provare la soluzione (non sto più lavorando a questo progetto), sembra essere il modo più logico. – Nesk

7

Per visualizzare l'opzione selezionata nel modulo, è necessario impostare il valore corrispondente all'entità stessa.

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

In realtà, mi dispiace per il primo commento, funziona è stato un errore dalla mia parte! –

+1

In effetti, l'ho già fatto ma ho dimenticato di menzionarlo nella domanda. L'ho modificato Grazie dell'aiuto. – Nesk

0

Quando si utilizza l'opzione query_builder, e l'opzione data si aspetta un esempio di raccolta, e si don' t desidera toccare il controller aggiungendo setDatas solo per determinati campi e hai già il tuo querybuilder e gli id ​​dell'optio ripopolamento ns nel modulo di classe tipo, è possibile ripopolare una selezione come segue:

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

Poi, nel tuo add() Metodo

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

EDIT: utilizzo reale caso esempio

Si desidera ripopolare un gruppo di caselle di controllo reso con i seguenti elementi:

Label: What is your favourite meal?

4 Checkboxes: Pasta, Pizza, Spaghetti, Steak

e si vuole ripopolare 2 Caselle di controllo:

Pizza, Steak

$qb_all sarebbe un'istanza QueryBuilder con tutti e 4 selezionabili Checkboxes

$qb_filtered sarebbe un nuova istanza di QueryBuilder aggiuntiva con Ch di ripopolamento eckboxes Pizza, Steak. Quindi una versione "filtrata" della precedente.

+0

Per favore spiegalo meglio. Cosa è '$ qb_all' e cosa è' $ qb_filtered' in un caso d'uso reale? –

+0

@ bought777 Ho aggiunto un EDIT al mio post. È più chiaro ora? –

0

Per non-mapped campi di selezione entità, il metodo più semplice che ho trovato è stato utilizzando l'opzione choice_attr con un callable. Questo itererà sulla raccolta di scelte e ti permetterà di aggiungere attributi personalizzati in base alle tue condizioni e funziona con opzioni di attributi espanse, multiple e personalizzate.

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; 
      } 
     )) 
     //... 
    ; 
} 
Problemi correlati