Bonjour, Le module wikitty struts est un module fait pour faciliter la création de formulaire d'édition de wikitty. Il prend la forme d'une tag lib, plug in de struts, qui pour le moment n'implique pas forcément l'utilisation de struts, rien n'empêche de l'utiliser en tag lib classique. Cette tag lib se présente comme une collection de tag à mettre dans une page pour définir un formulaire d'édition de wikitty, elle propose aussi une action abstraite qui s'occupe de l'édition du wikitty avec les informations envoyées par le formulaire, elle est abstraite avec une méthode à implémenter "getProxy()" ainsi le développeur n'a qu'a rajouter une action qui hérite de notre action abstraite et la mettre dans son application. Le tag principal est le tag wikitty à qui l'on donne le proxy, le wikitty correspondant, l'url de l'action (et d'autres attributs non obligatoires) avec cela un formulaire simple est créé avec des champs basiques d'édition textfield/textarea/checkbutton. Ensuite l'utilisateur peut forcer des champs à avoir une formalisme particulier, et pour celà il se sert des autres tag exemple <ws:wikitty wikitty="lewikitty" proxy="leproxy" action="edit.action"> <ws:hidden name="WikittyLabel.labels" /> <ws:wikittyselect name="WikittyPersonne.epoux" label="epoux" criteria="WikittyPersonne" descfield="WikittyPersonne.name"/> </ws:wikitty> là le résultat serait un champ caché pour les labels, et une combobox pour le choix de l'epoux du wikitty personne, en cherchant les wikitty avec le criteria et dans le champ du combo apparaitrait les nom des wikittyPersonne obtenu avec la recherche par critéria. le tag wikitty permet aussi d'exclure ou d'inclure des champs/extension, si par exemple exclude="wikittylabels.*, wikittypersonne.nom" l'extension wikitty labels sera exclu du formulaire et pareil pour le champ nom de wikitty personne, mais les autres champs seront présenté. Si le champ include est remplis, seulement ces champs seront présent, sauf ceux qui seront exclu. Il est aussi possible de définir l'ordre d'affichage des champs, sans les rédéfinir/forcer le type. Pour résumer une tag lib pour l'édition de wikitty, avec un tag wikitty général et des sous tag pour forcer l'affichage d'un champ sous un certain format et une action abstraite qui enregistre les modifications. En sous tag on a: - boolean - textfield - textarea - wikittyselect, pour un combo box de wikitty - fixedselect pour un combo box avec des valeurs misent dans le tag - hidden pour champ caché En prévision: - date A terme le formulaire enverra sa requete en ajax et il y aura une redirection si l'attribut redirect sera remplit, sinon le formulaire devrait être mis à jour. Manoël
Le 29/06/2011 18:29, Manoël Fortun a écrit :
<ws:wikitty wikitty="lewikitty" proxy="leproxy" action="edit.action"> <ws:hidden name="WikittyLabel.labels" /> <ws:wikittyselect name="WikittyPersonne.epoux" label="epoux" criteria="WikittyPersonne" descfield="WikittyPersonne.name"/>
D'abord merci d'avoir pris le temps de partager ça avec nous. J'ai une petite amélioration à suggérer. Ce qui me perturbe dans le code que tu donnes, c'est l'ordre des valeurs dans la combox qui va être produite. Si je prends l'exemple que tu donnes, dans la combo-box il va s'afficher les noms des personnes retournées par la requête. Je suppose que la requête va retourner les personnes dans un ordre quelconque. Pour l'utilisateur, c'est pénible si c'est pas trié. Il faudrait que la tag lib trie automatiquement les valeurs selon l'ordre naturel des valeurs de la propriété donnée dans le descfield. Dans le cas présent, les personnes seront triées selon l'ordre alphabétique du champ name. Dans 95% c'est ce qu'on souhaite comme tri. C'est ce que nous avons fait avec Sylvain dans le projet actuel, nous avons un composant permettant de choisir une entité parmi une collection, il fait lui-même le tri, ça évite d'avoir à adapter la requête (order by en SQL) à chaque fois selon le champ qui sera utilisé pour l'affichage. Je sais pas si j'suis clair... -- Brendan Le Ny <bleny@codelutin.com> Code Lutin Conseil & Développement Logiciel Libre +33 (0)2 40 50 29 28 http://codelutin.com
2011/6/29 Brendan Le Ny <bleny@codelutin.com>
Le 29/06/2011 18:29, Manoël Fortun a écrit :
<ws:wikitty wikitty="lewikitty" proxy="leproxy" action="edit.action">
<ws:hidden name="WikittyLabel.labels" /> <ws:wikittyselect name="WikittyPersonne.epoux" label="epoux" criteria="WikittyPersonne" descfield="WikittyPersonne.**name"/>
D'abord merci d'avoir pris le temps de partager ça avec nous.
J'ai une petite amélioration à suggérer. Ce qui me perturbe dans le code que tu donnes, c'est l'ordre des valeurs dans la combox qui va être produite.
Si je prends l'exemple que tu donnes, dans la combo-box il va s'afficher les noms des personnes retournées par la requête. Je suppose que la requête va retourner les personnes dans un ordre quelconque. Pour l'utilisateur, c'est pénible si c'est pas trié.
Il faudrait que la tag lib trie automatiquement les valeurs selon l'ordre naturel des valeurs de la propriété donnée dans le descfield. Dans le cas présent, les personnes seront triées selon l'ordre alphabétique du champ name. Dans 95% c'est ce qu'on souhaite comme tri.
C'est ce que nous avons fait avec Sylvain dans le projet actuel, nous avons un composant permettant de choisir une entité parmi une collection, il fait lui-même le tri, ça évite d'avoir à adapter la requête (order by en SQL) à chaque fois selon le champ qui sera utilisé pour l'affichage.
Je sais pas si j'suis clair...
Si si j'ai compris. Je pense que ça pourrais se faire, après le soucis c'est potentiellement si dans l'attribut descfield l'utilisateur met plusieurs champs je concatène les valeurs de ces champs, c'est peut être pas pertinent ya des choses à améliorer. Du coup je pense que ça doit pouvoir se mettre dans la -- Manoël
Désolé double réponse <_< faut plus que je réponde avec l'interface web. 2011/6/29 Brendan Le Ny <bleny@codelutin.com>
Le 29/06/2011 18:29, Manoël Fortun a écrit :
<ws:wikitty wikitty="lewikitty" proxy="leproxy" action="edit.action">
<ws:hidden name="WikittyLabel.labels" /> <ws:wikittyselect name="WikittyPersonne.epoux" label="epoux" criteria="WikittyPersonne" descfield="WikittyPersonne.name"/>
D'abord merci d'avoir pris le temps de partager ça avec nous.
J'ai une petite amélioration à suggérer. Ce qui me perturbe dans le code que tu donnes, c'est l'ordre des valeurs dans la combox qui va être produite.
Si je prends l'exemple que tu donnes, dans la combo-box il va s'afficher les noms des personnes retournées par la requête. Je suppose que la requête va retourner les personnes dans un ordre quelconque. Pour l'utilisateur, c'est pénible si c'est pas trié.
Il faudrait que la tag lib trie automatiquement les valeurs selon l'ordre naturel des valeurs de la propriété donnée dans le descfield. Dans le cas présent, les personnes seront triées selon l'ordre alphabétique du champ name. Dans 95% c'est ce qu'on souhaite comme tri.
C'est ce que nous avons fait avec Sylvain dans le projet actuel, nous avons un composant permettant de choisir une entité parmi une collection, il fait lui-même le tri, ça évite d'avoir à adapter la requête (order by en SQL) à chaque fois selon le champ qui sera utilisé pour l'affichage.
Je sais pas si j'suis clair...
Si si j'ai compris. Je pense que ça pourrais se faire, après le soucis c'est potentiellement si dans l'attribut descfield l'utilisateur met plusieurs champs je concatène les valeurs de ces champs, c'est peut être pas pertinent ya des choses à améliorer. Du coup je pense que ça doit pouvoir se mettre dans le criteria. Je prend note donc et j'essaierais d'inclure si possible directement dans la requête, sinon bah on le fera à la main avec un comparator dans le tree ou un truc dans le style. -- Manoël
Le 29/06/2011 21:57, Manoël a écrit :
si dans l'attribut descfield l'utilisateur met plusieurs champs je concatène les valeurs de ces champs
L'autre solution serait de mettre dans descfield "WikittyPersonne.__monlabel" (ta propre propriété créée pour l'occasion) et après, je peux créer la méthode getMonLabel() dans la business entity Personne où je peux faire ce que je veux pour générer la chaîne à afficher parce que la concaténation peut ne peut suffire, il peut falloir des boucles, de l'i18n, des choses comme ça : Personne#getMonLabel() { StringBuilder builder = ... builder.append(getNom()) .append(StringUtil.join(getPrenoms, " ")) .append("(").append.(_(getPoste())).append(")"); } Pour former une chaîne genre Gros Robert Paul (Président). -- Brendan Le Ny <bleny@codelutin.com> Code Lutin Conseil & Développement Logiciel Libre +33 (0)2 40 50 29 28 http://codelutin.com
Le 29/06/2011 18:29, Manoël Fortun a écrit :
<ws:wikitty wikitty="lewikitty" proxy="leproxy" action="edit.action"> <ws:hidden name="WikittyLabel.labels" /> <ws:wikittyselect name="WikittyPersonne.epoux" label="epoux" criteria="WikittyPersonne" descfield="WikittyPersonne.name"/> </ws:wikitty> As-tu vraiment besoin de donner le proxy à la tablib ? Car tu dit plus haut que l'action (edit.action ?) doit implémenter un méthode qui fournit le proxy ?
L'exemple n'est pas très parlant car le wikitty edité à l'air d'être une personne et le select est aussi une personne, j'ai mit du temps a voir le lien. Je mettrais plutôt "fieldname" (voire fqFieldName et/ou fieldName) car "name" pour porter confusion avec les champs de formulaire soumis. Tu a un exemple plus compliqué que "criteria="WikittyPersonne" " ? Ca n'a pas l'air d'être un vrai criteria dans ce cas, mais seulement une extension ? -- Éric Chatellier <chatellier@codelutin.com> Tel: 02.40.50.29.28 http://www.codelutin.com
On Thu, 30 Jun 2011 09:55:23 +0200 Eric Chatellier <chatellier@codelutin.com> wrote:
Tu a un exemple plus compliqué que "criteria="WikittyPersonne" " ? Ca n'a pas l'air d'être un vrai criteria dans ce cas, mais seulement une extension ?
Je pense que criteria, devrait être un vrai objet criteria (qui pourrait etre construit dans l'action), pour éviter une chaîne de recherche sans compilation dans la JSP. Et surtout pour l'instant on a pas encore de parsing de requete dans wikitty :) -- Benjamin POUSSIN -------------------- tél: +33 (0) 2 40 50 29 28 email: poussin@codelutin.com http://www.codelutin.com
** Le 30/06/2011 09:55, Eric Chatellier a écrit : Le 29/06/2011 18:29, Manoël Fortun a écrit : <ws:wikitty wikitty="lewikitty" proxy="leproxy" action="edit.action"> <ws:hidden name="WikittyLabel.labels" /> <ws:wikittyselect name="WikittyPersonne.epoux" label="epoux" criteria="WikittyPersonne" descfield="WikittyPersonne.name"/> </ws:wikitty> As-tu vraiment besoin de donner le proxy à la tablib ? Car tu dit plus haut que l'action (edit.action ?) doit implémenter un méthode qui fournit le proxy ? Oui mais les classes qui s'occupent des tag eux n'ont pas connaissance de la classe qui s'occupe qui implémente la méthode. L'action dans le tag wikitty c'est l'url de l'action struts pas la classe. Et on à besoin du proxy pour les criteria et possiblement d'autre chose auquel pour le moment on aurait pas pensé. Je mettrais plutôt "fieldname" (voire fqFieldName et/ou fieldName) car "name" pour porter confusion avec les champs de formulaire soumis. oui effectivement, ça sera plus clair. Tu a un exemple plus compliqué que "criteria="WikittyPersonne" " ? Ca n'a pas l'air d'être un vrai criteria dans ce cas, mais seulement une extension ? Là en fait comme le dit Benjamin ça sera pas plus mal si c'est un vrai criteria que l'on passe, ça sera plus simple?
participants (5)
-
Benjamin POUSSIN -
Brendan Le Ny -
Eric Chatellier -
Manoël -
Manoël Fortun