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
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
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.
Salut Nico_F,
Merci de ta réponse.
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.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.
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);
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.
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.
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; }); }
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager