Symfony 2 - Delete Forms and CSRF Token

后端 未结 3 1194
栀梦
栀梦 2021-02-15 16:48

I have a List of entries coming from a database. I would like to have a \"Delete-Button\" at the end of every row, so that the user won\'t have to first go to the edit/show page

3条回答
  •  野的像风
    2021-02-15 17:41

    You may render individual tokens with:

    {{ form_widget(form._token) }}
    

    or specifically for your case:

    {{ form_widget(delete_form._token) }}
    

    But, I think you are better served making an array of forms and fully rendering each one:

    In your controller:

    public function indexAction()
        {
            $em = $this->getDoctrine()->getManager();
            $rep= $em->getRepository('IntranetServicesBundle:Laender')
                    ->createQueryBuilder('l');
    
            var_dump($rep->getQuery()->getDql());
            $entities=$rep->getQuery()->getResult();
    
            $delete_forms  = array_map(
                function($element){ 
                    return $this->createDeleteForm($element->getId());}
                ,$entities->toArray()
                );
    
            return $this->render('IntranetServicesBundle:Laender:index.html.twig'
                               , array(
                                     'entities'        => $entities,
                                     'delete_forms'    => $delete_forms
                               ));
        }
    
    
    private function createDeleteForms($id)
    {
        return $this->createFormBuilder(array('id' => $id)))
            ->add('id', 'hidden')
            ->getForm()
        ;
    }
    
    public function deleteAction(Request $request, $id)
    {
        $form = $this->createDeleteForm($id);
        $form->bind($request);
    
        if ($form->isValid()) {
            $em = $this->getDoctrine()->getManager();
    
            $entity = $em->getRepository('IntranetServicesBundle:Laender')
                         ->find($id);
            // this line might need to be changed to point to the proper repository
    
            if (!$entity) {
                throw $this->createNotFoundException('Unable to find Laender entity.');
            }
    
            $em->remove($entity);
            $em->flush();
        }
    
        return $this->redirect($this->generateUrl('laender_index'));
        // this line might need to be changed to point to the proper 
        // post-delete route
    }
    

    In your twig do something along the lines of:

    {% for form in delete_forms %}{{form_widget(form)}}{% endfor %}
    

提交回复
热议问题