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 :

Deux formulaires sur la même vue, 1/2 marche [2.x]


Sujet :

Symfony PHP

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Décembre 2014
    Messages : 9
    Points : 5
    Points
    5
    Par défaut Deux formulaires sur la même vue, 1/2 marche
    Hello !

    Je sèche sur un soucis de formulaires sous Symfony 2... je pense que ma logique n'est pas la bonne alors je vais vous présenter le soucis de la façon la plus exhaustive possible :

    Je bosse sur une galerie photo. Il y a donc des entités Image et des entités Galerie (Galerie OneToMany Image).
    Dans mon panneau d'administration, j'ai une vue qui affiche la liste des images présentent dans la galerie avec sous chacune d'elles, un formulaire pour update l'image. Puis en bas de cette vue, j'ai un formulaire pour créer une nouvelle image.

    Présentement, le formulaire pour créer fonctionne. Mais le formulaire pour mettre à jour ne fonctionne pas. La page est rechargée mais les données ne sont pas persistées. Pourtant, il y a bien eu une requête POST avec les bonnes datas (vérifié dans le Profiler de SF2)...

    Voici la partie de la vue qui nous intéresse ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        <div class="thumbnails">
            {% for i in images %}
                {% render controller ('MoonkeyGalleryBundle:Admin:adminUpdateImage', { 'id' : i.getId }) %}
            {% endfor %}
        </div>
        <div style="clear: both;"></div>
        <h3>Ajouter une nouvelle image :</h3>
        <form method="post" {{ form_enctype(form_create) }}>
            {{ form_widget(form_create) }}
            {{ form_errors(form_create) }}
        </form>
    Route de cette vue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    moonkey_admin_galerie:
        path:     /galerie/{slug}
        defaults: { _controller: MoonkeyGalleryBundle:Admin:adminGalerie }
    Méthode de cette vue :

    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
    public function adminGalerieAction($slug)
        {
     
            $repo = $this->repoGalerie(); //méthode perso pour récupérer le repository de mon entité Galerie
            $galerie = $repo->getGalleryBySlug($slug);
            $idGalery = $galerie->getId();
            $images = $galerie->getImages();
     
            if($galerie == null){
                throw $this->createNotFoundException("Galerie inexistante");
            } elseif ($images == null){
                throw $this->createNotFoundException("Aucune image dans la galerie");
            }
    //      préparation de ma nouvelle image pour le formulaire de création
            $imageCreate = new Image;
            $imageCreate->setImagePath('path'); //pour tester
            $imageCreate->setGalerieId($galerie);
            $formCreate = $this->createForm(new CreateImageType, $imageCreate);
            $request = $this->get('request');
            if($this->getRequest()->request->has("create_image")) {
                if ($request->getMethod() == 'POST') {
                    $formCreate->handleRequest($request);
                    if ($formCreate->isValid()) {
                        $em = $this->getDoctrine()->getManager();
                        $em->persist($imageCreate);
                        $em->flush();
                    }
                }
            }
     
            return $this->render("MoonkeyGalleryBundle:Admin:admin_galerie.html.twig", array(
                'slug' => $slug,
                'images' => $images,
                'galerie' => $galerie,
                'form_create' => $formCreate->createView()
            ));
        }
    Alors, comme vous l'avez vu, dans le template j'appelle avec une boucle {% for %} une autre méthode de mon controller, qui lui, rend une vue avec toutes les images de la galerie ainsi que mon formulaire de update à chaque fois.

    Voici la méthode pour l'update :

    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
    public function adminUpdateImageAction($id){
     
            $em = $this->getDoctrine()->getManager();
            $repository = $em->getRepository('MoonkeyGalleryBundle:Image');
            $image = $repository->find($id);
     
            if (!$image) {
                throw $this->createNotFoundException(
                    'No news found for id ' . $id
                );
            }
     
            $form = $this->createForm(new ImageType, $image);
            $form->add('id', 'hidden', array('data' => $id ));
            $request = $this->get('request');
            if($this->getRequest()->request->has('update_image')) {
                if ($request->getMethod() == 'POST') {
                    $form->submit($request);
                    if ($form->isValid()) {
                        $em->flush();
                    }
                }
            }
            return $this->render('MoonkeyGalleryBundle:Admin:admin_galerie_update_image.html.twig', array(
                'form' => $form->createView(),
                'image' => $image,
                'id' => $id
            ));
        }
    Voici le template associé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        <div class="thumbnails update">
                <a class="galerie" title="{{ image.getImageNom }}" href="{{ asset(image.getImagePath~image.getImageTitre~".jpg") }}">
                    <img class="thumb" alt="{{ image.getImageNom }}" title="{{ image.getImageNom }}"  src="{{ asset(image.getImagePath~image.getImageTitre~".jpg") }}"/>
                </a>
                <form method="post" action="" {{ form_enctype(form) }}>
                    {{ form_widget(form) }}
                    {{ form_errors(form) }}
                </form>
        </div>
    J'ai tenté de virer le if (isValid()) ainsi que le if (request = POST) mais ça ne change rien. Je n'ai aucune erreur en sortie, ni pour mon formulaire ni pour les enfants... J'ai aussi tenté le classique handleRequest au lieu du submit(), rien n'y fait... J'ai aussi dans mon formType un champs hidden avec l'id de l'image... mais toujours rien.
    Dans le Profiler, j'ai donc bien une request d'envoyée mais aucune query UPDATE générée.

    Je pense que ça vient du fait que l'action de mon formulaire d'update n'étant pas défini, c'est la route de mon template général qui est pris en compte. Alors dans mon formulaire d'update, j'y mettrai bien un action="path{'nom_de_route'}" mais je vois mal comment faire sans casser tout ce que j'ai mis en place jusque là...

    Avez-vous une idée pour m'aiguiller ?

    Dim

  2. #2
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Décembre 2014
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Petit up... toujours personne pour m'aider ? :-(

  3. #3
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 252
    Points : 358
    Points
    358
    Par défaut
    Si tes déductions sont bonnes il faut effectivement que tu change l'action du formulaire d'update pour qu'il renvoie vers le "adminUpdateImageAction".
    Rien ne sera "cassé" si une fois l'update effectué tu fais une redirection vers la route initiale.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if ($form->isValid()) {
        $em->flush();
        //redirection vers moonkey_admin_galerie
    }

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Décembre 2014
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Merci de ta réponse
    Mon soucis c'est qu'il n'y a pas de route pour le adminUpdateImage, c'est juste une méthode qui créer un formulaire d'update, le formulaire est appelé dans une vue qui ne contient que ce formulaire. Et cette vue est include dans le template à la route admin_galerie/{slug}.
    Et il me faut une route pour l'appeler dans l'attribut "action" du formulaire d'update...

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Décembre 2014
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Alors, voici où j'en suis :

    J'ai crée une route pour adminUpdateImage :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    moonkey_admin_galerie_update:
        path:     /galerie/image/{id}
        defaults: { _controller: MoonkeyGalleryBundle:Admin:adminUpdateImage }
    Dans la vue correspondante (la vue admin_update_image), j'ai retouché mon formulaire ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
            <form action="{{ path('moonkey_admin_galerie_update', {'id':image.getId}) }}" method="post" {{ form_enctype(form) }}>
                    {{ form_widget(form) }}
                    {{ form_errors(form) }}
            </form>
    Le controller adminUpdateImage est ainsi fait :

    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
    public function adminUpdateImageAction($id){
     
            $em = $this->getDoctrine()->getManager();
            $repository = $em->getRepository('MoonkeyGalleryBundle:Image');
            $image = $repository->find($id);
            $galerieId = $image->getGalerieId();
            $repo2 = $em->getRepository('MoonkeyGalleryBundle:Galerie');
            $galerie = $repo2->find($galerieId);
            $slug = $galerie->getGalerieSlug();
     
     
            if (!$image) {
                throw $this->createNotFoundException(
                    'No images found for id ' . $id
                );
            }
     
            $form = $this->createForm(new ImageType, $image);
            $form->add('id', 'hidden', array('data' => $id ));
            $request = $this->get('request');
            if($this->getRequest()->request->has('update_image')) {
                if ($request->getMethod() == 'POST') {
                    $form->submit($request);
                    if ($form->isValid()) {
                        $em->flush();
                        return $this->redirect($this->generateUrl('moonkey_admin_galerie', array(
                            'slug' => $slug
                        )
                        ));
                    }
                }
            }
            return $this->render('MoonkeyGalleryBundle:Admin:admin_galerie_update_image.html.twig', array(
                'form' => $form->createView(),
                'image' => $image,
                'id' => $id
            ));
        }
    Dans la vue admin_galerie, je charge la vue update_image vue plus haut, de cette façon :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            {% for i in images %}
                {{ render (controller ('MoonkeyGalleryBundle:Admin:adminUpdateImage', { 'id' : i.getId })) }}
            {% endfor %}
    Mais quand je remplis mon formulaire d'update et que je le valide, j'ai ce message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Neither the property "id" nor one of the methods "setId()", "__set()" or "__call()" exist and have public access in class "Moonkey\GalleryBundle\Entity\Image".
    Alors, je suis pas démunis, Internet est mon ami (et surtout Google ^^). Mais je ne vois pas l'intérêt de devoir retoucher mes entités alors que Doctrine était censé le faire comme il faut automatiquement...

    Pour la forme, tiens, je poste aussi les parties intéressantes de mon entité Image :

    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
    namespace Moonkey\GalleryBundle\Entity;
     
    use Datetime;
    use Doctrine\ORM\Mapping as ORM;
     
    /**
     * Image
     *
     * @ORM\Table(name="image")
     * @ORM\Entity(repositoryClass="Moonkey\GalleryBundle\Entity\ImageRepository")
     */
    class Image
    {
     
        /**
         * @var integer
         *
         * @ORM\Column(name="id", type="integer")
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="AUTO")
         */
        private $id;
     
        /**
         * @var integer
         *
         * @ORM\ManyToOne(targetEntity="Galerie", inversedBy="images")
         * @ORM\JoinColumn(name="galerie_id", referencedColumnName="id")
         */
        protected $galerie_id;
     
        /**
         *
         */
        public function  __construct()
        {
            $this->imageDate = new Datetime();
        }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    /**
         * Get id
         *
         * @return integer 
         */
        public function getId()
        {
            return $this->id;
        }
    Voilà, je retourne bouder sur la toile >____<

    Merci encore de votre patience !

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Décembre 2014
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Ok, en fait c'était mon champ caché avec l'id de mon image qui cassait tout (ça et le fait que je n'avais pas d'action dans mon formulaire).
    De façon générale, je pense que lors d'un update, Doctrine écrase toutes les données présentes dans le formulaire et relatives à un attribut de l'entité. Donc Doctrine fait des setNom, setTitre et setId... bien sûr, je n'avais pas de méthodes setId donc Doctrine n'aimait pas ça.
    Alors, au-revoir le champ caché !
    Et puis dans le fond, je n'ai pas besoin de champ hidden avec l'id puisque je récupère l'image à éditer avec find($id) et que je la mets en arguments dans mon createForm.

    Voilà, résolu !

    Encore merci pour ton aide, elle m'aura bien aidé !

    PS : mille formulaires différents dans le même template, c'est trop chi*nt ! >____<

  7. #7
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 252
    Points : 358
    Points
    358
    Par défaut
    Tu peux mettre la discussion en résolue si c'est le cas.

    Par contre en voyant le code dans ton controller je pense que tu n'as pas tout saisie :
    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
     
            $em = $this->getDoctrine()->getManager();
            $repository = $em->getRepository('MoonkeyGalleryBundle:Image');
            $image = $repository->find($id);
            //ici tu peux vérifier l'existence de l'image
     
            //ci dessous tu récupère la gallerie 2 fois inutilement
            //$galerieId = $image->getGalerieId();
            //$repo2 = $em->getRepository('MoonkeyGalleryBundle:Galerie');
            //$galerie = $repo2->find($galerieId);
            //$slug = $galerie->getGalerieSlug();
     
            //pour avoir le slug de la galerie il te suffit de faire
            $slug = $image->getGalerieId()->getGalerieSlug();
     
            //en changeant les nom des propriétés pour une meilleure lisibilité il vaudrait mieux ça
            $slug = $image->getGalerie()->getSlug();

  8. #8
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Décembre 2014
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    Merci pour ton retour !
    Effectivement il y avait encore des choses que je n'avais pas saisies. Entres autres :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $slug = $image->getGalerieId()->getGalerieSlug();
    En fait, via l'id d'une galerie on peut atteindre les méthodes de l'entité Galerie ? Je n'avais effectivement pas compris ça !

    Pour le double appel à ma galerie, c'est une faute d'inattention à force de toucher et retoucher à mon code, j'en oublie d'anciens ajouts et je me répète >___<

    Et oui, renommer un peu mes méthodes pour plus de lisibilité serait pas de refus !

    Merci encore

  9. #9
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2008
    Messages
    252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2008
    Messages : 252
    Points : 358
    Points
    358
    Par défaut
    Citation Envoyé par Dreadpoule Voir le message
    En fait, via l'id d'une galerie on peut atteindre les méthodes de l'entité Galerie ? Je n'avais effectivement pas compris ça !
    Non, mais quand on récupère la relation d'une entité on récupère en fait l'objet et non juste son id.
    C'est pour ça que nommer la relation galerieId plutôt que galerie induit en erreur.

  10. #10
    Futur Membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Décembre 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Décembre 2014
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    J'avais déjà eu affaire à cet état de fait.

    À la place de faire ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $imageCreate->setGalerieId($galerie);
    ... avant je faisais un truc dans ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $imageCreate->setGalerieId($galerie->getId());
    Et finalement, le message d'erreur de SF2 était très clair ^^

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Deux formulaires sur le même tableau
    Par mimi7690 dans le forum Débuter
    Réponses: 3
    Dernier message: 19/08/2014, 16h13
  2. [ZF 1.11] mettre deux boutons d'un formulaire sur la même ligne
    Par rebhihabib dans le forum Zend_Form
    Réponses: 3
    Dernier message: 05/08/2012, 01h29
  3. [Spring MVC] Deux formulaires sur une même page
    Par djodjo dans le forum Spring Web
    Réponses: 1
    Dernier message: 20/10/2008, 09h52
  4. Réponses: 1
    Dernier message: 14/04/2008, 12h33
  5. Comment disposer deux formulaires sur la même ligne ??
    Par soad029 dans le forum Mise en page CSS
    Réponses: 4
    Dernier message: 05/05/2007, 04h14

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