Nom de champs identiques entre formulaire et sous-formulaire

Ce post permet de discuter / proposer des solutions pour gérer la problématique suivante.

Ce point est lié à un ticket adullact :
https://adullact.net/tracker/index.php?func=detail&aid=7214&group_id=265&atid=1999

Lorsqu’un formulaire principal (FP) contient un champ nommé “libelle” ainsi qu’un sous formulaire (FS) contenant lui-même un champ “libelle”, cela pose plusieurs problèmes :

  • pas w3c compliant,
  • lors de l’exécution de javascript sur le sélecteur (id) du champ, en effet l’id du champ est le nom de la colonne correspondante dans la bdd.

Une des solutions pourrait être d’utiliser des conventions lors de la création de la base:

la table MATABLE :

  • a une clé primaire numérique “matable” (pour bénéficier du générateur au maxi)
  • a des champs préfixés par un acronyme rappelant la table “mat_libelle”, “mat_code”, …

Cela permet aussi:

  • une traduction plus fine (mais plus longue) des champs _(“ma1_libelle”) => “libellé de matable1” …
  • de ne pas devoir rappeler la table lors des jointures SQL: " JOIN ON ma1_libelle=ma2_libelle"

Autant il y a du sens à ce que la clé primaire porte le nom de la table, autant nous n’avons pas le besoin de préfixer toutes les autres colonnes. Je ne connais aucune bonne pratique qui fait ceci. Certes il y aurait des avantages. Mais, pour faire un parallèle, la solution aux erreurs SQL sur l’ambiguïté des noms de colonne est d’appeler la table et non de renommer la colonne.

Dans notre cas c’est le DOM qui nous pose problème, et pas les traductions ni les jointures dans les requêtes SQL. La solution est donc du côté du générateur. Il devrait concaténer, pour l’ID CSS du champ uniquement, son nom et celui de la table. Cela cassera la rétrocompatibilité des tests fonctionnels mais conservera la validation du formulaire. Par contre ça ne résoudra pas le problème si en formulaire et sous-formulaire (ou dialogue modal) on a le même objet. La encore on peut éventuellement préfixer par le contexte.

Ce qui donnerait par exemple :

  • f_entreprise_nom
  • sf_courrier_destinataire

Bien que plus ambitieuse, je suis tout à fait d’accord avec cette dernière proposition.