2011-07-07 17 views
20

Lo tengo trabajando. Ver la actualización a continuación:Symfony2 Form Entity Update

¿Alguien puede por favor mostrarme un ejemplo específico de una actualización de entidad de formulario Symfony2? El libro solo muestra cómo crear una nueva entidad. Necesito un ejemplo de cómo actualizar una entidad existente donde paso inicialmente el ID de la entidad en la cadena de consulta. Esto es lo que tengo actualmente, pero no funciona porque sobrescribe la entidad cuando se publica el formulario. Supongo que lo que tengo problemas para entender es cómo volver a acceder al formulario en el código que busca una publicación sin volver a crear el formulario. Y si recreo el formulario, significa que también tengo que consultar nuevamente la entidad, lo cual no parece tener mucho sentido.

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

ACTUALIZACIÓN: working now. Tuve que ajustar algunas cosas:

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

Esto es similar al código que utilizo para la edición de entidades existentes. ¿Puedes ser un poco más claro sobre tu problema? No estoy seguro de a qué te refieres con '... no funciona porque sobrescribe la entidad ...' – Problematic

+0

La segunda línea en la función que capta el testimonio intenta hacer una búsqueda basada en el $ id pasado. No encuentra uno cuando se produce el POST, por lo que devuelve null para $ testimonial. Intenté cambiar mi código para buscar el campo oculto en mi formulario llamado 'id' cuando se produce la publicación. Eso pareció llevarme un poco más allá, pero luego se quejó de que mi entidad era privada y me sugirió que creara un método setId() en mi entidad. Aparentemente, la consola no me creó una por alguna razón. –

+0

Lo tengo trabajando. Ver la actualización en la publicación anterior. –

Respuesta

15

Trabajo ahora. Tuvo que ajustar algunas cosas:

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

Esto es realmente una función nativa de Symfony 2:

puede generar automáticamente un controlador CRUD desde la línea de comandos (a través de la doctrina: generar: porquería) y la reutilización el código generado

Documentación aquí: http://symfony.com/doc/current/bundles/SensioGeneratorBundle/commands/generate_doctrine_crud.html

+1

Esto es cierto pero lo separa en dos acciones de controlador. –

+1

Sé que esta es una publicación anterior, ¡pero solo tenía que agradecerles por eso! Todavía estaba sentado aquí escribiendo mi código CRUD como un tonto! ¡Gracias buen señor! – iLikeBreakfast

1

Una mirada rápida en el código CRUD generada automáticamente por orden del Symfony generate:doctrine:crud muestra el siguiente código para la edición acción

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

Tenga en cuenta que una entidad doctrina es pasó a la acción en lugar de una identificación (cadena o entero). Esto hará una conversión de parámetro implícita y le ahorra recuperar manualmente la entidad correspondiente con la identificación dada.

se menciona como best practice en la documentación del Symfony

Cuestiones relacionadas