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 :

checkbox pour sélectionner ou pas certaines entités [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre expert
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Points : 3 004
    Points
    3 004
    Par défaut checkbox pour sélectionner ou pas certaines entités
    Bonjour les amis,
    je suis un gros nul en formulaire et j'ai besoin d'aide sur ce coup là.



    voici mon sujet :
    j'ai une liste d'entité fiches à récupérer en base de donnée

    je voudrais créer un formulaire qui associe un checkbox à une fiche, de cette manière :


    1)
    je ne veux pas que le checkbox valid soit enregistré en base.
    dans fiche j'ai ajouté cette attribut :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    private $valid;
     
    avec getter et setter qui vont bien
    2)
    je veux pouvoir initialiser les valid dans le controleur suivant une logique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
     $fiches= $em-> ....          // je récupère les fiches          
    foreach (fiches as fiche) {   
            $fiche->setValid(true);    
       ou
            $fiche->setValid(false);
     }
     
    $form = $this->createForm(new FicheType(), $fiches);

    et obtenir ça :
    [ ] fiche 1
    [X] fiche 2
    [ ] fiche 3
    ...


    comment m'y prendre ?

  2. #2
    Membre expérimenté Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Points : 1 310
    Points
    1 310
    Par défaut
    Yo, y a eu une grosse prise de conscience en l'espace d'une heure ? T'es passé de "dieu de Symfony" à "gros nul en formulaire".

    Le problème quand tu fais un champs (même non mappé) c'est que ton entité possède une dépendance vers un formulaire précis, et ça c'est mal.
    Du coup je pense que tu devrais dégager ce champs $valid de ton entité.

    Voilà comment j'aborderais la chose :

    Un formulaire qui prend une checkbox + une entité c'est assez banal et potentiellement récurent. Du coup tu peux en faire un formtype générique à part, on aurait dit que tu l'appelles CheckboxAndEntityType.
    En passant par l'OptionResolver, tu peux rajouter des options obligatoires pour la configuration de ce type d'élément.

    Ensuite, tu vas faire un formModel : c'est à dire une classe non mappée qui ne sera utilisée que pour ce form. La aussi tu peux faire un truc générique ou tu ne spécifies pas quel type d'entité est attendu. L'idée c'est d'avoir une classe correspondant à ton formulaire : donc les deux attributs sont $valid, et $entity.

    Pour finir, tu fais une collection de formulaires qui ne possède dans leur builder qu'un élément de form : qui sera de type 'checkbox_and_entity'.

    En amont dans ton contrôleur au lieu de setter un attribut de l'entité, tu instancies un nouveau formModel auquel tu set ton entité et le booléen.
    Dans le handleRequest tu récupères un objet de type FormModel. Tu accèdes à ton entité en faisant $formModel->getEntity() et à la valeur du valid en faisant $formModel->isValid().

    J'espère que j'ai été assez clair dans mes explications.
    ++

  3. #3
    Membre expert
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Points : 3 004
    Points
    3 004
    Par défaut
    tin ouééé du coup je me sens comme un dieu déchu, descendu de son piédestal ... snif
    mais un jour je le serai..... un jour .....


    Je te remercie pour ces informations, j'ai compris tes explications que je vais mettre en oeuvre.
    et vous tiens au courant

  4. #4
    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,

    En quoi le champ entity avec option "multiple" ne répondrait pas à ton besoin?

    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
    
    $touteLesFiches= $em->//récup toutes les fiches
    
    $fichesPreselectionnees=array();//faire un traitement si besoin pour choisir  les fiches devant être preselectionnée
    
    //un formulaire qui n'est pas directement mappé à une entité
    //c'est un simple tableau dont l'index "fichesSelectionnees" est un tableau d'entité fiches
    
    $formData=array('fichesSelectionnees'=>$fichesPreselectionnees);
    
    $form = $this->createFormBuilder($formData)
                       ->add('fichesSelectionnees','entity',array(
                                'class'=>'MyBundle:Fiche',
                                'multiple'=>true,
                                'choices'=>$touteLesFiches,
                                'property'=>'nom'//si la classe Fiche n'a pas de méthode __toString, ou si on veut utiler une méthode particulière pour le label
                        ))
                       ->getForm();
    
    $form->handleRequest();
    
    if($form->isSubmited() && $form->isValid()){
       
       $fichesSelectionnee=$form->get('fichesSelectionnees')->getData();
       //do something avec la selection
    
    }

  5. #5
    Membre expert
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Points : 3 004
    Points
    3 004
    Par défaut
    j'etudie vos 2 techniques :

    arno99,

    je ne vois pas comment je set true ou false ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     
    $fichesPreselectionnees=array();
     
    foreach( $touteLesFiches as $fiche ) {
      $fichesPreselectionnees[]  = $fiche;  ??????
     ?????
     
    comment je set à FALSE ou TRUE 
     
    }

  6. #6
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    je ne vois pas comment je set true ou false ici :
    Si la finalité est juste de récupérer des entités Fiches pour leur appliquer un traitement, il n'y a pas besoin d'attribut "valid".
    la checkbox n'est pas mappé à cet attribut "valid", mais au fait que la fiche soit ou pas dans la sélection.
    Le type de formulaire SF "entity" hérite du type "choice":
    C'est assez parlant, il s'agit d'un type de formulaire destiné à faire un/des choix, et qui tu renvois la sélection de l'utilisateur.

    Pour que des fiches soient présélectionnés au premier affichage du formulaire, il faut juste qu'elles soient dans le tableau "$fichesPreselectionnees".
    La logique selon laquelle elle doivent être préselectionnées t'appartiens, (et peut être n'en as tu pas besoin en fait).

  7. #7
    Membre expert
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Points : 3 004
    Points
    3 004
    Par défaut
    le but est d'afficher toutes les fiches et l'utilisateur choisit lesquels il souhaite. (par checkbox donc)
    mais j'en sélectionne quelques unes suivant une logique avant l'affichage.

    arno99, ta technique fonctionne MERCI

    pour ceux à qui ça peut intéresser :
    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
     
    $lesfiches = $em->   .....  / récupère toutes les fiches en bases
    $fichesPreselectionnees=array();
     
    foreach( $touteLesFiches as $fiche ) {
      if ( $fiche->getId()==6 )             //  pour tester, ma logique est simpliste   
         $fichesPreselectionnees[]  = $fiche;
    }
     
    $formData=array('fichesSelectionnees'=>$fichesPreselectionnees);
     
    $form = $this->createFormBuilder($formData)
                       ->add('fichesSelectionnees','entity',array(
                                'class'=>'XXXManagerBundle:Fiche',
                                'multiple'=>true,
                                'choices'=>$lesfiches ,
                                'property'=>'nom'    //si la classe Fiche n'a pas de méthode __toString, ou si on veut utiler une méthode particulière pour le label
                        ))
                       ->getForm();
    et en effet, dans la liste la fiche ayant l'ID =6 est selectionné.


    -----------------------------------------------------


    plus que la réponse de NICO_F pour faire fonctionner sa méthode.

  8. #8
    Membre expérimenté Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Points : 1 310
    Points
    1 310
    Par défaut
    La solution d'Arno qui consiste à faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    multiple => true,
    expanded => true
    suffit effectivement à avoir des checkboxes pour tes entités.

    Dans ton cas je privilégierais sa méthode à la mienne qui est inutilement plus complexe.

    ====

    Pour répondre à ta question sur ma première suggestion, (des fois que tu aies besoin de faire quelque chose de similaire dans un autre contexte) je dirais, sans être sûr à 100%, qu'il faut que tu définisses les options label dans les éléments de ton CheckboxAndEntityType.

  9. #9
    Membre expert
    Avatar de dukoid
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2012
    Messages
    2 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 2 100
    Points : 3 004
    Points
    3 004
    Par défaut
    et bien voici la méthode de NICO_F, si ça peut servir à quelqu'un


    l'entité model:
    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
     
    namespace XXX\AdminBundle\Model;
     
    class CheckFiche {    
        private $isCheck;
        private $entite;
     
        public function __construct() {
        }
     
        public function setIsCheck($isCheck) {
            $this->isCheck = $isCheck;
            return $this;
        }
        public function getIsCheck() {
            return $this->isCheck;
        }    
        public function setEntite($entite) {
            $this->entite = $entite;
     
            return $this;
        }
        public function getEntite() {
            return $this->entite;
        }        
    }


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class FicheCheckBoxType extends AbstractType {
        public function buildForm(FormBuilderInterface $builder, array $options) {
            $builder             
                ->add('models', 'collection', array('type' => new CheckboxAndEntityType(), 'mapped'=>true));                     
                ;                                           
        }
    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
     
    class CheckboxAndEntityType extends AbstractType {
        public function buildForm(FormBuilderInterface $builder, array $options) {
     
            $builder                         
                    ->add('entite', 'entity', array(  'class' => 'XXXManagerBundle:Fiche',
                                                                               'property'=>'nom'
                        ))              
                    ->add('isCheck', 'checkbox', array('mapped'=>'true', ))                     
                ;  
     
    ....
        public function setDefaultOptions(OptionsResolverInterface $resolver) {
            $resolver->setDefaults(array(    'data_class' => 'XXX\AdminBundle\Model\CheckFiche',
    ...
    dans le contrôleur :
    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
     
            $models = new ArrayCollection();
            $fiches= $this->container->...........         
            foreach ($fichesas $fiche) {
                    $model = new CheckFiche();
                    if ($droit->getId()==6)     // test bidon 
                        $model->setIsCheck(true);
                    else
                        $model->setIsCheck(false); 
                    $model->setIsCheck(true);
                    $model->setEntite($fiche);
                    $models->add($model);
            }             
            $formData=array('models'=>$models);        
     
            $form = $this->createForm(new fichesCheckBoxType(), $formData);
    j'obtiens bien le checkbox coché sur la fiche ayant l'ID =6




    MERCI les gars , vous assurez un max !!!!

  10. #10
    Membre actif
    Homme Profil pro
    Inscrit en
    Mars 2005
    Messages
    546
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 546
    Points : 219
    Points
    219
    Par défaut
    Merci pour ces solutions, ça m'enlève une épine...

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

Discussions similaires

  1. Sous requête pour sélectionner certaines colonnes
    Par Vince57 dans le forum Requêtes
    Réponses: 4
    Dernier message: 26/08/2010, 12h31
  2. [DisplayTag] Title pour display:column contenant checkbox pour tout sélectionner
    Par Slyders dans le forum Taglibs
    Réponses: 1
    Dernier message: 06/05/2010, 16h21
  3. [XL-2007] Checkbox pour sélectionner des plages
    Par Aurel.89 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 15/04/2010, 14h31
  4. [XL-2007] CheckBox ou Listbox pour sélectionner des critères et les afficher dans une autre feuille
    Par JessieCoutas dans le forum Macros et VBA Excel
    Réponses: 20
    Dernier message: 19/08/2009, 16h19
  5. Réponses: 10
    Dernier message: 11/11/2007, 16h18

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