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 :

[Symfony2] update des champs dans mon entité avec editAddAction() de mon controller ne fonctionne pas


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2014
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2014
    Messages : 24
    Par défaut [Symfony2] update des champs dans mon entité avec editAddAction() de mon controller ne fonctionne pas
    Bonjour à tous,

    voilà en gros mon soucis: j'ai une page d'index qui m'affiche dans un tableau tous les champs d'une entité dans ma base. Dans ce tableau, ce trouve un bouton edit qui me récupère le champ spécifique (ici le nom), pour ensuite le modifier dans un formulaire. Une fois le formulaire remplit, je le valide et normalement le nom doit être modifié.

    Voici le code de cette vue (template Twig):
    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
    <div class="table">
      <table class="table table-hover">
        <thead>
          <tr>
            <th>Ref/id</th>
            <th>Parc's name</th>
            <th>property's number</th>
            <th>Buildings number</th>
            <th></th>
          </tr>
        </thead>
        <tbody>
          {% for parcsproperty in parc %}
          <tr>
            <td>{{ parcsproperty.id }}</td>
            <td>{{ parcsproperty.nom }}</td>
            <td>{{ parcsproperty.ecnt }}</td>
            <td>{{ parcsproperty.bcnt }}</td>
            <td><a href="{{ path('editParcs', {'name': parcsproperty.name}) }}"><button class="btn btn-warning btn-xs">Edit</button></a></td>
          </tr>
          {% endfor %}
        </tbody>
      </table>
    </div>
    Voici la route pour cette vue:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    manage_parcs:
        path:     /manageparcs
        defaults: { _controller: MySpaceMyBundleBundle:MyController:indexParcs }
        requirements:
        methods: GET
    ecnt et bcnt sont juste des alias que j'ai écrit pour faire un count en DQL, ce n'est pas très important ici mais voilà la requête présente dans le controleur de cet vue si vous le souhaitez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $query = $em->createQuery('SELECT  p.id, p.nom,
                                        count(distinct b.id) AS bcnt,
                                        count(distinct e.id) AS ecnt
                                       FROM MySpaceDatabaseBundle:Parcsproperty p
                                       LEFT OUTER JOIN  MySpaceDatabaseBundle:Properties e WITH p.id = e.parcsproperty
                                       LEFT OUTER JOIN MySpaceDatabaseBundle:Buildings b WITH e.id = b.ensembles
                                       GROUP BY p.id');
    Maintenant, voici le code de mon entité concerné:
    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
    use Doctrine\ORM\Mapping as ORM;
     
    /**
    * Parcsproperty
    *
    * @ORM\Table(name="parcsproperty")
    * @ORM\Entity
    */
     
    class Parcsproperty
    {
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer", nullable=false)
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $id;
     
    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=150, nullable=false)
     */
    private $name;
     
    //Continue to
    //The getters and the setters and the FK
    Comme vous avez pu le voir dans ma première vue (index avec le tableau), j'ai un bouton edit, qui renvoit sur un formulaire en GET, voici son code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <form action="{{ path('editParcs_process', {'name': name}) }}" method="POST">
      <div>
        {{ form_label(form.name, "Change the name's parc", {'label_attr': {'class': 'control-label'}}) }}
          <div>
            {{ form_widget(form.name, {'attr': {'class': 'form-control'}}) }}
          </div>
      </div>
      <input type="submit" value="Edit" class="btn btn-success"/>
    </form>
    et la route le correspondant (affichage du form en GET, puis une fois validation envoi des données en POST):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    editParcs:
        path:     /manageparcs/edit/{name}
        defaults: { _controller: MySpaceMyBundleBundle:MyController:editAdd }
        requirements:
        methods: GET
     
    editParcs_process:
        path:     /manageparcs/edit/process/{name}
        defaults: { _controller: MySpaceMyBundleBundle:MyController:editAdd }
        requirements:
        methods: POST
    Mon controller concernant cette action, donc cette vu est celui ci:
    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
     public function editAddAction($name) {
        $message="";
        $em = $this->getDoctrine()->getManager();
        $form = $this->createForm(new ParcspropertyType());
        $parc = $em->getRepository('MySpaceDatabaseBundle:Parcsproperty')->findAll();
     
        if (isset($name)) {
            $parc = $em->getRepository('MySpaceDatabaseBundle:Parcsproperty')->find($name);
     
                if (!$parc) {
     
                    $message='no parcs found';
                }
        }
     
        else {
            // add one
            $parc = new Parcspropertyr();
        }
     
        $request = $this->get('request');
     
        if ($request->isMethod('POST') | ($form->isValid())) {
     
                $form->bind($request);
                $parc = $form->getData();
                $parc -> setNom($nom);
                $em->flush();
     
                return $this->redirect($this->generateUrl('manage_parcs'));
            }
     
        else {
                return $this->render('MySpaceMyBundle:MyFolder:editParcs.html.twig', array('form' => $form->createView(), 'parc' => $parc, 'name' => $name));
             }
    }
    Comme vous pouvez le constatez, cette métode du controller editAddAction($nom) {} permet à l'utilisateur de modifier le nom d'un parc selectionné, et si le parc n'existe pas, d'en ajouter/créer un nouveau (bon je suis d'accord, je vais devoir optimiser mon code mieux que ça).

    Toutefois, mon réel problème concernant mon code est celui-ci: symfony me génère aucune erreur mais n'effectue pas l'update. Pourtant dans mon url, concernant mes route, j'ai bien le paramètre en plus affiché {name} comme ceci par exemplelocalhost/MyFolder/MySpace/..//manageparcs/edit/nameOfMySelectedparc.

    Je vous avouerai être un peu perdu là.

    Est ce je m'y prends bien pour l'update? Pourquoi ça ne fonctionne pas?

    (à ce titre, j'ai posté ce problème sur stackoverflow ici si vous préférez)

    Bien à vous

  2. #2
    Membre actif
    Avatar de Dumbeldor
    Homme Profil pro
    Développeur Concepteur Banque postale / Ecole d'ingénieur Alternance
    Inscrit en
    Novembre 2013
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Landes (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Concepteur Banque postale / Ecole d'ingénieur Alternance

    Informations forums :
    Inscription : Novembre 2013
    Messages : 88
    Par défaut
    Ok, mais sans code nous pouvons pas trop t'aider hein.

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2014
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2014
    Messages : 24
    Par défaut
    Désolé, j'ai cliqué sur l'enregistrement de la discussion avant de faire l'édition complète, je suis allé trop vite (étant nouveau sur le forum, je pense faire deux trois erreurs comme celle-ci, mes excuses d'avance)

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 68
    Par défaut
    Hello,

    En fait tu ne fait pas de persist pour sauvegarder ton parc. Regarde dans le code la partie après le if( $form->isValid() :

    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
     
    public function editAddAction($name) {
      $parc = $this->get('doctrine')->getRepository('MySpaceDatabaseBundle:Parcsproperty')
        ->findOneByName($name); // On récupère le parc avec le name $name
     
      if( !$parc )
        $parc = new Parcsproperty(); // Si le parc n'existe pas on en crée un nouveau
     
      $form = $this->get('form.factory')->create(new ParcspropertyType(), $parc); // Création du formulaire
      $request = $this->get('request'); // Récupération de la requête
     
      if( $request->isMethod('POST') ) // Si il y a eu un post (donc si j'ai cliqué sur enregistrer)
      {
        $form->bind($request); // Je récupère les valeur postée dans ma requête et on les met dans ton object $parc
     
        if( $form->isValid() ) // Si les données son valide
        {
          $em = $this->getDoctrine()->getManager(); // On récupère le manager de doctrine
          $em->persist($parc); // On persist (création ou modification)
          $em->flush(); // Et on commit nos modifications sur la base de données
     
          return $this->redirect($this->generateUrl('manage_parcs')); // Tout se passe bien on retourne à la liste
        }
      }
     
      return $this->render('MySpaceMyBundle:MyFolder:editParcs.html.twig',
        array(
          'form' => $form->createView(),
          'parc' => $parc,
        )
      );
    }

  5. #5
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2014
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2014
    Messages : 24
    Par défaut
    Alors, je pense avoir compris mon erreur, j'ai édité mon code en fonction de ta réponse Daratar.

    J'ai bien ma valeur name dans mon formulaire. Toutefois, j'ai cette erreur maintenant: Le jeton CSRF est invalide. Veuillez renvoyer le formulaire.

    Je suis en train de fouiner pour savoir comment pallier ça...

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    68
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 68
    Par défaut
    Ce qu'il se passe c'est que pour éviter certaines injection, Symfony a prévu un jeton qui ai envoyé en même temps que le formulaire. Ce jeton s'appelle CSRF.

    Comme tu crées ton formulaire à la main (<form action="" ....>) tu n'as pas de champs jeton crée.

    Ce que tu peux faire c'est ajouter ce champs à la main :
    <input type="hidden" name="_csrf_token" value="{{ csrf_token('authenticate') }}">

    Ou bien utiliser une fonction twig {{ form_start(form) }} et mettre à la fin de ton formulaire {{ form_end(form) }}

    Avec ça tu devrais t'en sortir (^_^)

Discussions similaires

  1. Peut on ajouter des champs dans l'entité Note
    Par VITALTH dans le forum Microsoft Dynamics CRM
    Réponses: 3
    Dernier message: 18/02/2014, 13h42
  2. [MySQL] Ajouter des données dans une table avec la cmd update
    Par pierrot10 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 25/09/2007, 19h54
  3. INSERER DU TEXTE AVEC DES CHAMPS DANS UNE REQUETE SUR sql Srv 2000
    Par sauceaupistou dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 24/03/2007, 10h02
  4. updater des données dans mon fichier excel
    Par gantec dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 26/02/2007, 16h01
  5. Ajouter des champ dans une table avec une procedure sp
    Par Abdou1 dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 26/07/2006, 18h32

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