Saisies

Introduction

Créer un formulaire est une tâche toujours un peu répétitive : les champs ont souvent les mêmes propriétés, le même accompagnement (message d’erreur, explication, ...) et la même structure HTML. Ce plugin est un outil pour les développeur⋅euses ayant pour but de faciliter et d’accélérer l’écriture des formulaires.

Pour cela, Saisies propose plusieurs mécanismes (balises, API PHP) pour générer et manipuler plus facilement les champs des formulaires. De cette manière, les squelettes de formulaires sont :

  • plus lisibles : il n’y a que le strict nécessaire dedans, pas de répétition ;
  • intégrés au fonctionnement CVT de SPIP, notamment pour la gestion des erreurs sur les champs ;
  • automatiquement compatibles avec les recommandations HTML/CSS de SPIP.

La balise #SAISIE

Cette balise permet de générer une seule saisie en lui donnant directement les paramètres désirés. Chaque saisie va générer une ligne dans un formulaire, c’est-à-dire soit :

La balise a deux arguments obligatoires : le type du champ, et son nom HTML (attribut “name”). Toutes les autres options sont facultatives et servent à configurer le champ ; de ce fait, elles sont de la formes option=valeur.

La forme complète est donc la suivante :
#SAISIE{type, name, option=valeur, option2=valeur2, etc=etc}

Voici quelques exemples d’utilisation, pour comprendre l’approche.

Génère un simple champ texte, indiqué comme étant obligatoire :
#SAISIE{input, email, label=Votre courriel, obligatoire=oui}
 
Génère un choix multiple parmi les utilisateurs du SPIP :
#SAISIE{auteurs, destinataires,
    label=Destinataires du message,
    explication=Choisissez une ou plusieurs personnes à qui sera envoyé le message.,
    multiple=oui}

Comme vous le voyez, des champs qui peuvent être complexes, et fastidieux à écrire de manière complète, s’écrivent ici en quelques lignes.

Consultez également :

-  La référence des options de chaque saisie

-  Un complément de doc avancée sur les saisies

Multilinguisme

#SAISIE supporte le multilinguisme. Dans ce cas, attention de bien utiliser la syntaxe complète avec les crochets :

  • #SAISIE{input, annee, label=<:monplugin:annee:>,obligatoire=oui} ne fonctionne pas ;
  • [(#SAISIE{input, annee, label=<:monplugin:annee:>,obligatoire=oui})] fonctionne.

Afficher les erreurs

Saisie gère nativement l’affichage des erreurs.

Si la fonction CVT verifier() retourne une erreur du même nom celle ci sera affichée entre le label et le champ.

  • Pour la saisie [(#SAISIE{input, annee, label=<:monplugin:annee:>})]
  • si verifier() retourne : $erreurs['annee'] = "Une erreur"
  • alors <span class="erreur_message">Une erreur</span> sera affichée juste avant l’input.

Enregistrer des tableaux

La norme HTML permet de gérer des réponses de formulaire sous la forme de tableau. Il est recommandé d’utiliser alors le formalisme suivant : tableau/variable.

[(#SAISIE{input, annee/debut, label=<:monplugin:annee:>})]

Permettra de récupérer en PHP

_request('annee');
// array('debut' => 'valeur')

La forme HTML classique [(#SAISIE{input, annee\[debut\], label=<:monplugin:annee:>})] fonctionne aussi.


Attention, pour utiliser tout ce qui suit, vous devez installer aussi le plugin YAML.


Déclarer un formulaire CVT complet en PHP

Saisies augmente l’API CVT de SPIP avec une fonction …_saisies() afin de déclarer l’ensemble des champs d’un formulaire et leur vérification dans une unique syntaxe.

Grace à ce mécanisme, pour les cas les plus courants, les fonctions charger() et verifier() deviennent facultatives. Saisies s’occupera de tout suivant votre déclaration. Seule la fonction traiter() restera toujours de votre ressort.

De même, par défaut, vous n’avez plus à vous occuper du squelette. Il doit toujours être présent, avec le même nom que votre fichier PHP dans le dossier formulaires/, mais vous pouvez le laisser totalement vide. Saisies s’occupera de générer le bon HTML complet.

Dans le PHP, au côté des autres fonctions, vous devez alors déclarer les saisies :

formulaires_monformulaire_saisies_dist() {
    $saisies = array();
 
    return $saisies;
}

Cette fonction doit retourner un tableau PHP contenant la liste de toutes vos saisies suivant un formalisme attendu.

Le tableau doit respecter les points suivant :

  • Chaque ligne du tableau d’ensemble est une saisie, elle-même étant décrite dans un tableau. L’ordre des éléments sera l’ordre des saisies.
    $saisies = array(
    	array(), // une saisie
    	array(), // une saisie
    	array(), // une saisie
    );
  • Chaque saisie individuelle est un tableau de la forme :
    array(
    	'saisie' => 'input',
    	'options' => array(
    		'nom' => 'nom',
    		'label' => 'Votre nom',
    		'size' => 50
    	),
    );
  • Les saisies qui acceptent des enfants (comme les fieldsets) les placent dans une clé “saisies” qui contiendra un tableau ayant la même structure que le tableau global :
    $un_fieldset = array(
    	'saisie' => 'fieldset',
    	'options' => array(
    		'nom' => 'mon_groupe',
    		'label' => 'Mon groupe de champ'
    	),
    	'saisies' => array(
    		array(), // une autre saisie
    		array(), // une autre saisie
    		array(), // etc
    	)
    );

Appliquer une vérification

Pour des vérifications simples et uniques, avec le plugin API de Vérification vous pouvez en plus déclarer une vérification à appliquer sur chacune de vos saisies.

Il faut alors ajouter une clé “verifier” selon ce formalisme :

array(
	'saisie' => 'input',
	'options' => array(
		'nom' => 'nom',
		'label' => 'Un nombre entre 100 et 500',
		'obligatoire' => 'oui',
	),
	'verifier' => array(
		'type' => 'entier',
		'options' => array(
			'min' => 100,
			'max' => 500
		),
	),
);

Options globales

Il est possible aussi de déclarer quelques options d’affichage qui sont globales à l’ensemble du formulaire. Elles sont alors placées dans une clé “options” à la racine du tableau.

$saisies = array(
	'options' => array(
		// Changer l'intitulé du bouton final de validation
		'texte_submit' => 'Valider c’est gagné',
 
		// Transformer votre formulaire en multi-étapes
		// Chaque fieldset racine sera reconnu comme étant une étape !
		'etapes_activer' => true,
 
		// Changer l'intitulé du bouton suivant
		'etapes_suivant' => 'Suivantissime',
 
		// Changer l'intitulé du bouton précédent
		'etapes_precedent' => 'Previously on Lost',
	),
	array(), // une saisie
	array(), // une saisie
	array(), // une saisie
);

La balise #GENERER_SAISIES

Dans la plupart des cas vous n’avez pas à l’utiliser vous-même. Il se peut cependant que vous désiriez gérer malgré tout le squelette de votre formulaire.

Cette balise permet de générer toutes les saisies d’un formulaire, en une seule fois. Pour cela on lui passe en paramètre le tableau de description.

Exemple d’utilisation :

<div>
	#GENERER_SAISIES{#ENV{_saisies}}
</div>

On notera l’emploi d’un _ en préfixe de la variable d’environnement. Cela permet que les guillemets présents dans les options ne soient pas transformés en entités HTML [1].

La balise #VOIR_SAISIES

Cette balise permet d’afficher toutes les valeurs saisies après validation d’un formulaire. On lui passe en paramètre deux arguments :

  1. le tableau de description des saisies (au même format que pour #GENERER_SAISIES)
  2. un tableau des valeurs saisies

Exemple d’utilisation, dans le squelette d’un formulaire :

[(#EDITABLE|non)
	#VOIR_SAISIES{#ENV{mes_saisies}, #ENV}
]

Problème avec Xdebug

Si vous êtes développeur et que vous utilisez le logiciel Xdebug, il existe un problème connu : par défaut celui-ci affiche une erreur à partir d’un certain niveau d’imbrication de fonctions PHP (“nesting level” dirait Shakespeare).

Le niveau d’imbrication autorisé par défaut est relativement bas, mais on peut le modifier avec une variable. Vous devez donc ajouter cela dans votre configuration PHP/Xdebug :

[xdebug]
xdebug.max_nesting_level = 200 ou 500 ou plus…

Et hop, ça remarche.

updated on 5 April 2020

Discussion

147 discussions

  • 5
    Michel du lac de Créteil

    ATTENTION ! => Le plugin SAISIES n’est pas encore actualisé en AUTO ce qui désactive le plugin FORMIDABLE ! Ce qui est gênant, car nous attendons des inscriptions à un événement par un formulaire créé avec FORMIDABLE.
    ——
    MESSAGE :
    Erreurs survenues
    Impossible d’activer le plugin ../plugins/auto/formidable/v4.1.1
    Nécessite le plugin SAISIES en version ≥ 3.34.0.

    Reply to this message

  • Michel du lac de Créteil

    C’est OK maintenant !
    Merci !
    Michel

    Reply to this message

  • 11

    Depuis la dernière maj de SAISIES, le plugin BIG UPLOAD ne fonctionne plus : l’image ou le doc ne s’uploade jamais.
    Je suis donc revenu sur une version antérieure du plugin SAISIES en attendant.

    • Quelle màj ? En passant de quelle version à quelle version ?

    • En version 3.31.3 de SAISIES ça fonctionne. Sur /ecrire/?exec=admin_plugin j’ai un message

      Saisies pour formulaires 3.31.3 - stable
      version obsolète

      Dès que je passe SAISIES en version 3.31.4, BIG UPLOAD ne fonctionne plus.

      Je suis en SPIP 3.2.7 [24473] et tous mes plugins sont à jour, sauf SAISIES.

      BIG UPLOAD est en version 1.0.4.

    • Alors la seule modif entre ces deux versions précises ne concerne que le constructeur de formulaires, et absolument aucune saisie :
      https://zone.spip.net/trac/spip-zone/changeset/120902

      Donc je vois pas comment ça pourrait avoir un quelconque changement sur Bigup n’importe où ailleurs, ça ne modifie strictement rien nulle part de chez nulle part. Donc ça peut pas être ça.

    • Vu la fréquence des maj du plugin SAISIES, il est possible que je sois passé d’une maj précédente à 3.31.3 vers 3.31.4

      Dans mon infrastructure, les seuls plugins dont l’un ne fonctionne pas quand les 2 sont actifs sont BIG UPLOAD est SAISIES. BIG UPLOAD n’a pas été mis à jour depuis plusieurs semaines et d’un coup s’est mis à ne plus fonctionner

      Et BIG UPLOAD ne dispose pas d’une page sur CONTRIB, ce qui rend toute alerte compliquée

    • Par ailleurs je sais pas pourquoi tu tomberais sur 3.31.4 alors que Saisies en est à une version bien plus loin (dans la même branche 3), donc ça se trouve c’est déjà corrigé…

    • La version actuelle, la vraie dernière 3.33.1 du 22/02/2020 de SAISIES et la version1.0.4 de BIG UPLOAD ne fonctionnent pas ensemble. C’est un fait. J’utilise donc une ancienne version de SAISIES.

      Que le problème vienne de la dernière maj, de l’avant dernière ou de l’avant avant dernière, etc... ne résout pas mon problème. Quand j’aurais le temps de tester je désactiverai tout encore une fois puis je verrai.

      Quand on est pas développeur soi même, c’est vraiment la jungle pour savoir où trouver quoi entre contrib et les autres plateformes. Quant aux explications des maj, il faut s’accrocher pour décrypter et surtout comprendre les implications. C’est l’un des éléments qui à la longue usent. Pour que SPIP vive longtemps, il faut pourtant que des gens comme moi s’y retrouvent sans y perdre des jours et des nuits.

    • J’ai présentement sous les yeux plusieurs sites avec Saisies totalement à jour 3.33.1 et Bigup à jour (version de github), et il n’y a AUCUN problème, ça upload direct quand j’ajoute un document dans un article par exemple.

      C’est un fait.

      Par ailleurs je vois pas de quelles autres plateformes tu parles, il n’y en a pas 40000. Pour les users c’est Contrib la porte d’entrée pour tout ce qui est ajout, pour tous les plugins que les devs ont rendu public et distribuent.
      Si un dev a pas fait de doc, bah c’est qu’il veut pas en faire du support, je sais pas moi… Donc après c’est à utiliser en conséquence, si on utilise un plugin non documenté nulle part, c’est bien qu’on l’a trouvé quand même, donc qu’on est un “power user”, et c’est alors qu’on sait ce qu’on fait, on peut pas se plaindre d’être un pauvre “juste utilisateur” sans défense.

    • Je me permet d’intervenir, non pas sur le fond, mais sur la forme.

      J’ai l’impression qu’on ne va pas s’en sortir comme cela avec du “chez moi ca marche” / “chez moi ca marche pas”, et de “non mais les sites SPIP sont pas clair” et “si si les sites SPIP sont clair”.

      De facto, chacun à sa vision. Il y a sans doute un élément technique qui explique cette différence de vision, car je ne pense pas que Guilain ou Rastapopoulos s’amuse à dire des choses qu’ils ne voient pas.

      Donc maintenant Guilain
      1) peux tu me dire avec quelle version de saisies cela fonctionne chez toi
      2) peut tu me dire où ton formulaire bigupload ne marche pas

    • Bé si le “chez moi ça marche” sert à dire : avec cette version de Saisies et la dernière de Bigup, ça PEUT bien marcher puisque ça marche chez moi DONC ça signifie que ce n’est pas UNIQUEMENT le fait d’avoir Saisies à jour qui fait que ça merdouille chez lui. Il y a forcément autre chose.

      Et autant que possible, ce n’est pas à nous de faire 40000 tests : c’est pour ça qu’à l’origine au dessus du champ de commentaire il y avait une explication relativement claire disant qu’avant de rapporter un bug, il fallait d’abord tester sur une installation vide contenant uniquement les 1 ou 2 trucs qu’on veut tester (cette explication a été perdue avec la refonte). Ce qui permet déjà d’isoler et de savoir si c’est la conjonction avec encore un autre plugin qui fait merder.

    • Merci Maieul pour cette approche non caricaturale.

      Comme je l’avais écrit, j’ai trouvé le temps de refaire ce que j’avais déjà fait : désactiver tous les plugins, réinstaller les dernières versions des plugins incriminés, vider les caches, comme je le fais à chaque fois que ça merdouille depuis plus de 10 ans que j’utilise SPIP

      Mystère, tout refonctionne à priori pour BIG UPLOAD

    • @RastaPopoulos, je ne vais pas t’apprendre qu’il ne manque pas de plugins en version test après plusieurs années, ou de plugins qui obligent à télécharger d’autres plugins en test, et qu’il ne manque pas non plus de plugins sans documentation.

      Ce plugin BIG UPLOAD est un de ceux là : imposé à l’install d’un autre plugin. Il me semble qu’il s’agit du plugin espace privé plus large mais n’en suis pas sur.

      Et je continue à croire que SPIP conduit à un web plus vertueux grâce à ses indéniables qualités qui ne gomment hélas pas la liste de ses défauts, dont celui d’être coincé si on utilise pas un plugin non documenté ou en test.

    Reply to this message

  • 1

    (re) Bonjour

    Petit dysfonctionnement:
    quand on limite l’extension et/ou la taille des fichiers à uploader, et que cette limitation n’est pas respectée, le message indique “Vous pouvez renvoyer un nouveau fichier ou bien soumettre le formulaire tel quel...”.

    Or dans le cas où la soumission du fichier est obligatoire, on ne peut pas soumettre tel quel (j’ai un utilisateur très fâché d’avoir eu un tel message).

    Peut-être faudrait-il faire 2 messages distincts en fonction du caractère obligatoire ?

    Reply to this message

  • 2

    Bonjour à tous,

    Je voudrais savoir comment mettre en ligne un formulaire que j’ai créer depuis le plugin.
    Je peux dans une page ajouter le formulaire mais je ne le vois pas en ligne !!!
    Il y a t’il une manipulation en plus à faire ? Peut être dans l’édition de la page un champ à rajouté ?
    Merci

    • J’imagine que tu parle du plugin formidable.

      Tu peux intégrer un formulaire (publié) sur une page en utilisant le raccourci <formulaire|formidable|id_formulaire=xxx>, ou xxx est le numero de formulaire.

      Je t’invite la prochaine fois à poster la question dans le forum du plugin formidable, pas de saisies.

    Reply to this message

  • Bonjour.

    Dans les commentaires de Formidable, j’avais posté les suggestions suivantes mais, comme je le supputais et comme Maïeul me l’a confirmé, ça relève plutôt de Saisies. Je me permets donc de le reposter ici :


    Bonjour.

    Quelqu’un me fait remarquer que, dans un champ date, le sélecteur d’années va de -60 à +40 ans (en 2019, on a donc le choix d’années entre 1959 et 2059).

    Or une telle gamme n’est pas toujours souhaitée (on pourrait ne vouloir que trois années) ni toujours adéquate (pour une date de naissance, pas besoin des années à venir, mais probablement bien de dates en deçà de 1959).

    Ne pourrait-il pas y avoir des options pour jouer sur l’étendue proposée ? On pourrait ainsi mettre de 2020 à 2022, ou de 1919 à aujourd’hui, ou d’aujourd’hui à 2042, etc.

    Peut-être que ça existe déjà, mais je n’ai alors pas trouvé…
    (Et peut-être que ça relève plus de Saisies que de Formidable…)

    Et, tant qu’à faire, ne pourrait-on pas implémenter dans Formidable le champ HTML5

    1. <input type="date" … >

    , qui a le gros avantage de proposer une ergonomie plus adaptée sur appareils mobiles ?
    (OK, il faudrait garder le système actuel en fallback pour les navigateurs qui ne le supportent pas encore, et je crains que ça coince pour Safari, où le type date est reconnu mais où aucun outil de saisie n’est présent.)

    Plus d’infos sur le type date chez Mozilla…

    Merci d’avance pour vos réponses, et bon week-end !

    1138.

    PS : dans la prévisualisation, le texte

    1. <input type="date">

    affiche réellement le champ . ;-)

    Reply to this message

  • 3

    La tentative de mise à jour de Saisies pour formulaires 3.27.7 - stable vers 3.28.0 fait péter le site avec une ribambelle de plugins en erreur.
    La 1e erreur concerne : SPIP Bonux 3.4.6 - stable (désactivé de facto)

    • met a jour aussi bonux vers 3.5.0

    • Pour info, sur le carnage....
      Gestion des plugins

      Erreurs survenues
      Impossible d’activer le plugin ../plugins/auto/saisies/v3.28.2
      Utilise le plugin SPIP_BONUX en version ≥ 3.5.0.
      Impossible d’activer le plugin ../plugins/auto/jeux/v3.4.4
      Nécessite le plugin SAISIES en version ≥ 2.28.0.
      Impossible d’activer le plugin ../plugins/auto/gis/v4.47.9
      Nécessite le plugin SAISIES en version ≥ 3.27.5.
      Impossible d’activer le plugin ../plugins/auto/gisgeom/v1.11.7
      Nécessite le plugin GIS en version ≥ 4.42.0.
      Impossible d’activer le plugin ../plugins/auto/inserer_modeles/v1.3.4
      Nécessite le plugin SAISIES en version ≥ 2.28.0.
      Impossible d’activer le plugin ../plugins/auto/contact/v0.16.5
      Utilise le plugin INSERER_MODELES en version ≥ 1.0.0.
      Impossible d’activer le plugin ../plugins/auto/odt2spip/v3.0.6
      Nécessite le plugin SAISIES en version ≥ 2.28.0.
      Impossible d’activer le plugin ../plugins/auto/agenda/v3.32.1
      Utilise le plugin FULLTEXT en version ≥ 1.0.0.
      Utilise le plugin SAISIES en version ≥ 3.27.0.
      Utilise le plugin PAGES en version ≥ 1.3.10.
      Impossible d’activer le plugin ../plugins/auto/fullcalendar_facile/v2.4.3
      Nécessite le plugin AGENDA en version ≥ 3.18.4.
      Impossible d’activer le plugin ../plugins/auto/albums/v3.5.7
      Utilise le plugin SAISIES en version ≥ 1.40.0.
      Impossible d’activer le plugin ../plugins/auto/media/v1.4.10
      Utilise le plugin INSERER_MODELES en version ≥ 1.1.11.
      Impossible d’activer le plugin ../plugins/auto/rainette/v3.6.1
      Nécessite le plugin SAISIES en version ≥ 3.12.7.
      Impossible d’activer le plugin ../plugins/auto/sarkaspip/v3.4.9
      Utilise le plugin CONTACT en version ≥ 0.9.0.
      Utilise le plugin GRAVATAR en version ≥ 1.5.0.
      Utilise le plugin NOTATION en version ≥ 2.0.4.
      Utilise le plugin PHOTO_INFOS en version ≥ 2.0.0.
      Utilise le plugin RAINETTE en version ≥ 1.5.3.
      Utilise le plugin RECOMMANDER en version ≥ 1.0.3.
      Utilise le plugin SHOUTBOX en version ≥ 0.2.0.
      Utilise le plugin SOMMAIRE en version ≥ 1.0.6.
      Utilise le plugin SPLICKR en version ≥ 0.4.5.
      Utilise le plugin TICKETS en version ≥ 2.9.1.
      Utilise le plugin TODO en version ≥ 2.0.6.
      Utilise le plugin ZENGARDEN en version ≥ 2.5.1.
      Impossible d’activer le plugin ../plugins/auto/cvtupload/v1.17.2
      Utilise le plugin SAISIES en version ≥ 3.18.1.
      Impossible d’activer le plugin ../plugins/auto/formidable/v3.42.5
      Nécessite le plugin SAISIES en version ≥ 3.26.0.
      Impossible d’activer le plugin ../plugins/auto/timecircles/v1.5.3.23
      Utilise le plugin AGENDA en version ≥ 3.19.0.
      Actions réalisées
      La mise à jour du plugin « Saisies pour formulaires » (de la version : 3.27.7 à 3.28.2) s’est correctement déroulée

    • Vous avez pas eu de chance, au sens où vous avez recu la mise à jour de saisie sans la mise à jour de bonux. Mettez à jour bonux, puis réactivez vos plugins.

    Reply to this message

  • 5

    Bonjour,
    En faisant une mise à jour du plugin vers la version 3.22.0, le site a été bloqué.
    En revenant à la version antérieure 3.21.2, ce problème a été réglé.
    SPIP 3.2.4
    Cordialement

    • Que signifie “le site a été bloqué” ? Si tu as une page blanche tu dois configurer PHP pour afficher les erreurs, afin de savoir vraiment ce qui se passe.
      https://www.spip.net/fr_article4453.html#erreurs

    • Bonjour,

      Après la mise à jour du plugin, j’ai bien une page d’erreurs PHP. Je n’ai pas fait de capture d’écran.
      Je l’ai désactivé et réinstallé. Le plugin reste obsolète.

      Cordialement

    • bah en l’absence de message d’erreur, ca va être dur d’aider...

    • Merci, avec la version 3.22.1 j’ai pu mettre à jour et cela fonctionne.

    • la version 3.22.1 ne portait pas sur ce problème, puisque je le connaissais pas ....

    Reply to this message

  • 3

    Bonsoir,

    Je n’arrive plus à configurer mes groupes de champs et mes champs ’explication’ dans champs extras, je pense qu’une mise à jour récente en est la cause. Est-ce que SAISIES en est la cause?

    Bien à vous,
    Jul

    Reply to this message

  • Bonjour,

    J’ai une colle pour les meilleurs SAISISTES dans les parages.

    J’ai fais un super formulaire CVT en exploitant à 200% SAISIES et c’est top ;) Par contre j’arrive à mes limites en souhaitant mettre de l’ajax et ne pas trop me salir avec du JS inutile.

    Mon formulaire étant AJAXé via la class ’ajax’, j’aimerais pouvoir le recharger pour lui renvoyer une données saisies par l’utilisateur, je m’explique.

    Il s’agit d’un formulaire d’inscription, et j’aimerais généré via SAISIES autant de champs (nom, prenom, emails) que nécessaire, selon le nombre de personnes spécifié par l’internaute via des ’selects’.

    Pour ce faire j’ai commencé par rajouter du javascript dans l’html pour pouvoir déclarer un attribut onChange à mes selects... chose qui n’est pas possible via SAISIES (sauf erreur). Puis un script lancant un ’ajaxReload’ pour renvoyer le nouveau nombre d’inscrits en argument du formulaire, pour généré via une boucle mes champs (prenoms...), enfin bref, ca marche po.

    L’ajaxReload ne fait rien du tout... Je ne suis pas d’ailleurs très sur de la syntaxe. Car AjaxReload prends en argument l’id du bloc ajax pour un inclure, mais pour un formulaire CVT c’est moi évident.

    Donc si quelqu’un à un exemple sous la main, je suis preneur.

    En vous remerciant,
    JuL

    Reply to this message

Comment on this article

Who are you?
  • [Log in]

To show your avatar with your message, register it first on gravatar.com (free et painless) and don’t forget to indicate your Email addresse here.

Enter your comment here

This form accepts SPIP shortcuts {{bold}} {italic} -*list [text->url] <quote> <code> and HTML code <q> <del> <ins>. To create paragraphs, just leave empty lines.

Add a document

Follow the comments: RSS 2.0 | Atom