2013-04-01 14 views
9

Ich versuche, einen ausgewählten Wert in einem Entity-Feld festzulegen. In Übereinstimmung mit vielen Diskussionen, die ich zu diesem Thema gesehen habe, habe ich versucht, die data Option zu setzen, aber dies standardmäßig alle Werte nicht wählen:Symfony2 - Setzen Sie einen ausgewählten Wert für das Entity-Feld

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

    // ... 
} 

Mit der Suche nach mehr ich habe, dass einige gefunden Die Benutzer mussten die Formularzuordnung für die Entität deaktivieren. Das erscheint logisch, also habe ich versucht 'mapped' => false zu den Optionen hinzuzufügen, ohne Erfolg ...

Wenn es helfen kann, hier ist mein 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() 
     )); 
    } 
} 

Und die EventHandler Klasse:

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

Ich stecke gerade ein bisschen fest, gibt es jemanden, der eine Idee hat?

Antwort

24

Sie nur die Daten des Feldes setzen müssen:

 
    
    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

Ich kann mich nicht wirklich erinnern, aber ich denke, ich habe das schon vorher versucht, ohne Erfolg. Nun, ich werde das als Antwort akzeptieren, da ich Ihre Lösung im Moment nicht ausprobieren kann (ich arbeite nicht mehr an diesem Projekt), es scheint der logischere Weg zu sein. – Nesk

7

Damit die Option im Formular ausgewählt erscheint, sollten Sie den entsprechenden Wert für das Objekt selbst festlegen.

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

Eigentlich tut mir leid für den ersten Kommentar, es funktioniert, es war ein Fehler auf meiner Seite! –

+1

Tatsächlich tat ich das schon, aber vergaß es in der Frage zu erwähnen. Ich habe es bearbeitet. Danke fürs Helfen. – Nesk

0

Wenn Sie die query_builder Option, und die data Option erwartet eine Sammlung Beispiel, und Sie don‘ t möchten Sie Ihren Controller berühren, indem Sie setDatas nur für bestimmte Felder hinzufügen, und Sie haben bereits Ihren QueryBuilder und die IDs der repopulating optio

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

Dann in Ihrem add() Methode

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

EDIT: ns in der Typklasse Formular können Sie eine Auswahl wie folgt neu zu besiedeln Echt Use Case Beispiel

Sie möchten eine Checkbox-Gruppe neu auffüllen, die mit folgenden Elementen gerendert wird:

Label: What is your favourite meal?

4 Checkboxes: Pasta, Pizza, Spaghetti, Steak

Und Sie wollen 2 Ankreuzfelder wieder zu bevölkern:

Pizza, Steak

$qb_all wäre ein Querybuilder-Instanz mit dem alle 4 wählbare Ankreuzfelder

$qb_filtered wäre ein neue zusätzliche QueryBuilder-Instanz mit dem Repopulierenden Ch eckboxen Pizza, Steak. Also eine "gefilterte" Version des vorherigen.

+0

Bitte erklären Sie das besser. Was ist '$ qb_all' und was ist' $ qb_filtered' in einem echten Anwendungsfall? –

+0

@ gekaufte77 Ich habe einen EDIT zu meinem Post hinzugefügt. Es ist jetzt klarer? –

0

Für non-mapped Einheit Auswahlfelder, die Methode, die ich gefunden am einfachsten war mit einem callable die choice_attr Option. Dadurch wird die Sammlung von Auswahlmöglichkeiten durchlaufen und Sie können benutzerdefinierte Attribute basierend auf Ihren Bedingungen hinzufügen und mit erweiterten, mehreren und benutzerdefinierten Attributoptionen arbeiten.

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; 
      } 
     )) 
     //... 
    ; 
} 
Verwandte Themen