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 :

affichage de valeurs de session dans un form non soumis


Sujet :

Symfony PHP

  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2007
    Messages : 643
    Points : 305
    Points
    305
    Par défaut affichage de valeurs de session dans un form non soumis
    Salut à tous,

    J'aimerais mettre en place un moteur de recherche avec l'affichage d'un tableau contenant des données qui utilise la PAGINATION(important).
    Ainsi la mise en place de mon moteur de recherche marche très bien et affiche bien les données en conséquence dans mon tableau.

    Par contre le système de pagination que j'utilise (knp_paginator) ne va pas sauvegarder les valeurs de mon formulaire. Ainsi je suis obligé de passer
    par des valeurs en session pour pouvoir reconstruire mon queryBuilder en rapport aux valeurs de recherche.

    Néanmoins une fois tout ceci mis en place il me reste un problème que je n'arrive pas à résoudre, à savoir ré afficher les critères de recherche dans mon formulaire
    quand j'utilise le système de pagination - tri ou page ou item par page - (ainsi je ne re-soumet pas mon formulaire) grâce à mes critères sauvegardés en session.
    Les fonctions de pagination sont bien fonctionnelle par ailleurs et sur le données attendues.

    Pourriez-vous m'aider à mettre ce système en place ?
    J'essaie de passer des valeurs en session dans la construction de mon form à l'aide de l'option preferred_choices utilisé dans un champ de type entity.

    voici la construction de mon form dans mon controller :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
                $searchForm = $this->createForm(new CqsProSansMarqueType(), $CqsProSansMarque, array(
                    'action' => $this->generateUrl('QualityPage_proSansMarque_search', array('maxItemsPerPage' => $maxItemsPerPage)),
                    'method' => 'POST',
                    'attr'   =>  array('ray_libelle' => $CqsProSansMarque->getRayLibelle()),
                ));


    voici la class de mon form :
    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
    class CqsProSansMarqueType extends AbstractType
    {
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $defaultCQSsearch = new CqsProSansMarque();
    //        ladybug_dump($options['attr']);
            $defaultCQSsearch->setRayLibelle((!array_key_exists('ray_libelle', $options['attr'])) ? 'toto' : $options['attr']['ray_libelle']);
            $defaultCQSsearch->setFamLibelle((!array_key_exists('fam_libelle', $options['attr'])) ? null : $options['attr']['fam_libelle']);
            $defaultCQSsearch->setCaeLibelle((!array_key_exists('cae_libelle', $options['attr'])) ? null : $options['attr']['cae_libelle']);
     
            $em = $this->getDoctrine()->getManager();
            $test = $em->getRepository('ApplicationDriveBundle:CqsProSansMarque')->find(5);
            ladybug_dump($test);
     
    //        ladybug_dump($defaultCQSsearch);
     
            $builder
                ->add('ray_libelle', 'entity', array(
                    'class' => 'ApplicationDriveBundle:CqsProSansMarque',
                    'property' => 'ray_libelle',
                    'query_builder' => function(CqsProSansMarqueRepository $er){
                        return $er->createQueryBuilder('a')
                        ->select('a')
                        ->groupBy('a.ray_libelle');
                    },
                    'preferred_choices' => array($defaultCQSsearch),
                    'label' => 'rayon',
                    'required' => false,



    l'entity n'a pas de problème et j'ai bien validé que mes données en session sont présente et également dans ma class form.
    Lorsque je passe autre chose qu'un objet dans un array pour l'option preferred_choices, symfony n'aime pas vraiment.

    Ainsi je n'ai pas d'erreur retourné à proprement de Symfony mais je n'ai aucun affichage de mes valeurs en session (présente dans l'objet passé à l'options preferred_choices).


    Merci de votre précieuse aide.

  2. #2
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2007
    Messages : 643
    Points : 305
    Points
    305
    Par défaut
    en somme avoir un select HTML qui est produit par un champ de form de type entity et qui possède à la fois :
    - des valeurs correspondant à une simple queryBuilder d'un champ entity
    - une valeur préselectionné correspondant à la precedente soumission du formulaire qui est comprise dans les valeurs du querybuilder standard (quand le form n'est pas soumis)

  3. #3
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    Bonjour,

    La façon la plus simple de mettre en place un formulaire de recherche est que celui-ci soit en méthode GET et non POST.
    ça s'intégrera parfaitement avec knp_paginator.

    C'est conforme à l'esprit du HTTP: méthode GET = accés à une ressource, méthode POST= modification d'une ressource.
    + possibilité de bookmarker des recherches
    + possibilité de partager ces recherches (email, forum)
    + navigation précédent/suivant possible


    On peut se poser la question d'utiliser des sessions lorsque l'on a plusieurs dizaines de champ de recherche ( en raison de limite de taille sur les url, la méthode GET n'est plus adaptée)

  4. #4
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2007
    Messages : 643
    Points : 305
    Points
    305
    Par défaut
    très bonne remarque et je suis quelque part bien d'accord avec toi sans rentrer dans les détails.
    Malheureusement j'ai la contrainte de travailler en POST et mes moteurs de recherche contiennent au minimum une dizaine de champs minimum.

    Je tourne en rond sérieusement et personne arrive à me fournir une explication au fait que mon champ ne marche pas comme je le souhaite.
    Je vais donc essayer de passer par un form en tant que service et éventuellement créer mon propre type de champs aussi.

  5. #5
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    Quel valeur met tu en session?

    - les données transmises par l'utilisateur ?

    - les données issue de form->getData() ?


    dans le premier cas (que j'utiliserais) , il n'y aura pas de probleme de sérialisation (le transfert entre un client et un serveur c'est toujours de la sérialisation)
    et il suffit de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $form->submit($session->get('recherche_data'));

    dans le 2eme cas, ce sera plus problématique (exemple pour un champ entity tu met un objet complet en session, et lorsque tu le récuperes de ta session,il n'est plus managé par Doctrine, ce qui peut poser des soucis)

  6. #6
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2007
    Messages : 643
    Points : 305
    Points
    305
    Par défaut
    Je mets en session les valeurs transmisses par le client en POST et validé par Doctrine.
    Je n'ai pas vraiment de problème de récupération de valeurs.
    Quand je recréé mon forms j'arrive bien à récuperer mes valeurs provenant de ma session.

Discussions similaires

  1. [1.x] passer un object session dans un form
    Par nlefebvre1 dans le forum Symfony
    Réponses: 3
    Dernier message: 21/05/2012, 09h34
  2. Réponses: 4
    Dernier message: 04/05/2011, 16h28
  3. [c#] [SVG] affichage d'une image svg dans un form (pocket pc)
    Par DontNet dans le forum Windows Forms
    Réponses: 1
    Dernier message: 26/10/2007, 15h19
  4. [jsp] Valeur par défaut dans un form
    Par GLDavid dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 06/07/2006, 10h07
  5. [MySQL] Affichage de valeurs par selection dans une table
    Par Flushovsky dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 16/12/2005, 17h04

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