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 :

Champ Hidden et FormType [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre éclairé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 70
    Points : 681
    Points
    681
    Par défaut Champ Hidden et FormType
    Bonjour à tous,

    J'ai un petit soucis avec Symfony les forms

    Contexte :
    Deux entités :
    • BlogPost
    • BlogComment


    Le BlogPost contient des BlogComments et vice et versa.

    Quand j'affiche mon BlogPost j'ai inclue un formulaire pour rajouter un BlogComment à la suite (comme sur tout blog en faite).

    Mais je n'arrive pas à référencer directement le BlogPost au BlogComment pour que ça soit invisible aux yeux de l'utilisateur.

    CommentController
    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
     
        public function newAction(BlogPost $post=null) {
     
            $comment = new BlogComment();
     
            if ($post) {
                $comment->setPost($post);
            }
     
            $form = $this->createForm(new CommentType(), $comment);
     
            return $this->render('SymbioseBlogBundle:Comment:new.html.twig', array('form' => $form->createView()));
        }
     
        public function createAction() {
            $comment = new BlogComment();
            $request = $this->getRequest();
            $form    = $this->createForm(new CommentType(), $comment);
            $form->bindRequest($request);
     
            if ($form->isValid()) {
                $em = $this->getDoctrine()->getEntityManager();
                $em->persist($comment);
                $em->flush();
     
                return $this->redirect($this->generateUrl('SymbioseBlogBundle_view_post', array('id' => $comment->getPost()->getId())));
     
            }
     
            return $this->render('SymbioseBlogBundle:Comment:new.html.twig', array('form' => $form->createView()));
        }
    Ma FormType

    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
    <?php
     
    namespace Symbiose\BlogBundle\Form\Type;
     
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilder;
     
    class CommentType extends AbstractType
    {
        public function buildForm(FormBuilder $builder, array $options)
        {
            $builder->add('text','textarea')
                    ->add('post','hidden');
        }
     
        public function getName()
        {
            return 'comment';
        }
     
        public function getDefaultOptions(array $options)
        {
            return array(
                'data_class' => 'Symbiose\BlogBundle\Entity\BlogComment',
            );
        }
    }
    Ma FormTwig
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <form action="{{ path('SymbioseBlogBundle_create_comment') }}" method="post" {{ form_enctype(form) }} class="new_comment">
        {{ form_errors(form) }}
     
        {{ form_widget(form.text,{ 'attr': {'class': 'comment_field'}}) }}
     
        {{ form_rest(form) }}
     
            <p class="submit">
                <input type="submit" class="button-submit" value="Ajouter" />
            </p>
        </form>
    Si quelqu'un à une idée je suis preneur.

    Cdt.

  2. #2
    Inscrit
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    319
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 319
    Points : 476
    Points
    476
    Par défaut
    Salut,

    Pourquoi tu as séparé tes action new et create ? Rassemble les et ca marchera (le $comment->setPost($post) tu dois le faire dans ton create la).
    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
     
    public function newAction(BlogPost $post=null) {
     
            $comment = new BlogComment();
            $request = $this->getRequest();
     
            if ($post) {
                $comment->setPost($post);
            }
     
            $form = $this->createForm(new CommentType(), $comment);
     
            if($request->getMethod() == 'POST' ) {
                 $form->bindRequest($request);
                 if ($form->isValid()) {
                    $em = $this->getDoctrine()->getEntityManager();
                    $em->persist($comment);
                    $em->flush();
     
                    return $this->redirect($this->generateUrl('SymbioseBlogBundle_view_post', array('id' => $comment->getPost()->getId())));
                }
            }
     
            return $this->render('SymbioseBlogBundle:Comment:new.html.twig', array('form' => $form->createView()));
        }

  3. #3
    Membre éclairé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 70
    Points : 681
    Points
    681
    Par défaut
    Je regarde dans la journée et je te dis si ça fonctionne

  4. #4
    Membre éclairé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 70
    Points : 681
    Points
    681
    Par défaut
    Alors après modification de ce que tu m'as montré j'ai le droit à ceci :

    An exception has been thrown during the rendering of a template ("The "SymbioseBlogBundle_new_comment" route has some missing mandatory parameters ("post").") in "SymbioseBlogBundle:Comment:new.html.twig" at line 1.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <form action="{{ path('SymbioseBlogBundle_new_comment') }}" method="post" {{ form_enctype(form) }} class="new_comment">
        {{ form_errors(form) }}
     
        {{ form_widget(form.text,{ 'attr': {'class': 'comment_field'}}) }}
     
        {{ form_rest(form) }}
     
            <p class="submit">
                <input type="submit" class="button-submit" value="Ajouter" />
            </p>
        </form>
    Routing

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SymbioseBlogBundle_new_comment:
        pattern:  /new/{post}
        defaults: { _controller: SymbioseBlogBundle:Comment:new, post: null }

  5. #5
    Membre actif
    Homme Profil pro
    Freelance
    Inscrit en
    Décembre 2003
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Freelance

    Informations forums :
    Inscription : Décembre 2003
    Messages : 423
    Points : 259
    Points
    259
    Par défaut

    Pourquoi tu as séparé tes action new et create
    Si je ne m'abuse ... c'est comme ça que symfony 1.X fonctionne quand tu utilises les generators. C'est un moyen dans ton routing de bien préciser en fonction du type de requête (GET, PUT, POST, ...) quelle action appelée. Je ne suis pas trop friand de cette façon de faire non plus ... mais bon ça se défend.

    acesyde > si je peux me permettre, pense qu'il y a là une faille de sécurité plus ou moins importante dans ton système (plus ou moins dépend de comment tu utilises ensuite tes formulaires, la logique de ton site etc). En effet, que se passe-t-il si le user modifie la valeur de ton champ "post" dans ton formulaire (ce n'est pas parce qu'il est hidden qu'il n'est pas modifiable) ? Et bien ça créera le commentaire sur un autre post. Le problème se pose surtout à l'édition de commentaire : méfie-toi des données envoyées par l'utilisateur.
    Je te conseille, dans ton formulaire (et en fonction de ton application bien évidemment) d'ajouter :
    - soit un token de vérification (qui est un hash de ton id avec un salt soit en session, soit propre à ton action/controller)
    - soit conserver l'id original en session ... auquel cas ton champ post dans ton formulaire est inutile.

    Je sais on est un peu loin du sujet de base ... mais je pense que de temps en temps il est important de rappeler que "un champ hidden n'est pas inviolable"


    Bonne chance pour la suite,
    "La théorie, c’est quand on sait tout et que rien ne fonctionne. La pratique, c’est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : rien ne fonctionne ... et personne ne sait pourquoi !" et malheureusement c'est souvent le cas en Développement...

  6. #6
    Membre éclairé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 70
    Points : 681
    Points
    681
    Par défaut
    Salut Bleys,

    Je suis preneur pour les bonnes manières, mais à ce niveau là il n'y a pas de documentation, donc forcément (je fais à l'arrache), j'ai pensé aussi au problème de la sécurité, mais c'est assez bizarroide leur système (trop habitué à l'ASPNET surement).

    Pour toi le mieux serais de mettre le post courant en session utilisateur ?

    Il est vrai que cette méthode est assez séduisante.

    Edit:
    Je viens de faire cela par le biais d'une session et ça fonctionne au poil

  7. #7
    Membre éclairé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 70
    Points : 681
    Points
    681
    Par défaut
    Bleys,

    En faite ça résout plus ou moins mon soucis, avec la session si j'ouvre 2 fenêtres sur le 2 post différent et que je commente le premier ça le met dans le 2éme

    Si jamais tu as une idée, voir m'expliquer le token un petit peu plus en profondeur, je suis preneur.

    Merci par avance

  8. #8
    Membre actif
    Homme Profil pro
    Freelance
    Inscrit en
    Décembre 2003
    Messages
    423
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Freelance

    Informations forums :
    Inscription : Décembre 2003
    Messages : 423
    Points : 259
    Points
    259
    Par défaut

    Citation Envoyé par acesyde Voir le message
    Pour toi le mieux serais de mettre le post courant en session utilisateur ?
    Pas nécessairement, car conserver l'id du post en session implique certaines contraintes (durée de vie de cette donnée) et la gestion de cas particulier ...
    Citation Envoyé par acesyde Voir le message

    En faite ça résout plus ou moins mon soucis, avec la session si j'ouvre 2 fenêtres sur le 2 post différent et que je commente le premier ça le met dans le 2éme
    ... comme ce cas particulier que tu présentes (rien d'insurmontable mais système spécifique à mettre en place forcément).

    Citation Envoyé par acesyde Voir le message
    Si jamais tu as une idée, voir m'expliquer le token un petit peu plus en profondeur, je suis preneur.
    Plutôt que de faire un long et ennuyeux discours, dans les grandes lignes voici en quoi ça consiste et comment le mettre en place.
    En quoi ça consiste ? il s'agit en fait d'ajouter un champ à ton formulaire qui contient une version "codée" de ton id avec un système de codage que seul toi connais. A la soumission de ton formulaire tu vérifies alors que le code (token) transmis correspond bien à l'id envoyé via le formulaire (en regénérant le code en fait).
    De manière simplifié ça donne (non sf2 like) :
    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
    $_form = new MonForm();
    $_form->setPostId($_monId);
    if($_form->isValid())
    {
      // Je peux faire mon save
      ... 
    }
     
    ------
    class MonForm
    {
       private static $_secretKey = 'UneCle$uperS3cr3te';
       function setPostId($id)
       {
         $this->postId = $id;
         $this->token = $this->generateToken($id);
       }
     
       function isValid()
       {
         ... // Contrôle des champs, postId not empty ....
         if($this->token != $this->generateToken($this->postId))
         {
            // Le token ou l'id ont manifestement été modifié
            ... // positionnement d'une erreur
            return false;
         }
       }
     
       protected function generateToken($id)
       {
         return md5(sha1(self::$_secretKey.$id));
       }
     
     
    }
    Le système peut évidemment être amélioré ... mais c'est déjà un bon pas dans l'amélioration de la sécurité.

    Après évidemment, il faut réfléchir un peu au cas par cas et vérifier si vraiment ceci est utile et nécessaire. Exemple : sur le formulaire de modification des préférences de l'utilisateur courant (modification de son profil ou autre) il est inutile de mettre l'id et de token dans le formulaire ... Etant donné que l'on parle de modifier l'utilisateur courant, tu peux retrouver cette indication depuis ton objet user normalement.

    Have fun
    "La théorie, c’est quand on sait tout et que rien ne fonctionne. La pratique, c’est quand tout fonctionne et que personne ne sait pourquoi. Ici, nous avons réuni théorie et pratique : rien ne fonctionne ... et personne ne sait pourquoi !" et malheureusement c'est souvent le cas en Développement...

  9. #9
    Membre éclairé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 70
    Points : 681
    Points
    681
    Par défaut
    Merci bien pour cette bonne explication.

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

Discussions similaires

  1. [AJAX] Transmettre le contenu d'un champ hidden
    Par Arnaud F. dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 30/10/2006, 20h07
  2. Réponses: 5
    Dernier message: 29/08/2006, 17h30
  3. probleme formulaire et un champ hidden
    Par amigauss dans le forum Langage
    Réponses: 8
    Dernier message: 26/01/2006, 17h50
  4. remplir un formulaire qui se met dans un champ hidden
    Par cecileb dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 07/09/2005, 16h37
  5. Passage de paramètres dans champ hidden
    Par benassis dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 27/05/2005, 01h22

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