2017-03-24 6 views
0

Ich habe eine neue (create) -Methode für eine Roster-Entität und möchte zu dieser Methode von einer anderen Service-Benutzer-Entität aus navigieren, die den Service-Benutzer als Parameter übergibt. Ich möchte dann die ServiceUserId des Dienstplans auf die ID des Dienstbenutzerobjekts festlegen.Bind-Feld im Symfony-Formular an Parameter

Meine Controller-Methode leitet OK von der Servicebenutzereinheit zum Dienstplan und übergibt das Dienstbenutzerobjekt korrekt an das Formular.

/** 
    * Creates a new roster entity. 
    * 
    * @Route("/newfromsu/serviceUser={serviceUser}", name="roster_new_su") 
    * @Method({"GET", "POST"}) 
    */ 
    public function newActionfromServiceUser(Request $request, ServiceUser $serviceUser) 
    { 
     $roster = new Roster(); 
     $form = $this->createForm('AppBundle\Form\RosterType', $roster); 
     $form->handleRequest($request); 


     if ($form->isSubmitted() && $form->isValid()) { 
      $em = $this->getDoctrine()->getManager(); 
      $em->persist($roster); 
      $em->flush($roster); 

      return $this->redirectToRoute('roster_show', array('id' => $roster->getId())); 
     } 

     return $this->render('roster/newfromsu.html.twig', array(
      'roster' => $roster, 
      'serviceUser'=>$serviceUser 
     ,'form' => $form->createView(), 
     )); 
    } 

Die neue Roster Vorlagenseite und RosterType Klassen sind zur Zeit erstellt, wie durch den Templat-Code vorbelegt mit

{% extends '_base.html.twig' %} 

{% block body %} 
    {{ dump() }} 
    <h1>Roster creation</h1> 

    {{ form_start(form) }} 
    {{ form_widget(form) }} 
    <input type="submit" value="Create" /> 
    {{ form_end(form) }} 

    <ul> 
     <li> 
      <a href="{{ path('roster_index') }}">Back to the list</a> 
     </li> 
    </ul> 
{% endblock %} 

und

class RosterType extends AbstractType 
{ 
    /** 
    * {@inheritdoc} 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('serviceUserId')->add('rosterStartTime')->add('rosterEndTime')->add('rosterStatus')->add('numberResourcesNeeded')->add('customerId'); 

    } 

Meine Frage: Wie ich das einstellen kann serviceUserId Wert im neuen Formular ID des eingehenden ServiceUser-Objekts

Kann ich dies im FormBuilder tun oder muss ich manuell ein Twig-Formular erstellen, das jedes Attribut auflistet und das entsprechende Steuerelement dort bindet.

Danke!

Antwort

1

Der dritte Parameter der Controller :: createForm-Funktion ist ein Array mit Optionen.

$form = $this->createForm('AppBundle\Form\RosterType', $roster, array(
    'serviceUser' => $serviceUser 
)); 

nun in der Formtype-Klasse benötigen Sie für $ Optionen einen Standardwert gesetzt [ ‚serviceUser‘]:

class RosterType extends AbstractType 
{ 

    // ... 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'AppBundle\Entity\Roster', 
      'serviceUser' => NULL 
     )); 
    } 
} 

Und jetzt sind Sie in der Lage die Möglichkeit, in der buildForm Methode zu verwenden:

class RosterType extends AbstractType 
{ 

    /** 
    * {@inheritdoc} 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('serviceUserId', null, array(
       'data' => $options['serviceUser'] 
      )) 
      ->add('rosterStartTime') 
      ->add('rosterEndTime') 
      ->add('rosterStatus') 
      ->add('numberResourcesNeeded') 
      ->add('customerId') 
     ; 

    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'AppBundle\Entity\Roster', 
      'serviceUser' => NULL 
     )); 
    } 
} 
+0

Vielen Dank Frank für Ihre sehr klare Antwort, die perfekt funktioniert! –