IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Symfony PHP Discussion :

ajout d'un lien delete en index


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Inscrit en
    Avril 2011
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2011
    Messages : 127
    Par défaut ajout d'un lien delete en index
    Sur ma page index, j'ai un tableau qui liste les différents commentaires.
    Je souhaite ajouter, à côté de chaque commentaire, une action qui permette de supprimer un commentaire, comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    <table class="table table-striped table-bordered table-hover" id="dataTables-example">
                <thead>
                    <tr>
                        <th class="text-center">#</th>
                        <th class="text-center">Auteur</th>
                        <th class="text-center">Contenu</th>
                        <th class="text-center">Date de création</th>
                        <th class="text-center">Tutoriel lié</th>
                        <th class="text-center">Statut</th>
                        <th class="text-center">Actions</th>
                    </tr>
                </thead>
                <tbody>
                    {% for entity in entities %}
                        <tr class="odd gradeX">
                            <td>{{ entity.id }}</td>
                            <td>{{ entity.user }}</td>
                            <td>{{ entity.content }}</td>
                            <td class="text-center">{% if entity.createdAt %}{{ entity.createdAt|date('Y-m-d H:i:s') }}{% endif %}</td>
                            <td>{{ entity.tutorial.title }}</td>
                            <td>{{ entity.status }}</td>
                            <td class="table-action">
                                <a href="{{ path('admin_comment_show', { 'id': entity.id }) }}">
                                    Voir la fiche du commentaire - 
                                </a>
                                <a href="{{ path('admin_comment_edit', { 'id': entity.id }) }}">
                                    Editer - 
                                </a>
                                <a href="{{ path('admin_comment_delete', { 'id': entity.id }) }}">
                                    Supprimer - 
                                </a>   
     
                            </td>
                        </tr>
                    {% endfor %}
                </tbody>
            </table>
    Lorsque je fais ceci, et que je clique sur "supprimer", j'ai cette erreur: No route found for "GET /admin/comment/delete/8": Method Not Allowed (Allow: POST, DELETE)

    J'ai lu plusieurs explications, et j'ai bien compris que la suppression devait se faire via un <form>, pour la protection CSRF.
    Seulement voilà, je suis perdue...

    Actuellement, voici les actions du controller qui gèrent la suppression:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    /**
         * Deletes a Comment entity.
         * @Route("/delete/{id}", name="admin_comment_delete")
         * @Method("DELETE")
         *
         */
        public function deleteAction(Request $request, $id)
        {
            $form = $this->createDeleteForm($id);
            $form->submit($request);
     
            if ($form->isValid()) {
                $em = $this->getDoctrine()->getManager();
                $entity = $em->getRepository('SiteFrontBundle:Comment')->find($id);
     
                if (!$entity) {
                    throw $this->createNotFoundException('Unable to find Comment entity.');
                }
     
                $em->remove($entity);
                $em->flush();
            }
     
            return $this->redirect($this->generateUrl('admin_comment'));
        }
     
        /**
         * Creates a form to delete a Comment entity by id.
         *
         * @param mixed $id The entity id
         *
         * @return \Symfony\Component\Form\Form The form
         */
        private function createDeleteForm($id)
        {
            return $this->createFormBuilder(array('id' => $id))
                        ->add('id', 'hidden')
                        ->getForm();
        }
    L'action index:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    /**
         * Lists all Comment entities.
         *
         */
        public function indexAction()
        {
            $em = $this->getDoctrine()->getManager();
     
            $entities = $em->getRepository('SiteFrontBundle:Comment')->findAll();
     
            return $this->render('SiteFrontBundle:Admin/Comment:index.html.twig', array(
                'entities' => $entities,
            ));
        }
    Et voici ma route:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    admin_comment_delete:
        path:     /delete/{id}
        defaults: { _controller: "SiteFrontBundle:Admin/Comment:delete" }
        requirements: { _method: post|delete }
    Pourriez-vous m'aider svp? D'avance merci

  2. #2
    Membre expérimenté

    Inscrit en
    Juin 2008
    Messages
    307
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 307
    Par défaut
    Le @Method de ton action n'est pas bon , il faut mettre : * @Method("GET") car tu passe par un lien.

    Olivier

  3. #3
    Membre confirmé
    Femme Profil pro
    Inscrit en
    Avril 2011
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2011
    Messages : 127
    Par défaut
    Merci d'avoir pris la peine de répondre.

    Par contre, modifier la méthode en GET ne sert à rien: plus de message d'erreur, c'est vrai, mais la suppression ne se fait pas en base de données.
    Je pense également que passer par la méthode GET n'est pas la bonne solution, puisque dans ce cas il y aurait un souci au niveau du CSRF.

    Mon problème est exactement le même que celui décrit ici: http://symfony.com/fr/doc/current/co...arameters.html, mais l'exemple n'est pas complet et j'ai du mal

    Mais je n'arrive pas à bien comprendre..

  4. #4
    Membre expérimenté

    Inscrit en
    Juin 2008
    Messages
    307
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 307
    Par défaut
    Si le fait d'avoir mis la méthode GET à la place de DELETE a fait en sorte que le controller trouve ton action (d'ailleurs le message était plutôt clair). Le fait que l'entité ne soit pas supprimé est un autre problème plutôt lié à ta requête, je pense que entre le remove et le flush tu as oublié $em->persist().

  5. #5
    Membre confirmé
    Femme Profil pro
    Inscrit en
    Avril 2011
    Messages
    127
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2011
    Messages : 127
    Par défaut
    Euh... sérieusement, je ne pense pas qu'il faille un persist dans une action delete.
    Voici ce qui est dit dans la doc de symfony:

    Supprimer un objet
    Supprimer un objet est très similaire, mais requiert un appel à la méthode remove() du gestionnaire d'entités :

    $em->remove($product);
    $em->flush();

    Comme vous vous en doutez, la méthode remove() signale à Doctrine que vous voulez supprimer l'entité de la base de données. La vraie requête DELETE, cependant, n'est réellement exécutée que lorsque la méthode flush() est appelée.

  6. #6
    Membre expérimenté

    Inscrit en
    Juin 2008
    Messages
    307
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 307
    Par défaut
    Effectivement.
    Quand tu regarde au niveau de la toolbar symfony, est ce qu'il passe une requête si oui sur quel id ?

    A mon avis c'est au niveau de ton $form->isValid() que ca ne doit pas fonctionner et du coup tu retourne sur la page qui liste tes entités. Essaie de retourner une exception quand ton formulaire n'est pas valide

    Olivier

Discussions similaires

  1. [Mail] Ajout d'un lien dans un scipt formmail.php
    Par PaulK dans le forum Langage
    Réponses: 1
    Dernier message: 13/11/2007, 22h59
  2. [XML] ajout d'un lien dans un document
    Par caroy dans le forum Flash
    Réponses: 4
    Dernier message: 12/03/2007, 01h26
  3. Ajouter la contrainte ON DELETE SET NULL a postériori
    Par EvilAngel dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 24/09/2006, 11h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo