Discussion:
Utiliser un formulaire en mode consultation uniquement
(trop ancien pour répondre)
Alain BARTHE
2010-05-04 09:35:36 UTC
Permalink
Bonjour,

J'aimerais savoir s'il existe un moyen simple pour utiliser un
formulaire HTML en mode consultation.

Dans le détail :
- j'ai décrit dans un fichier JSON (peut-être plus tard YAML) les
caractéristiques des champs des tables de ma base SQL
- pour chaque champ d'une base, je spécifie un label à afficher, le type
de champ (TEXT, TEXTAREA, RADIO, CHECKBOX, ...), quelques attributs
(SIZE, NAME,...)
- à partir de ce fichier descriptif, je génère un formulaire HTML
classique <FORM> ... </FORM>, contenant des rubriques <INPUT>,
<TEXTAREA>,...

Ca fonctionne correctement, mais on me demande maintenant d'ajouter une
rubrique permettant d'afficher uniquement les données, sans pouvoir les
modifier.

J'aurais aimé réutiliser le plus possible le code qui génère le
formulaire de saisie, pour générer un "formulaire d'affichage".

Y a-t-il moyen de modifier au minimum un formulaire pour qu'il ne soit
pas possible de modifier les champs, mais juste de les afficher ?

Merci d'avance.
Mickael Wolff
2010-05-04 22:01:49 UTC
Permalink
Post by Alain BARTHE
Y a-t-il moyen de modifier au minimum un formulaire pour qu'il ne soit
pas possible de modifier les champs, mais juste de les afficher ?
Regarde du côté des attributs readonly et disabled. Et attention aux
gotcha !

Ceci dit, désactiver les contrôles n'empêchera pas (dans l'absolu) la
soumission ou la modification des champs. Il faudra s'assurer que, côté
serveur, le traitement soit approprié.
--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Alain BARTHE
2010-05-05 08:50:30 UTC
Permalink
Post by Mickael Wolff
Post by Alain BARTHE
Y a-t-il moyen de modifier au minimum un formulaire pour qu'il ne soit
pas possible de modifier les champs, mais juste de les afficher ?
Regarde du côté des attributs readonly et disabled. Et attention aux
gotcha !
Merci, je vais regarder ces atttributs, qui a priori semblent
correspondre à ce que je cherche.

Des problèmes de compatibilité (IE, Firefox, ...) sont-ils à craindre ?
Post by Mickael Wolff
Ceci dit, désactiver les contrôles n'empêchera pas (dans l'absolu) la
soumission ou la modification des champs. Il faudra s'assurer que, côté
serveur, le traitement soit approprié.
Bruno Desthuilliers
2010-05-04 22:01:49 UTC
Permalink
Post by Alain BARTHE
Bonjour,
J'aimerais savoir s'il existe un moyen simple pour utiliser un
formulaire HTML en mode consultation.
(snip)
Post by Alain BARTHE
Ca fonctionne correctement, mais on me demande maintenant d'ajouter une
rubrique permettant d'afficher uniquement les données, sans pouvoir les
modifier.
J'aurais aimé réutiliser le plus possible le code qui génère le
formulaire de saisie, pour générer un "formulaire d'affichage".
Y a-t-il moyen de modifier au minimum un formulaire pour qu'il ne soit
pas possible de modifier les champs, mais juste de les afficher ?
http://www.w3.org/TR/html401/interact/forms.html#adef-disabled

Attention, un script peut modifier la valeur de cet attribut, donc
prévoir éventuellement en plus:

1/ de ne pas afficher DU TOUT les submits
2/ de position l'action du form sur une url spécifique ne permettant pas
la modification
3/ toute autre forme de "ceinture&bretelle" qui te semble pertinente
dans le cadre de ton appli !-)

HTH
Alain BARTHE
2010-05-05 08:50:30 UTC
Permalink
Post by Bruno Desthuilliers
Post by Alain BARTHE
Bonjour,
J'aimerais savoir s'il existe un moyen simple pour utiliser un
formulaire HTML en mode consultation.
(snip)
Tu as l'air désolé. Ce n'est pas joli, joli ?

Désolé, on m'a demandé ça hier, et je cherche à réutiliser au maximum ce
que j'ai déjà, si possible.

Sinon, je pense que je devrais régénérer un tableau, mais il faudra
prendre en compte les textarea, les radio, les checkbox, etc...
Ce sera plus lourd que juste "désactiver" un formulaire.
Post by Bruno Desthuilliers
Post by Alain BARTHE
Ca fonctionne correctement, mais on me demande maintenant d'ajouter
une rubrique permettant d'afficher uniquement les données, sans
pouvoir les modifier.
J'aurais aimé réutiliser le plus possible le code qui génère le
formulaire de saisie, pour générer un "formulaire d'affichage".
Y a-t-il moyen de modifier au minimum un formulaire pour qu'il ne soit
pas possible de modifier les champs, mais juste de les afficher ?
http://www.w3.org/TR/html401/interact/forms.html#adef-disabled
Merci, je dois pouvoir y trouver réponse à ma question, et à d'autres
que je ne manquerai pas de me poser plus tard.
Post by Bruno Desthuilliers
Attention, un script peut modifier la valeur de cet attribut, donc
1/ de ne pas afficher DU TOUT les submits
2/ de position l'action du form sur une url spécifique ne permettant pas
la modification
3/ toute autre forme de "ceinture&bretelle" qui te semble pertinente
dans le cadre de ton appli !-)
HTH
Bruno Desthuilliers
2010-05-05 12:26:45 UTC
Permalink
Post by Alain BARTHE
Post by Bruno Desthuilliers
Post by Alain BARTHE
Bonjour,
J'aimerais savoir s'il existe un moyen simple pour utiliser un
formulaire HTML en mode consultation.
(snip)
Tu as l'air désolé.
??? Où ça ?
Post by Alain BARTHE
Ce n'est pas joli, joli ?
"Pas idéal" éventuellement, mais je comprend d'autant mieux le besoin
(et le contexte) que j'y ai déjà été confronté, et il n'y a rien qui me
choque là-dedans.
Post by Alain BARTHE
Sinon, je pense que je devrais régénérer un tableau, mais il faudra
prendre en compte les textarea, les radio, les checkbox, etc...
Ce sera plus lourd que juste "désactiver" un formulaire.
Tout à fait.
Alain BARTHE
2010-05-05 14:32:24 UTC
Permalink
Post by Bruno Desthuilliers
Post by Alain BARTHE
Post by Bruno Desthuilliers
Post by Alain BARTHE
Bonjour,
J'aimerais savoir s'il existe un moyen simple pour utiliser un
formulaire HTML en mode consultation.
(snip)
Tu as l'air désolé.
??? Où ça ?
C'est moi qui ait mal compris le <snip>....

Je suis vraiment trop nul en Anglais.
Christophe Meresse
2010-05-04 22:01:49 UTC
Permalink
Post by Alain BARTHE
Y a-t-il moyen de modifier au minimum un formulaire pour qu'il ne soit
pas possible de modifier les champs, mais juste de les afficher ?
Utiliser les attributs "disabled"

Par exemple: <input type="text" name="thetext" disabled="disabled" />

Par exemple dans le code php en utilisant une variable
$mustbedisabled:
echo '<input type="text" name="thetext" '.
($mustbedisabled?'disabled="disabled" ':'').'/>';

(pas testé, il peut y avoir eventuellement des problèmes à regler au
niveau des simples/doubles quotes)

Christophe
Alain BARTHE
2010-05-05 08:50:30 UTC
Permalink
Post by Christophe Meresse
Post by Alain BARTHE
Y a-t-il moyen de modifier au minimum un formulaire pour qu'il ne soit
pas possible de modifier les champs, mais juste de les afficher ?
Utiliser les attributs "disabled"
Par exemple: <input type="text" name="thetext" disabled="disabled" />
Par exemple dans le code php en utilisant une variable
echo '<input type="text" name="thetext" '.
($mustbedisabled?'disabled="disabled" ':'').'/>';
(pas testé, il peut y avoir eventuellement des problèmes à regler au
niveau des simples/doubles quotes)
Christophe
Merci, je vais regarder ça de plus près.
Lecoeur Thierry
2010-05-04 22:13:54 UTC
Permalink
Post by Alain BARTHE
Bonjour,
J'aimerais savoir s'il existe un moyen simple pour utiliser un formulaire
HTML en mode consultation.
- j'ai d�crit dans un fichier JSON (peut-�tre plus tard YAML) les
caract�ristiques des champs des tables de ma base SQL
- pour chaque champ d'une base, je sp�cifie un label � afficher, le type
de champ (TEXT, TEXTAREA, RADIO, CHECKBOX, ...), quelques attributs (SIZE,
NAME,...)
- � partir de ce fichier descriptif, je g�n�re un formulaire HTML
classique <FORM> ... </FORM>, contenant des rubriques <INPUT>,
<TEXTAREA>,...
Ca fonctionne correctement, mais on me demande maintenant d'ajouter une
rubrique permettant d'afficher uniquement les donn�es, sans pouvoir les
modifier.
J'aurais aim� r�utiliser le plus possible le code qui g�n�re le formulaire
de saisie, pour g�n�rer un "formulaire d'affichage".
Y a-t-il moyen de modifier au minimum un formulaire pour qu'il ne soit pas
possible de modifier les champs, mais juste de les afficher ?
Merci d'avance.
Bonsoir,

il existe un attribut lecture seul (readonly)
je te conseille de regarder ce site:
http://fr.selfhtml.org/html/formulaires/entree.htm

Cordialement
Thierry
Alain BARTHE
2010-05-05 12:26:45 UTC
Permalink
Post by Lecoeur Thierry
il existe un attribut lecture seul (readonly)
http://fr.selfhtml.org/html/formulaires/entree.htm
Cordialement
Thierry
Merci, je vais y jeter un coup d'oeil.
Alain BARTHE
2010-05-05 12:26:45 UTC
Permalink
Merci à tous les quatre.

J'ai testé les attributs readonly et disabled, ils fonctionnent
parfaitement.
- readonly : on peut cliquer sur les zones mais pas les modifier
- disabled : on ne peut même pas cliquer sur la zone (je préfère)

J'ai pu modifier mon générateur de formulaire en ajoutant juste :

if ($mode == "consultation")
$field ["attr"]["disabled"] = "disabled";

J'aurais surement 2/3 truc à modifier encore (inhiber enregistrement et
suppression, mais c'est rien à faire).

On ne peut pas faire plus simple.
Merci encore.
Alain BARTHE
2010-05-05 22:52:08 UTC
Permalink
Post by Alain BARTHE
Merci à tous les quatre.
J'ai testé les attributs readonly et disabled, ils fonctionnent
parfaitement.
- readonly : on peut cliquer sur les zones mais pas les modifier
- disabled : on ne peut même pas cliquer sur la zone (je préfère)
if ($mode == "consultation")
$field ["attr"]["disabled"] = "disabled";
Dernier souci, les attributs "disabled" font que je champs ne sont pas
envoyés dans le POST.

Confert la doc cité par Bruno dans un mail précédent :
http://www.w3.org/TR/html401/interact/forms.html#adef-disabled

C'est dommage, car leur comportement m'allait tellement bien dans le
formlaire de consultation, que j'en avais mis dans certains champs du
formulaire classique (notamment les ID (cles) de mes tables pour
empécher leut modification).

Manque de pot, quand je veux re-enregistrer un fiche apres modification,
la variable $_POST["id"] n'est pas transmise, ce qu'il fait qu'il me
rajoute une deuxième fiche, avec un ID auto-incrementé

Le même problème ne se pose pas avec l'attribut "readonly", mais leur
comportement coorespond moins à ce que je voulais.

Si vous connaissez une solution, tant mieux, sinon je reviendrai en
arrière dans mon formulaire classique.

Merci encore pour votre aide à tous.
Bruno Desthuilliers
2010-05-06 08:08:47 UTC
Permalink
Post by Alain BARTHE
Post by Alain BARTHE
Merci à tous les quatre.
J'ai testé les attributs readonly et disabled, ils fonctionnent
parfaitement.
- readonly : on peut cliquer sur les zones mais pas les modifier
- disabled : on ne peut même pas cliquer sur la zone (je préfère)
if ($mode == "consultation")
$field ["attr"]["disabled"] = "disabled";
Dernier souci, les attributs "disabled" font que je champs ne sont pas
envoyés dans le POST.
http://www.w3.org/TR/html401/interact/forms.html#adef-disabled
C'est dommage, car leur comportement m'allait tellement bien dans le
formlaire de consultation, que j'en avais mis dans certains champs du
formulaire classique (notamment les ID (cles) de mes tables pour
empécher leut modification).
Manque de pot, quand je veux re-enregistrer un fiche apres modification,
la variable $_POST["id"] n'est pas transmise, ce qu'il fait qu'il me
rajoute une deuxième fiche, avec un ID auto-incrementé
<input type="hidden" name="id" value="<?php echo $id; ?>" />

Si tu veux vraiment afficher l'id, tu peux le mettre dans un champ texte
disabled, avec un autre nom.
Alain BARTHE
2010-05-06 12:17:36 UTC
Permalink
Post by Bruno Desthuilliers
<input type="hidden" name="id" value="<?php echo $id; ?>" />
Si tu veux vraiment afficher l'id, tu peux le mettre dans un champ texte
disabled, avec un autre nom.
C'est exactement ce que je faisais auparavant, mais j'avais trouvé que
l'attribut disabled était très pratique.

Il suffisait de le rajouter pour afficher les valeurs des champs non
modifiables, tout en bloquant la saisie, et même le focus pour les
utilisateurs.

Seul problème, ils ne sont pas transmis au POST quand je veux
enregistrer la fiche. Dommage...

L'attribut readonly fait que les valeurs sont transmises, mais
l'utilisateur peut cliquer sur la zone de saisie.

Seule la saisie est interdite. Avec les dégourdis que j'ai, ils vont
croire que leur clavier est en panne!!!

Bref, je pinaille... Je vais repartir sur ma solution initiale et clore
le sujet.

Merci encore.
Mickael Wolff
2010-05-06 08:08:47 UTC
Permalink
Post by Alain BARTHE
Dernier souci, les attributs "disabled" font que je champs ne sont pas
envoyés dans le POST.
En quoi c'est un soucis ? C'était bien le résultat attendu.
Post by Alain BARTHE
C'est dommage, car leur comportement m'allait tellement bien dans le
formlaire de consultation, que j'en avais mis dans certains champs du
formulaire classique (notamment les ID (cles) de mes tables pour
empécher leut modification).
Comme je l'avais précisé dans ma réponse, c'est du cosmétique. Le
contrôle de l'ajout ou de la modification *doit* se faire du côté du
serveur.
Post by Alain BARTHE
Manque de pot, quand je veux re-enregistrer un fiche apres modification,
la variable $_POST["id"] n'est pas transmise, ce qu'il fait qu'il me
rajoute une deuxième fiche, avec un ID auto-incrementé
Tu as un problème de design. Si les utilisateurs peuvent soumettre
des données alors qu'ils ne l'ont pas requis, que des données s'ajoutent
alors qu'elles existent déjà en base, c'est qu'il y a un problème.

Une première solution consiste à introduire un champ caché nommé «
action » par exemple, et auquel tu affecte la valeur 'edit' ou 'view'
selon le contexte. Ensuite tu peux améliorer le système en utilisant la
technique dites des « token », qui associe à un formulaire un
identifiant unique. Cette technique permet d'associer un contexte à la
transaction.

Ceci dit, ça ne résout pas le problème de gestion des droits.
--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Alain BARTHE
2010-05-06 10:17:10 UTC
Permalink
Post by Mickael Wolff
Post by Alain BARTHE
Dernier souci, les attributs "disabled" font que je champs ne sont pas
envoyés dans le POST.
En quoi c'est un soucis ? C'était bien le résultat attendu.
Je voulais me servir de cet attribut pour afficher les valeurs dans ces
champs, sans que l'utilisateur puisse sélectionner la zone ni la
modifier, mais que ces valeurs soient transmises au POST quand je
reenregistre ma fiche après modification.

Apparemment, cet attribut n'est pas prévu pour ça, ce serait plutôt le
readonly que je devrais utiliser, mais il donne le focus sur la zone de
saisie, tout en interdisant de la modifier.

Ca me dérange un peu, mais je pinaille.
Post by Mickael Wolff
Post by Alain BARTHE
C'est dommage, car leur comportement m'allait tellement bien dans le
formlaire de consultation, que j'en avais mis dans certains champs du
formulaire classique (notamment les ID (cles) de mes tables pour
empécher leut modification).
Comme je l'avais précisé dans ma réponse, c'est du cosmétique. Le
contrôle de l'ajout ou de la modification *doit* se faire du côté du
serveur.
C'est bien ce que je fais : quand je crée une nouvelle fiche,
j'initialise le champ ID du formulaire à NULL ou -1, sinon en
modification, j'ai la valeur de l'ID > 0.

J'affichais auparavant cette valeur avec quelque chose comme :
echo "<input name='id' type='hidden'>$ID</input>

J'ai voulu le remplacer par :
echo "<input name='id' type='text' value=$ID disabled></input>"

Ca fonctionne correctement pour l'affichage, mais n'est pas envoyé dans
le POST (avec readonly si, mais c'est moins joli)

Bref, je vais repartir sur ma solution initiale: dommange..
Post by Mickael Wolff
Post by Alain BARTHE
Manque de pot, quand je veux re-enregistrer un fiche apres modification,
la variable $_POST["id"] n'est pas transmise, ce qu'il fait qu'il me
rajoute une deuxième fiche, avec un ID auto-incrementé
Tu as un problème de design. Si les utilisateurs peuvent soumettre des
données alors qu'ils ne l'ont pas requis, que des données s'ajoutent
alors qu'elles existent déjà en base, c'est qu'il y a un problème.
Une première solution consiste à introduire un champ caché nommé «
action » par exemple, et auquel tu affecte la valeur 'edit' ou 'view'
selon le contexte. Ensuite tu peux améliorer le système en utilisant la
technique dites des « token », qui associe à un formulaire un
identifiant unique. Cette technique permet d'associer un contexte à la
transaction.
Je vais jeter un coup d'oeil de ce coté là.
Post by Mickael Wolff
Ceci dit, ça ne résout pas le problème de gestion des droits.
Je pense régler ça avec des autorisations Apache (dans .htaccess
probablement), avec des autorisations différentes pour les scripts de
consultation et de modification (qui utilisent tous deux le même
formulaire).

En consultation, je n'ai pas de problème : je mets tous les champs avec
l'attribut disabled et je n'ai pas de problème de POST puisque je
n'enregistre rien.

Merci encore pour vos conseils.
Mickael Wolff
2010-05-06 16:34:03 UTC
Permalink
Post by Alain BARTHE
C'est bien ce que je fais : quand je crée une nouvelle fiche,
j'initialise le champ ID du formulaire à NULL ou -1, sinon en
modification, j'ai la valeur de l'ID > 0.
C'est moche. Je sais que ça se fait beaucoup, mais pour le déboguage,
ça risque de te pénaliser. C'est le problème des astuces, au début on se
dit que c'est super intelligent. Et finalement, ben c'est pas génial.
Post by Alain BARTHE
Je pense régler ça avec des autorisations Apache (dans .htaccess
probablement), avec des autorisations différentes pour les scripts de
consultation et de modification (qui utilisent tous deux le même
formulaire).
Non /o\
Le .htaccess ne suffira pas. Fais une recherche Google à propos de
CSRF et de la technique des tokens.
--
Mickaël Wolff aka Lupus Michaelis
http://lupusmic.org
Alain BARTHE
2010-05-06 17:19:43 UTC
Permalink
Post by Mickael Wolff
Post by Alain BARTHE
Je pense régler ça avec des autorisations Apache (dans .htaccess
probablement), avec des autorisations différentes pour les scripts de
consultation et de modification (qui utilisent tous deux le même
formulaire).
Non /o\
Le .htaccess ne suffira pas. Fais une recherche Google à propos de
CSRF et de la technique des tokens.
Je débute en PHP comme en MySQL et c'est vrai que je ne me suis pas trop
penché sur la sécurité.

Dans ce cas, ce n'est pas une application critique : juste une appli en
intranet utilisée par 2/3 personnes, qui me permet de me faire la main
pour plus tard.

J'avais commencé à lire un papier sur la sécurisation des données des
formulaires, pour éviter les attaques par injection de code. Intéressant...

Il faudra que j'intègre ces techniques, petit à petit.
Ca fait beaucoup de trucs à assimiler dans un premier temps.

Je suis d'accord avec toi pour dire que ça devient indispensable.

Merci beaucoup pour tous ces conseil (et votre patience!!!)
John GALLET
2010-05-08 13:24:22 UTC
Permalink
Bonjour,
Post by Alain BARTHE
Manque de pot, quand je veux re-enregistrer un fiche apres modification,
la variable $_POST["id"] n'est pas transmise, ce qu'il fait qu'il me
rajoute une deuxième fiche, avec un ID auto-incrementé
Donc on a un problème d'absence clef unique/primaire correcte, ce sera
la même chose avec un refresh...

Pour ce point là, on peut le faire passer en hidden, mais attention aux
problèmes de droit d'accès (si l'utilisateur X n'a pas le droit de
modifier l'identifiant 1234, il lui suffit d'éditer le html et de mettre
ce qu'il veut dedans, il faut revérifier c$oté serveur).
Post by Alain BARTHE
Si vous connaissez une solution,
Ton besoin est vraiment ici de NE PAS faire transiter les données, pas
de les faire transiter en espérant qu'on ne les modifiera pas (ce qui
n'empêche en rien de les afficher dans des formulaires en readonly, par
exemple pour faire une interface de traduction, on aime bien pouvoir
copier-coller le texte d'origine pour le traduire).

C'est *exactement* à ça que servent les *sessions*: conserver les
données côté *serveur*.

a++;
JGA

Continuer la lecture sur narkive:
Loading...