2011-07-07 17 views
20

Funzionante. Vedi aggiornamento qui sotto:Symfony2 Aggiornamento entità modulo

Qualcuno può per favore mostrarmi un esempio specifico di aggiornamento dell'entità modulo di Symfony2? Il libro mostra solo come creare una nuova entità. Ho bisogno di un esempio di come aggiornare un'entità esistente in cui inizialmente passo l'id dell'entità sulla stringa di query. Ecco cosa ho attualmente ma non funziona perché sovrascrive l'entità quando il modulo viene pubblicato. Immagino che la cosa che ho difficoltà a capire sia come accedere nuovamente al modulo nel codice che controlla un post senza ricreare il modulo. E se riesco a ricreare il modulo, significa che devo interrogare ancora per l'entità, il che non sembra avere molto senso.

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

UPDATE: ora di lavoro. Dovuto modificare un paio di cose:

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

Questo sembra simile al codice che uso per la modifica entità esistenti. Puoi essere un po 'più chiaro riguardo al tuo problema? Non ho idea di cosa intendi per '... non funziona perché sovrascrive l'entità ...' – Problematic

+0

La seconda riga nella funzione che cattura la testimonianza tenta di eseguire una ricerca in base all'ID $ passato. Non ne trova uno quando si verifica il POST e quindi restituisce null per $ testimonial. Ho appena provato a cambiare il mio codice per cercare il campo nascosto nel mio modulo chiamato 'id' quando si verifica il post. Sembrava che mi spingesse un po 'oltre, ma poi mi sono lamentato del fatto che l'identità nella mia entità fosse privata e mi suggeriva di creare un metodo setId() nella mia entità. Apparentemente la console non ne ha creato uno per me per qualche motivo. –

+0

Funziona. Vedi l'aggiornamento nel post sopra. –

risposta

15

lavoro ora. Dovuto modificare un paio di cose:

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

Questo è in realtà una funzione nativa di Symfony 2:

È possibile generare automaticamente un controller CRUD dalla riga di comando (tramite doctrine: generate: CRUD) e il riutilizzo il codice generato.

documentazione qui: http://symfony.com/doc/current/bundles/SensioGeneratorBundle/commands/generate_doctrine_crud.html

+1

Questo è vero ma lo separa in due azioni del controller. –

+1

So che questo è un vecchio post, ma dovevo ringraziarti per questo! Ero ancora seduto qui a scrivere il mio codice CRUD come un pazzo! Grazie gentile signore! – iLikeBreakfast

1

Un rapido sguardo al codice CRUD generato automaticamente dal comando di Symfony generate:doctrine:crud mostra il seguente codice sorgente per la modifica dell'azione

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

Nota che un'entità Doctrine è passato all'azione invece di un id (stringa o intero). Ciò comporterà una conversione implicita dei parametri e ti eviterà di recuperare manualmente l'entità corrispondente con l'id specificato.

essa è indicata come best practice nella documentazione di Symfony

Problemi correlati