2011-07-07 13 views
20

Gotowy do pracy. Zobacz aktualizację poniżej:Symfony2 Form Entity Update

Czy ktoś może pokazać mi konkretny przykład aktualizacji encji w postaci Symfony2? Książka pokazuje tylko, jak utworzyć nowy byt. Potrzebuję przykładu, jak zaktualizować istniejący podmiot, w którym początkowo przekazuję identyfikator podmiotu w ciągu zapytania. Oto, co aktualnie mam, ale nie działa, ponieważ nadpisuje encję, gdy formularz zostanie opublikowany. Domyślam się, że mam problem ze zrozumieniem, jak ponownie uzyskać dostęp do formularza w kodzie, który sprawdza post bez ponownego tworzenia formularza. A jeśli odtworzę formularz, oznacza to, że muszę ponownie zapytać o istotę, co nie ma większego sensu.

public function updateAction($id) 
{ 
    $em = $this->getDoctrine()->getEntityManager(); 
    $testimonial = $em->getRepository('MyBundle:Testimonial')->find($id); 
    $form = $this->createForm(new TestimonialType(), $testimonial); 

    $request = $this->get('request'); 
    if ($request->getMethod() == 'POST') { 
     $form->bindRequest($request); 

     echo $testimonial->getName(); 

     if ($form->isValid()) { 
      // perform some action, such as save the object to the database 
      //$testimonial = $form->getData(); 
      echo 'testimonial: '; 
      echo var_dump($testimonial); 
      $em->persist($testimonial); 
      $em->flush(); 

      return $this->redirect($this->generateUrl('MyBundle_list_testimonials')); 
     } 
    } 

    return $this->render('MyBundle:Testimonial:update.html.twig', array(
     'form' => $form->createView() 
    )); 
} 

AKTUALIZACJA: działa teraz. Musiałem poprawić kilka rzeczy:

public function updateAction($id) 
{ 
    $request = $this->get('request'); 

    if (is_null($id)) { 
     $postData = $request->get('testimonial'); 
     $id = $postData['id']; 
    } 

    $em = $this->getDoctrine()->getEntityManager(); 
    $testimonial = $em->getRepository('MyBundle:Testimonial')->find($id); 
    $form = $this->createForm(new TestimonialType(), $testimonial); 

    if ($request->getMethod() == 'POST') { 
     $form->bindRequest($request); 

     if ($form->isValid()) { 
      // perform some action, such as save the object to the database 
      $em->flush(); 

      return $this->redirect($this->generateUrl('MyBundle_list_testimonials')); 
     } 
    } 

    return $this->render('MyBundle:Testimonial:update.html.twig', array(
     'form' => $form->createView() 
    )); 
} 
+1

To wygląda podobnie do kodu używam do edycji istniejących podmiotów. Czy możesz trochę bardziej wyjaśnić swój problem? Nie mam pojęcia, co masz na myśli, mówiąc: "... nie działa, ponieważ nadpisuje istotę ..." – Problematic

+0

Druga linia w funkcji, która pobiera referencje, próbuje wykonać wyszukiwanie na podstawie przekazanego identyfikatora $ id. Nie znaleziono go, gdy występuje POST, a więc zwraca wartość null dla $ referencje. Po prostu próbowałem zmienić kod, aby wyszukać ukryte pole w mojej formie o nazwie "id", gdy pojawi się post. Wydawało mi się, że trochę dalej, ale potem skarżyłem się, że id w mojej jednostce jest prywatny i zasugerowałem, żebym utworzył metodę setId() w mojej jednostce. Wygląda na to, że konsola nie stworzyła dla mnie jednego z jakiegoś powodu. –

+0

Gotowy do pracy. Zobacz aktualizację w poście powyżej. –

Odpowiedz

15

Działa teraz. Musiał dostosować kilka rzeczy:

public function updateAction($id) 
{ 
    $request = $this->get('request'); 

    if (is_null($id)) { 
     $postData = $request->get('testimonial'); 
     $id = $postData['id']; 
    } 

    $em = $this->getDoctrine()->getEntityManager(); 
    $testimonial = $em->getRepository('MyBundle:Testimonial')->find($id); 
    $form = $this->createForm(new TestimonialType(), $testimonial); 

    if ($request->getMethod() == 'POST') { 
     $form->bindRequest($request); 

     if ($form->isValid()) { 
      // perform some action, such as save the object to the database 
      $em->flush(); 

      return $this->redirect($this->generateUrl('MyBundle_list_testimonials')); 
     } 
    } 

    return $this->render('MyBundle:Testimonial:update.html.twig', array(
     'form' => $form->createView() 
    )); 
} 
10

Właściwie jest to natywna funkcja Symfony 2:

Można wygenerować automatycznie kontroler CRUD z wiersza poleceń (poprzez doktryny: generate: CRUD) i ponowne wykorzystanie wygenerowany kod.

Dokumentacja tutaj: http://symfony.com/doc/current/bundles/SensioGeneratorBundle/commands/generate_doctrine_crud.html

+1

To prawda, ale rozdziela to na dwie akcje kontrolera. –

+1

Wiem, że to stary post, ale musiałem ci za to podziękować! Wciąż tu siedziałem pisząc mój kod CRUD jak głupiec! Uprzejmie panu dziękuję! – iLikeBreakfast

1

Szybkie spojrzenie na auto-wygenerowany kod CRUD za pomocą polecenia symfony za generate:doctrine:crud pokazuje następujący kod źródłowy dla akcji edit

/** 
    * Displays a form to edit an existing product entity. 
    * 
    * @Route("/{id}/edit", name="product_edit") 
    * @Method({"GET", "POST"}) 
    */ 
    public function editAction(Request $request, Product $product) 
    { 
     $editForm = $this->createForm('AppBundle\Form\ProductType', $product); 
     $editForm->handleRequest($request); 
     if ($editForm->isSubmitted() && $editForm->isValid()) { 
      $this->getDoctrine()->getManager()->flush(); 
      return $this->redirectToRoute('product_edit', array('id' => $product->getId())); 
     } 
     return $this->render('product/edit.html.twig', array(
      'product' => $product, 
      'edit_form' => $editForm->createView(), 
     )); 
    } 

pamiętać, że jednostka doktryna przekazane do działania zamiast identyfikatora (ciąg lub liczba całkowita). Spowoduje to niejawną konwersję parametrów i pozwoli na ręczne pobranie odpowiedniego obiektu o podanym identyfikatorze.

To jest wymieniany jako best practice w dokumentacji Symfony za