Derniers messages sur Zeste de Savoirhttps://zestedesavoir.com/forums/2018-08-23T09:27:18+02:00Les derniers messages parus sur le forum de Zeste de Savoir.Symfony Forms Type Collection, message #1869642018-08-23T09:27:18+02:00Moufle/@Mouflehttps://zestedesavoir.com/forums/sujet/11098/symfony-forms-type-collection/?page=1#p186964<p>Hello,</p>
<p>Juste pour revenir dire que tout fonctionne à merveille (vacances entre temps, me jugez pas sur le temps que j’ai mis <img src="/static/smileys/heureux.png" alt=":D" class="smiley"> )</p>
<p>Merci encore <a href="/membres/voir/Ymox/" rel="nofollow" class="ping ping-link">@<span class="ping-username">Ymox</span></a> ! </p>
<p>Ça m’a permit de mieux comprendre comment sa fonctionne sous le capot, comment Symfony hydrate avec les formulaires, etc… </p>
<p>Y’avait plusieurs solutions mais j’ai opté pour l’ajout d’un getter/adder/remover sur l’entité Chart d’un champs qui n’est, à la base, pas directement accessible depuis cette Entité. Je ne savais pas que c’était possible mais en faite on peut faire ce qu’on veut, c’est puissant ! <img src="/static/smileys/pirate.png" alt=":pirate:" class="smiley"></p>
<div class="hljs-code-div"><div class="hljs-line-numbers"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></div><pre><code class="hljs language-php"><span class="hljs-meta"><?php</span>
<span class="hljs-comment"># Entité Chart</span>
[...]
<span class="hljs-comment">/**
* <span class="hljs-doctag">@return</span> Collection|ComparisonType[]
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">getComparisonTypes</span><span class="hljs-params">()</span>: <span class="hljs-title">Collection</span>
</span>{
$comparisonTypes = <span class="hljs-keyword">new</span> ArrayCollection();
<span class="hljs-keyword">foreach</span> (<span class="hljs-keyword">$this</span>->getChartComparisonTypes() <span class="hljs-keyword">as</span> $chartComparisonType) {
$comparisonTypes->add($chartComparisonType->getComparisonType());
}
<span class="hljs-keyword">return</span> $comparisonTypes;
}
<span class="hljs-comment">/**
* <span class="hljs-doctag">@param</span> ComparisonType $comparisonType
*
* <span class="hljs-doctag">@return</span> $this
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">addComparisonType</span><span class="hljs-params">(ComparisonType $comparisonType)</span>: <span class="hljs-title">self</span>
</span>{
$chartComparisonType = <span class="hljs-keyword">new</span> ChartComparisonType(<span class="hljs-keyword">$this</span>, $comparisonType);
<span class="hljs-keyword">$this</span>->addChartComparisonType($chartComparisonType);
<span class="hljs-keyword">return</span> <span class="hljs-keyword">$this</span>;
}
<span class="hljs-comment">/**
* <span class="hljs-doctag">@param</span> ComparisonType $comparisonType
*
* <span class="hljs-doctag">@return</span> $this
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">removeComparisonType</span><span class="hljs-params">(ComparisonType $comparisonType)</span>: <span class="hljs-title">self</span>
</span>{
<span class="hljs-keyword">foreach</span> (<span class="hljs-keyword">$this</span>->chartComparisonTypes <span class="hljs-keyword">as</span> $chartComparisonType) {
<span class="hljs-keyword">if</span> ($chartComparisonType->getComparisonType() === $comparisonType) {
<span class="hljs-keyword">$this</span>->chartComparisonTypes->removeElement($chartComparisonType);
}
}
<span class="hljs-keyword">return</span> <span class="hljs-keyword">$this</span>;
}
[...]
</code></pre></div>
<p>Merci encore <img src="/static/smileys/smile.png" alt=":)" class="smiley"></p>Symfony Forms Type Collection, message #1854642018-08-03T21:10:00+02:00Moufle/@Mouflehttps://zestedesavoir.com/forums/sujet/11098/symfony-forms-type-collection/?page=1#p185464<blockquote>
<p>Tu calcules des "sous-performances" ?</p>
</blockquote>
<p>L’utilisateur peux choisir le type de période (quotidien, mensuelle) sur un mois donné pour voir la performance de son indicateur. Un indicateur dans mon projet est un indice de performance. Par utilisateur, par jour, pleins d’informations sont stockées. A partir de ces informations brut, on créer des méthodes de calculs et hop, nous voilà avec un indicateur de performance. Après avec seulement un utilisateur et une date on peut avoir accès aux données.</p>
<p>Donc à la base, le diagramme, c’est juste pour afficher la performance de l’utilisateur de son indicateur sur une période donnée.</p>
<p>Donc rapidement, j’ai mis en place comme Entité : <code>User</code> ==> <code>UserIndicator</code> <== <code>Indicator</code> et sur l’entité de relation UserIndicator, j’ai rattaché une Entité <code>Performance</code> mais que j’ai nommé UserIndicatorPerformance.</p>
<p>Du coup je vais pouvoir répondre à ta question <img src="/static/smileys/langue.png" alt=":p" class="smiley"></p>
<p>Pour les "sous-performances" dont tu fais allusion et qui sont rattachés à l’entité <code>ChartComparisonType</code>, c’est pour stocker les performances des différents types de comparaisons comme la moyenne de l’équipe, les objectifs, bref pleins de trucs déjà gérer en base et où je n’ai plus qu’à "taper" sur les procédures stockées. </p>
<p>Donc j’ai nommé cette entité ChartComparisonTypePerformance. Ca peut paraître bizarre, mais j’ai pas trouvé mieux pour conceptualisé la base de données. Si j’avais gardé une seule entité <code>Performance</code> pour gérer tout ça, ça aurait compliqué tout.</p>
<p>Donc au final, l’utilisateur voit sur son diagramme la courbe de son indicateur, mais aussi les courbes des autres types de comparaison de ce même indicateur. (Un indicateur = un diagramme)</p>Symfony Forms Type Collection, message #1854602018-08-03T18:34:16+02:00Ymox/@Ymoxhttps://zestedesavoir.com/forums/sujet/11098/symfony-forms-type-collection/?page=1#p185460<p>Tu n’avais pas expressément précisé que c’était fait à la volée, et je pensais plus à un calcul côté PHP que côté base de données (ce qui est probablement plus rapide) — calcul qui se fait sur la durée intéressante, j’imagine, vu que la période du graphe est au choix de l’utilisateur. Mais j’avoue que je ne comprenais pas l’histoire de la propriété pour le résultat de ce calcul, d’autant que c’est en ManyToMany. Tu calcules des "sous-performances" ?</p>Symfony Forms Type Collection, message #1854552018-08-03T17:21:06+02:00Moufle/@Mouflehttps://zestedesavoir.com/forums/sujet/11098/symfony-forms-type-collection/?page=1#p185455<p>Yes Faut que je creuse un peu ta solution.</p>
<p>Je n’ai pas besoin de stocker l’historique des performances, c’est un calcul à la volé (qui tappe en gros sur des procédures stocké). J’hydrate la collection ChartComparisonType#performances pour chaque ChartComparisonType du Chart et hop j’affiche le tout sur le diagramme.</p>
<p>Quand je me relis, je me demande comment tu fais pour comprendre tout ça <img src="/static/smileys/rire.gif" alt=":lol:" class="smiley"></p>
<p>Édit: qu’est ce que tu entends par "automatisable" ? Ce n’est pas déjà le cas dans la manière où je te le décris ?</p>Symfony Forms Type Collection, message #1854512018-08-03T16:28:31+02:00Ymox/@Ymoxhttps://zestedesavoir.com/forums/sujet/11098/symfony-forms-type-collection/?page=1#p185451<p>Si c’est rempli à la volée lors de l’affichage, du coup il n’y a pas trop de souci si tu souhaitais creuser un peu plus la solution que je te proposais.</p>
<p>Après, je pense que le calcul de la performance est automatisable. Tu souhaites/dois conserver un historique, ou ça pourrait être recalculé à la volée ?</p>Symfony Forms Type Collection, message #1854492018-08-03T16:02:26+02:00Moufle/@Mouflehttps://zestedesavoir.com/forums/sujet/11098/symfony-forms-type-collection/?page=1#p185449<blockquote>
<p>on aurait addComparisonType dans Chart, et dans cette méthode la création de l’objet ChartComparisonType</p>
</blockquote>
<p>Pour cette solution, addComparisonType est toujours appelé depuis le Controller c’est bien ça ?</p>
<p>Pour être un peu plus explicite sur les extra fields de ChartComparisonType : Il n’y en a pour l’instant qu’un seul : "performances", un champs relation de type One(ChartComparisonType )ToMany(Performance).</p>
<p>Un arrayCollection qui du coup reste vide quand on ajoute un ChartComparisonType à un Chart.
C’est un champs un peu spécial qui est hydraté depuis un service à la volé juste avant l’affichage mais j’te passe un peu les détails.</p>Symfony Forms Type Collection, message #1854482018-08-03T15:45:37+02:00Ymox/@Ymoxhttps://zestedesavoir.com/forums/sujet/11098/symfony-forms-type-collection/?page=1#p185448<p>Il n’y a cependant pas de miracle. Si tu souhaites pouvoir choisir parmi une liste d’entités qui n’est pas liée directement à celle que tu manipules, tu vas devoir implémenter la gestion que tu souhaites en faire.</p>
<p>Après, tout est question de où la mettre. Certains la mettent dans l’entité manipulée (on aurait addComparisonType dans Chart, et dans cette méthode la création de l’objet ChartComparisonType), d’autres mettraient directement dans le contrôleur, d’autres créeraient un service appelé dans le contrôleur, d’autres créeraient un DataTransformer… Sans savoir ce que sont les autres champs de ChartComparisonType (et surtout si ces autres champs peuvent être automatisés — je pense aux dates de création et d’édition), c’est difficile de conseiller plus précisément.</p>Symfony Forms Type Collection, message #1854462018-08-03T15:26:43+02:00Moufle/@Mouflehttps://zestedesavoir.com/forums/sujet/11098/symfony-forms-type-collection/?page=1#p185446<p>Ça fonctionne, merci Ymox <img src="/static/smileys/clin.png" alt=";)" class="smiley"></p>
<p>Mais en vrai je suis tellement frustré de devoir manuellement hydraté ce champs dans le Controller…
Quand on sait qu’avec un simple ManyToMany, (sans extra fields a la table de relation), il n’y a pas de problème à faire ce que je veux <img src="/static/smileys/unsure.gif" alt=":euh:" class="smiley"> </p>
<p>Je suis sûr qu’il doit y avoir un moyen mais je ne suis pas encore à l’aise avec les forms et la doc est pas si bien explicite que ça <img src="/static/smileys/triste.png" alt=":(" class="smiley"></p>
<p>En tout cas merci ! </p>Symfony Forms Type Collection, message #1854392018-08-03T12:23:49+02:00Moufle/@Mouflehttps://zestedesavoir.com/forums/sujet/11098/symfony-forms-type-collection/?page=1#p185439<p>Ok, je pense que ça va le faire !</p>
<p>Je repasserai pour mettre le sujet en résolu si tout s’est bien passé <img src="/static/smileys/magicien.png" alt=":magicien:" class="smiley"></p>
<p>Merci encore Ymox</p>Symfony Forms Type Collection, message #1854382018-08-03T12:17:53+02:00Ymox/@Ymoxhttps://zestedesavoir.com/forums/sujet/11098/symfony-forms-type-collection/?page=1#p185438<p>Cases à cocher ou liste de choix à sélection multiple, ça ne change rien pour Symfony vu que ce sera un ArrayCollection qui te sera retourné dans les deux cas. C’est juste l’affichage qui change et, le cas échéant, le JavaScript qui doit s’occuper de ça.</p>Symfony Forms Type Collection, message #1854372018-08-03T12:15:49+02:00Moufle/@Mouflehttps://zestedesavoir.com/forums/sujet/11098/symfony-forms-type-collection/?page=1#p185437<p>Salut Ymox !</p>
<blockquote>
<p>Une des manières que je verrais de permettre de choisir les ComparisonType avec des checkboxes </p>
</blockquote>
<p>Pour mon cas c’était plus un select box multiple dont j’avais besoin.</p>
<h4 id="deux-formulaires">Deux formulaires<a aria-hidden="true" href="#deux-formulaires"><span class="icon icon-link"></span></a></h4>
<p>Mais du coup je comprends mieux pourquoi je galère depuis un moment… En faite à la limite un deuxième formulaire (donc deuxième createView) devrait faire l’affaire si côté controller je m’occupe de bien hydrater l’objet Chart comme il faut ? </p>
<h4 id="modifier-mes-relations">Modifier mes relations<a aria-hidden="true" href="#modifier-mes-relations"><span class="icon icon-link"></span></a></h4>
<p>Ou alors je fais en sorte de mettre en place un ManyToMany simple entre Chart et ComparisonType, et les "extra fields" que j’avais besoin de rajouter dans mon "ChartComparisonType" je m’occupe de faire une table à part avec les bonnes liaisons (celles-ci ne seront jamais affiché dans un form)</p>
<h4 id="solution-dymox">Solution d’Ymox<a aria-hidden="true" href="#solution-dymox"><span class="icon icon-link"></span></a></h4>
<blockquote>
<p>Une des manières que je verrais de permettre de choisir les ComparisonType avec des checkboxes impliquerait un champ non-mappé dans ChartForm pour lister les objets ComparisonType, et traitement supplémentaire dans le contrôleur pour créer les objets ChartComparisonType y relatifs — mais ça ne te permet évidemment pas de saisir les autres informations si ces dernières ne sont pas automatiques.</p>
</blockquote>
<p>Je peux essayer de faire ça effectivement étant donné que les autres informations n’ont pas besoin d’être saisi. Mais le côté checkbox me fait peur, je peux faire la même chose avec un selet box multiple non ?</p>Symfony Forms Type Collection, message #1854352018-08-03T11:53:43+02:00Ymox/@Ymoxhttps://zestedesavoir.com/forums/sujet/11098/symfony-forms-type-collection/?page=1#p185435<p>Salut !</p>
<p>La collection Chart#chartComparisonTypes contient bien des objets ChartComparisonType, mais ChartComparisonType#comparisonType ne peut contenir qu’un seul ComparisonType. En conséquence, le champ de formulaire pour ChartComparisonType#comparisonType ne peut pas avoir <code>'multiple' => true</code>.</p>
<p>Une des manières que je verrais de permettre de choisir les ComparisonType avec des checkboxes impliquerait un champ non-mappé dans ChartForm pour lister les objets ComparisonType, et traitement supplémentaire dans le contrôleur pour créer les objets ChartComparisonType y relatifs — mais ça ne te permet évidemment pas de saisir les autres informations si ces dernières ne sont pas automatiques.<br>
Dans ce dernier cas, tu pourrais imaginer enlever le champ pour ChartComparisonType#comparisonType dans ChartComparisonTypeForm, et au choix d’une des checkboxes du champ ci-dessus, ajouter un élément dans la collection Chart#chartComparisonType pour pouvoir saisir manuellement les informations nécessaires.</p>Symfony Forms Type Collection, message #1854282018-08-03T09:50:16+02:00Moufle/@Mouflehttps://zestedesavoir.com/forums/sujet/11098/symfony-forms-type-collection/?page=1#p185428<p>Salut <img src="/static/smileys/smile.png" alt=":)" class="smiley"> ! </p>
<p>Encore une question sur les formulaires de Symfony &gt;_&lt;</p>
<p>Trois Entity ici: <code>Chart</code>, <code>ComparisonType</code>, et la table de relation <code>ChartComparisonType</code> (que j’ai mis en entité car j’ai rajouté d’autres champs mais bref…)
J’ai un formulaire pour l’entité <code>Chart</code> et je voudrais que l’utilisateur puisse ajouter des <code>ComparisonType</code> à son <code>Chart</code> par un select box multiple. Le select box affiche le nom de chaque <code>ComparisonType</code> déjà préalablement remplie dans la base de donnée (pas possible d’en ajouter quoi).</p>
<p>Ici un petit schéma pour comprendre les relations : </p>
<figure><img src="https://image.noelshack.com/fichiers/2018/31/5/1533282481-collection.png" alt="https://image.noelshack.com/fichiers/2018/31/5/1533282481-collection.png"><figcaption>https://image.noelshack.com/fichiers/2018/31/5/1533282481-collection.png</figcaption></figure>
<p>Donc je me suis dit, pas de souci, easy peasy, je commence par créer un <code>collectionType</code> dans le formulaire de mon entité Chart pour le champs "chartComparisonTypes" qui pointe vers un autre formulaire : </p>
<div class="hljs-code-div"><div class="hljs-line-numbers"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></div><pre><code class="hljs language-php"><span class="hljs-comment"># The Chart Form</span>
[...]
->add(<span class="hljs-string">'chartComparisonTypes'</span>, CollectionType::class, [
<span class="hljs-string">'entry_type'</span> => ChartComparisonTypeForm::class,
<span class="hljs-string">'required'</span> => <span class="hljs-keyword">false</span>,
])
<span class="hljs-comment"># The ChartComparisonType Form</span>
[...]
->add(<span class="hljs-string">'comparisonType'</span>, EntityType::class, [
<span class="hljs-string">'class'</span> => ComparisonType::class,
<span class="hljs-string">'choice_label'</span> => <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-params">($comparisonType)</span> </span>{
<span class="hljs-keyword">return</span> $comparisonType->getName(); <span class="hljs-comment">/* <span class="hljs-doctag">@var</span> ComparisonType $comparisonType */</span>
},
<span class="hljs-string">'required'</span> => <span class="hljs-keyword">false</span>,
<span class="hljs-string">'multiple'</span> => <span class="hljs-keyword">true</span>,
<span class="hljs-string">'expanded'</span> => <span class="hljs-keyword">false</span>,
])
</code></pre></div>
<p>Seulement je n’arrive pas à mes fin, suis-je au moins sur la bonne voie ? </p>
<p>En vous remerciant ! <img src="/static/smileys/smile.png" alt=":)" class="smiley"></p>