2017-03-02 5 views
0

Ich habe eine function in meinem controller, die mich eine Restaurantseite bearbeiten lassen kann.Kann ein Formular nicht bearbeiten, wo "setData" festgelegt wurde - Symfony3

Ich brauchte setData einige Werte, um sie von der angezeigten Sicht auf die Bearbeitungsansicht zu halten, und ich brauchte es auf dem city und zipCode Feld.

$editForm->get('cityName')->setData($restaurant->getCity()->getName()); 
$editForm->get('cityZipCode')->setData($restaurant->getCity()->getZipCode()); 

Aber ich kann nicht mehr meine Form bearbeiten, wenn ich setData verwendet, da diese Fehlermeldung erscheint, ist

You cannot change the data of a submitted form. 

Hier ist der Controller Teil

public function editAction(Request $request, Restaurant $restaurant) 
{ 
    $deleteForm = $this->createDeleteForm($restaurant); 
    $editForm = $this->createForm(RestaurantType::class, $restaurant); 
    $editForm->handleRequest($request); 

    $editForm->get('cityName')->setData($restaurant->getCity()->getName()); 
    $editForm->get('cityZipCode')->setData($restaurant->getCity()->getZipCode()); 

    if ($editForm->isSubmitted() && $editForm->isValid()) { 
     $em = $this->getDoctrine()->getManager(); 
     $cityManager = $this->container->get('admin.city_manager'); 
     $cityManager->newCity($editForm, $restaurant); 

     $em->flush(); 

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

    return $this->render('admin/restaurant/edit.html.twig', array(
     'restaurant' => $restaurant, 
     'edit_form' => $editForm->createView(), 
     'delete_form' => $deleteForm->createView(), 
    )); 
} 

und hier ist die FormType

public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('name', TextType::class, array(
       'label'     => 'Nom', 
      )) 
      ->add('latitude', NumberType::class, array(
       'label'     => 'Latitude', 
      )) 
      ->add('longitude', NumberType::class, array(
       'label'     => 'Longitude', 
      )) 
      ->add('address', TextType::class, array(
       'label'     => 'Adresse', 
      )) 
      ->add('cityName', TextType::class, array(
       'mapped'    => false, 
       'label'     => 'Ville' 
      )) 
      ->add('cityZipCode', TextType::class, array(
       'mapped'    => false, 
       'label'     => 'Code Postal' 
      )) 
} 

Wenn Sie etwas haben, das mir helfen und dieses Problem beheben könnte, würde es sehr geschätzt werden.

Antwort

2

Sobald Sie das Formular erstellt und die handleRequest aufgerufen haben, verwendet Symfony diese Version des Formulars für die Verarbeitung (z. B. Validierung usw.). Wenn Sie das Formular danach ändern, wird Symfony nicht glücklich sein.

Je nachdem, was Sie versuchen und wie Sie Ihre Entität/Ihr Formular definiert haben, verwenden Sie entweder validation groups oder dynamic form events, um Änderungen vorzunehmen.

Von dem, was Sie gezeigt haben, warum nicht das Formular ändern, um den Stadtnamen des Restaurants anzuzeigen, anstatt zu versuchen, es in der Steuerung einzustellen.
Zum Beispiel;

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
     ->add('name', TextType::class, array(
      'label'     => 'Nom', 
     )) 
     ->add('latitude', NumberType::class, array(
      'label'     => 'Latitude', 
     )) 
     ->add('longitude', NumberType::class, array(
      'label'     => 'Longitude', 
     )) 
     ->add('address', TextType::class, array(
      'label'     => 'Adresse', 
     )); 

    // if you want the fields not shown on the form 
    if (! empty($options['data']->getCity()) { 
     $builder->add('cityName', TextType::class, array(
      'data' => $options['data']->getCity()->getName() 
      'mapped'    => false, 
      'label'     => 'Ville' 
     )) 
     ->add('cityZipCode', TextType::class, array(
      'data' => $options['data']->getCity()->getZipCode() 
      'mapped'    => false, 
      'label'     => 'Code Postal' 
     )); 
    } 
    // or if you want them there 
    $cityName = ''; 
    $cityZipCode = ''; 
    if (! empty($options['data']->getCity()) { 
     $cityName = $options['data']->getCity()->getName(); 
     $cityZipCode = $options['data']->getCity()->getZipCode(); 
    } 
     $builder->add('cityName', TextType::class, array(
      'data' => $cityName 
      'mapped'    => false, 
      'label'     => 'Ville' 
     )) 
     ->add('cityZipCode', TextType::class, array(
      'data' => $cityZipCode 
      'mapped'    => false, 
      'label'     => 'Code Postal' 
     )); 
    } 
} 
+0

Hallo @Rooneyl danke für Ihren Kommentar. Ich habe 'FormEvents' gesehen, aber ich bin ziemlich neu und ich weiß nicht wirklich, wie ich das mit Formevents beheben kann. Was meinst du mit 'ammend the forw to show ...' wenn du willst, kann ich den Formularabschnitt zu meiner Frage hinzufügen, wenn du ihn sehen willst? –

+0

@crisscross können Sie den Teil des Formular-Codes hinzufügen, der den Namen/Code der Stadt erstellt, und ich werde versuchen, Ihnen zu helfen – Rooneyl

+0

Ich habe das Formular hinzugefügt, danke für Ihre Hilfe :) –

Verwandte Themen