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 :

Type de champ Collection - Ne pas afficher les objects existants [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 351
    Points : 342
    Points
    342
    Par défaut Type de champ Collection - Ne pas afficher les objects existants
    Bonjour,

    Comment faire pour ne pas afficher les champs des objets sous-jacents déjà existants, dans une collection form ?

    Ce que je ne veux pas : voir pj1
    Ce que je veux : voir pj2

    Merci
    Images attachées Images attachées   

  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
    Pourquoi ne pas masquer les formulaires des objets existants dans la vue ?

    Je pense qu'il est indispensable que ces éléments soient présent dans le <form> quand tu soumettras ton formulaire pour éviter qu'une collection incomplète n'écrase la précédente.

    Ou alors, deuxième cas de figure : si tu n'ajoutes tes éléments à ta collection que un par un, tu aurais plus vite fait de faire un formulaire se basant sur un nouvel élément de la collection en assignant toi même le parent.

  3. #3
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 351
    Points : 342
    Points
    342
    Par défaut
    Salut Nico_F,

    Merci de ta réponse.

    tu aurais plus vite fait de faire un formulaire se basant sur un nouvel élément de la collection en assignant toi même le parent.
    Je veux bien, mais concrètement comment on fait ? Est-ce que tu peux expliciter un peu plus ou me montrer un exemple qui se rapproche ? Merci.

  4. #4
    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
    Concrètement au lieu de faire un formulaire de l'entité A possédant une collection de B, tu fais juste un formulaire de B.

    Tu peux configurer ton formulaire de manière à avoir une liste de choix sur l'entité A (le parent). Ou bien tu l'assignes toi même dans ton contrôleur, après avoir récupérer le formulaire et l'avoir bindé à ton objet B. juste avant ton persist(), il te suffit de faire quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    // $objA = ... récupère ton objet A comme tu veux, par id en faisant une requête...
    $objB->setA($objA);
    $entityManager->persist($objB);

  5. #5
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 351
    Points : 342
    Points
    342
    Par défaut
    Salut Nico_F,

    Merci de ta réponse.

    Comme tu pourra le constater sur les pj suivantes il s'agit en fait de champs file (contrairement à ce que j'avais mis dans les pj du premier post, pour simplifier j'avais illustré mon propos avec des champs text simple, mais de toute façon ça revient au même).

    J'ai essayé ta solution et ça fonctionne bien avec un seul champ voir pj1 (le fichier s'ajoute bien au autres fichiers de l'arrayCollection) mais je n'arrive pas à la faire fonctionner avec une collection de champs : J'obtiens bien la vue voir pj2 (c'est ce que je voudrais obtenir) mais lorsque j'envoie le formulaire ça me retourne cette erreur voir pj3, à ton avis à quoi peut-être dut ce type d'erreur ? je comprend que ça vient du mapping mais le mapping de quoi exactement, je ne comprend pas bien .

    Pour reprendre ton exemple, j'ai en fait : entitéA : Categorie, entitéB : Fichier (relation OneToMany Bidirectionnelle)

    Merci.
    Images attachées Images attachées    

  6. #6
    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
    Je ne trouve pas très naturel d'ajouter à la collection d'un objet une autre collection qui n'y est pas rattachée. Soit tu ajoutes un seul élément et tu lui dis qui est le parent, soit tu prends la collection toute entière et tu l'édites en ajoutant autant d'éléments nouveaux que tu souhaites.

    Rajouter plusieurs éléments à une collection revient à éditer la collection, ce qui veut dire que tous les éléments de ta collection devront être présents dans le formulaire. Mais rien ne t’empêche de les cacher coté vue. Donc je te suggérerais plutôt de partir sur un formulaire de collection si tu veux en ajouter plusieurs à la fois et de masquer ce que tu ne veux pas voir, en CSS par exemple.

    Pour ton erreur je pense que le code de ton FormType et celui du traitement du formulaire permettraient d'identifier plus facilement ce qui coince.

  7. #7
    Membre averti
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2009
    Messages
    351
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2009
    Messages : 351
    Points : 342
    Points
    342
    Par défaut
    Ok, j'y suis arrivé en JS, comme j'avais déjà un scritp jquery qui tournait pour générer les champs, je l'ai adapté. Mais je trouve ça incroyable qu'il n'existe pas une simple option au niveau d'une collection pour ne pas afficher les objets existant afin de ne permettre que l'ajout de plusieurs objets à la fois sans modifier les objets existants de la collection, une option du genre : "exists" => false, tout simplement.

    Ci-joint, le code JS ça pourra peut-être aider quelqu'un dans le même cas que moi : Les modification que j'ai faites pour adapter le script se situes aux lignes 20,21 et modification de la condition ligne 24.

    En tout cas, encore merci de ton aide

    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
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    // On récupère la balise <div> en question qui contient l'attribut « data-prototype » qui nous intéresse.
            var $containerFichier = $('div#asset_reportmanagerbundle_categorietype_fichiers');        
     
            $('input.btn-primary').css({'margin-top':'20px'});    
     
            // On ajoute un lien pour ajouter une nouvelle catégorie
            var $lienAjoutFichier = $('<br><a href="#" id="ajout_fichier" class="btn"><i class="icon-plus-sign"></i> Ajouter un champ</a><br><br>');
            $containerFichier.append($lienAjoutFichier);       
     
            // On ajoute un nouveau champ à chaque clic sur le lien d'ajout.
            $lienAjoutFichier.click(function(e) {
              ajouterFichier($containerFichier);
              e.preventDefault(); // évite qu'un # apparaisse dans l'URL
              return false;
            }); 
     
            // On définit un compteur unique pour nommer les champs qu'on va ajouter dynamiquement
            var indexFichier = $containerFichier.find(':input').length;
     
            var indexOriginelFichier = indexFichier;
            $containerFichier.children('div').css({'display':'none'});
     
            // On ajoute un premier champ directement s'il n'en existe pas déjà un (cas d'un nouvel article par exemple).
            if (indexFichier === indexOriginelFichier) {
              ajouterFichier($containerFichier);
            } else {
              // Pour chaque catégorie déjà existante, on ajoute un lien de suppression
              $containerFichier.children('div').each(function() {
                ajouterLienSuppressionFichier($(this));
              });
            }       
     
            // La fonction qui ajoute un formulaire Categorie
            function ajouterFichier($containerFichier) {
              // Dans le contenu de l'attribut « data-prototype », on remplace :
              // - le texte "__name__label__" qu'il contient par le label du champ
              // - le texte "__name__" qu'il contient par le numéro du champ
              var $prototypeFichier = $($containerFichier.attr('data-prototype').replace(/__name__label__/g, '')
                                                                  .replace(/__name__/g, indexFichier));
     
              // On ajoute au prototype un lien pour pouvoir supprimer la catégorie
              ajouterLienSuppressionFichier($prototypeFichier);
     
              if (indexFichier !== indexOriginelFichier) {
                $prototypeFichier.css({'display':'none'});
              }
     
              // On ajoute le prototypeFichier modifié à la fin de la balise <div>
              $containerFichier.append($prototypeFichier);
     
              $prototypeFichier.fadeIn();
     
              // Enfin, on incrémente le compteur pour que le prochain ajout se fasse avec un autre numéro
              indexFichier++;
            }
     
            // La fonction qui ajoute un lien de suppression d'une catégorie
            function ajouterLienSuppressionFichier($prototypeFichier) {
              // Création du lien
              $lienSuppressionFichier = $('<a href="#" class="btn btn-warning" style="float:left; margin-right:5px"><i class="icon-minus-sign icon-white"></i></a>');
     
              // Ajout du lien
              $prototypeFichier.children('div').prepend($lienSuppressionFichier);
     
              // Ajout du listener sur le clic du lien
              $lienSuppressionFichier.click(function(e) {            
                $prototypeFichier.fadeOut( function complete(){ $prototypeFichier.remove(); });
                //$prototypeFichier.remove();
                e.preventDefault(); // évite qu'un # apparaisse dans l'URL
                indexFichier--;
                return false;
              });
            }

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 04/07/2013, 10h23
  2. Réponses: 2
    Dernier message: 15/03/2009, 22h52
  3. [MySQL] Ne pas afficher les Warnings du type mysql_connect, mysql_query,etc.
    Par brunoperel dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 04/09/2007, 15h42
  4. [Sécurité] Ne pas afficher les variables de l'URL
    Par Wormus dans le forum Langage
    Réponses: 17
    Dernier message: 23/10/2005, 14h13
  5. [JTable] Comment ne pas afficher les titres ?
    Par FabienBxl dans le forum Composants
    Réponses: 3
    Dernier message: 08/10/2003, 15h01

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