[SPIP Zone] [Spip-zone-commit] r29891 - in /_plugins_/saisies: ./ balise/ balise/saisie.php plugin.xml

Je veux bien tenter le codage en balise dynamique, si tu n’y vois pas d’objection.

Je peux intervenir directement dans le code ou tu préfères que je crée une branche séparée ?
(vu que je ne suis pas certain de mon coup et que je suis surchargé donc je ne garanti pas de tout pouvoir terminer en une passe)

.Gilles

2009/7/16 <marcimat@free.fr>

Author: marcimat@free.fr
Date: Thu Jul 16 16:50:34 2009
New Revision: 29891

Log:
Ajout du plugin « saisies » pour y mettre les saisies expérimentales, en dehors de CFG (faudrait pas qu’il devienne Bonux ^^)

Attention : la balise SAISIE utilise une syntaxe différente : les 2 premiers arguments sont obligatoires et non nommés pour le coup ; tous les autres sont explicitements nommés.

{{{ #SAISIE{input, titre, oui} }}} est donc maintenant invalide, à remplacer par :

{{{#SAISIE{input, titre, obligatoire=oui} }}}

La syntaxe idéale est TOUS les arguments dans UNE paire d’accolade :

{{{
#SAISIE{input, titre, label=Titre, defaut=Nouveau titre}
}}}

Pour utiliser une base d’inclusion différente que le fichier saisies/_base, vous pouvez surcharger par :

{{{
#SAISIE{input, titre, label=Titre, defaut=Nouveau titre, fond=saisies/autre_base}
}}}

Note 1)
Qui veut bien trouver une icone ?
Note 2)
La balise SAISIE modifie la pile $p avant d’appeler la balise #INCLURE.
Je n’ai pas réussi à la coder avec une balise dynamique comme me suggérait Emmanuel.
Si quelqu’un veut se lancer :wink:

Added:
plugins/saisies/
plugins/saisies/balise/
plugins/saisies/balise/saisie.php
plugins/saisies/plugin.xml

Added: plugins/saisies/balise/saisie.php

plugins/saisies/balise/saisie.php (added)
+++ plugins/saisies/balise/saisie.php Thu Jul 16 16:50:34 2009
@@ -0,0 +1,173 @@
+<?php
+
+// pour ne pas interferer avec d’eventuelles futures fonctions du core
+// on met le tout dans un namespace ; les fonctions sont autonomes.
+
+class Pile {
+
+

  • // les arguments sont dans l’entree 0 du tableau param.
  • // param[0][0] vaut toujours ‹  ›
  • function recuperer_argument_balise($pos, $p) {
  • //$pos–;
  • if (!isset($p->param[0])) {
  • return null;
  • }
  • if (!isset($p->param[0][$pos])) {
  • return null;
  • }
  • return $p->param[0][$pos];
  • }
  • // les arguments sont dans l’entree 0 du tableau param.
  • // param[0][0] vaut toujours ‹  ›
  • function supprimer_argument_balise($pos, $p) {
  • //$pos–;
  • if (!isset($p->param[0])) {
  • return null;
  • }
  • if (!isset($p->param[0][$pos])) {
  • return null;
  • }
  • if ($pos == 0) {
  • array_shift($p->param[0]);
  • } else {
  • $debut = array_slice($p->param[0], 0, $pos);
  • $fin = array_slice($p->param[0], $pos+1);
  • $p->param[0] = array_merge($debut, $fin);
  • }
  • return $p;
  • }
  • function recuperer_et_supprimer_argument_balise($pos, &$p) {
  • $arg = Pile::recuperer_argument_balise($pos, $p);
  • $p = Pile::supprimer_argument_balise($pos, $p);
  • return $arg;
  • }
  • // les arguments sont dans l’entree 0 du tableau param.
  • // param[0][0] vaut toujours ‹  ›
  • function ajouter_argument_balise($element, $p) {
  • $zero = array_shift($p->param[0]);
  • array_unshift($p->param[0], $element);
  • array_unshift($p->param[0], $zero);
  • return $p;
  • }
  • // creer_argument_balise(nom) = {nom}
  • // creer_argument_balise(nom, ‹ coucou ›) = {nom=coucou}
  • // creer_argument_balise(nom, $balise) = {nom=#BALISE}
  • function creer_argument_balise($nom, $valeur = null) {
  • include_spip(‹ inc/interfaces ›);
  • $s = new Texte;
  • $s->type=« texte »;
  • $s->texte = $nom;
  • $s->ligne=0;
  • // si #BALISE cree avec Pile::creer_balise(), le mettre en array, comme les autres
  • if (is_object($valeur)) {
  • $valeur = array($valeur);
  • }
  • $res = null;
  • // {nom}
  • if (is_null($valeur)) {
  • $res = array($s);
  • }
  • // {nom=coucou}
  • elseif (is_string($valeur)) {
  • $s->texte .= « =$valeur »;
  • $res = array($s);
  • }
  • // {nom=#BALISE}
  • elseif (is_array($valeur)) {
  • $s->texte .= « = »; // /!\ sans cette toute petite chose, ça ne fait pas d’egalite :slight_smile:
  • $res = array_merge(array($s), $valeur);
  • }
  • return $res;
  • }
  • function creer_et_ajouter_argument_balise($p, $nom, $valeur = null) {
  • $new = Pile::creer_argument_balise($nom, $valeur);
  • return Pile::ajouter_argument_balise($new, $p);
  • }
  • // creer une balise
  • function creer_balise($nom, $opt) {
  • include_spip(‹ inc/interfaces ›);
  • $b = new Champ;
  • $b->type = ‹ champ ›;
  • $b->nom_champ = strtoupper($nom);
  • foreach ($opt as $o=>$val) {
  • if (isset($b->$o)) {
  • if ($o == ‹ param ›) {
  • array_unshift($val, ‹  ›);
  • $b->$o = array($val);
  • } else {
  • $b->$o = $val;
  • }
  • }
  • }
  • return $b;
  • }
    +}

+/*

    • #saisie{type,nom} : champs obligatoires
    • collecte des arguments en fonctions du parametre « nom »
    • ajoute des arguments
    • appelle #INCLURE avec les arguments collectes en plus
    • il faudrait en faire une balise dynamique (?)
    • pour avoir un code plus propre
    • mais je n’ai pas reussi a trouver comment recuperer « valeur=#ENV{$nom} »
  • */
    +function balise_SAISIE_dist ($p) {
  • // on recupere les parametres sans les traduire en code d’execution php
  • $type_saisie = Pile::recuperer_et_supprimer_argument_balise(1, $p); // $type
  • $titre = Pile::recuperer_et_supprimer_argument_balise(1, $p); // $titre
  • // creer #ENV{$titre}
  • $env_titre = Pile::creer_balise(‹ ENV ›, array(‹ param › => array($titre))); // #ENV{titre}
  • // on modifie $p pour ajouter des arguments
  • // {valeur=#ENV{$titre}, erreurs, type_saisie=$type, fond=saisies/_base}
  • $p = Pile::creer_et_ajouter_argument_balise($p, ‹ valeur ›, $env_titre);
  • $p = Pile::creer_et_ajouter_argument_balise($p, ‹ erreurs ›);
  • $p = Pile::creer_et_ajouter_argument_balise($p, ‹ type_saisie ›, $type_saisie);
  • //$p = Pile::creer_et_ajouter_argument_balise($p, ‹ fond ›, ‹ saisies/_base ›);
  • $p = Pile::creer_et_ajouter_argument_balise($p, ‹ fond ›, ‹ sus ›);
  • // on appelle la balise #INCLURE
  • // avec les arguments ajoutes
  • if(function_exists(‹ balise_INCLURE ›))
  • return balise_INCLURE($p);
  • else
  • return balise_INCLURE_dist($p);

+}
+
+
+
+
+?>

Added: plugins/saisies/plugin.xml

plugins/saisies/plugin.xml (added)
+++ plugins/saisies/plugin.xml Thu Jul 16 16:50:34 2009
@@ -0,0 +1,20 @@
+

  • Saisies pour formulaires
  • Matthieu Marcillaud
  • © 2009 GNU/GPL
  • 1.0
  • experimental
  • Ce plugin permet de faciliter l’écriture de champs de formulaires en proposant une
  • balise #SAISIE. Le HTML généré est compatible avec la nomenclature des formulaires
  • proposé par SPIP 2.0 et avec le plugin de configuration CFG.
  • saisies
  • balise/saisie.php

+


Spip-zone-commit@rezo.net - http://listes.rezo.net/mailman/listinfo/spip-zone-commit

Le 16/07/2009 18:47, Gilles VINCENT a écrit :

Je veux bien tenter le codage en balise dynamique, si tu n'y vois pas
d'objection.

Mais marcimat, c'est vrai qu'il n'y a pas besoin de toutes ces fonctions. Je t'avais dit sur IRC que j'avais déjà fait ce que tu voulais faire (param=valeur, autre=chose, etc=etc) dans le plugin Étiquettes.

Ça se fait en 5 lignes de code dans une balise dynamique !
cf. ce qui suit là : Connexion · GitLab

--
RastaPopoulos

Le 16/07/2009 22:28, RastaPopoulos a écrit :

Mais marcimat, c'est vrai qu'il n'y a pas besoin de toutes ces
fonctions. Je t'avais dit sur IRC que j'avais déjà fait ce que tu
voulais faire (param=valeur, autre=chose, etc=etc) dans le plugin
Étiquettes.

Ah, mais le problème n'est pas de récupérer et de transmettre des arguments : ça j'aurais eu aucune difficulté. Le problème est d'en ajouter en fonction d'autres. En ajouter des simples, c'est facile, comme le critère {erreurs} il suffit de mettre array('erreurs') en second paramètre de la fonction de calcul de la balise dynamique...

Mais pour ajouter (de ton exemple) {valeur=#ENV{valeur}} automatiquement lorsqu'on renseigne param=valeur, ou param=#GET{ce qu'on veut}, je n'ai pas trouvé comment.

Possible que ce soit très simple malgré tout.

--
MM.

Le 17/07/2009 01:37, Matthieu Marcillaud a écrit :

Mais pour ajouter (de ton exemple) {valeur=#ENV{valeur}} automatiquement
lorsqu'on renseigne param=valeur, ou param=#GET{ce qu'on veut}, je n'ai
pas trouvé comment.

Possible que ce soit très simple malgré tout.

Et bien je dois mal comprendre le problème car on peut faire :
#FORMULAIRE_ETIQUETTES{name=#GET{id}, objet=#ENV{objet}, groupe=#TITRE}

Comme tu le vois, on peut utiliser un #ENV, un #GET, ou une balise d'un champ de table. Je ne vois pas l'intérêt de faire param=valeur pour ensuite essayer de récupérer #ENV{valeur] puisque tu peux mettre #ENV{valeur} directement dans les paramètres.

Je l'utilise abondamment. Il n'y a strictement RIEN à faire (donc on peut dire que c'est simple) : chaque paramètres de la balise dynamique est déjà calculée en amont.

--
RastaPopoulos

Le 17/07/2009 09:16, RastaPopoulos a écrit :

Et bien je dois mal comprendre le problème car on peut faire :
#FORMULAIRE_ETIQUETTES{name=#GET{id}, objet=#ENV{objet}, groupe=#TITRE}

Je ne vois pas l'intérêt de faire param=valeur pour

ensuite essayer de récupérer #ENV{valeur] puisque tu peux mettre
#ENV{valeur} directement dans les paramètres.

Partant de ce principe, je ne vois pas l'intérêt d'une balise saisie puisque je peux écrire
#INCLURE{fond=saisies/_base, type=input, nom=titre, valeur=#ENV{titre}, erreurs}

Mon idée est bien de simplifier cette écriture, pas de refaire la même, sinon ça n'a aucun intérêt. C'est cette écriture que je souhaite écrire :
#SAISIE{input, titre} qui est quand même plus courte.

Maintenant, si ça ne convient à personne, on peut aussi abandonner cette idée d'une balise #SAISIE après tout.

--
MM.

Le 17/07/2009 09:40, Matthieu Marcillaud a écrit :

Mon idée est bien de simplifier cette écriture, pas de refaire la même,
sinon ça n'a aucun intérêt. C'est cette écriture que je souhaite écrire :
#SAISIE{input, titre} qui est quand même plus courte.

Euh là ça n'a pas de rapport. Les deux premiers par paramètres ne sont pas de la forme param=valeur. Et tu peux le faire avec la méthode que j'ai montré avec Étiquettes : les deux premiers paramètres obligatoires, tu les array_shift du tableau des arguments avant de faire les tests de param=valeur sur les suivants.

Ce que je n'ai pas bien compris, c'est que si tu fais "param=truc" comment tu peux savoir s'il faut chercher #ENV{truc} ou bien s'il faut prendre la valeur "truc". Et surtout je vois pas l'intérêt puisque tu peux écrire directement param=#ENV{truc}. (Et ça c'est juste pour les paramètres facultatifs).

#SAISIE{input, mon_name,
     obligatoire=oui,
     label=#ENV{un_truc_environnemental}
     defaut=<:une_chaine_de_langue:>
     etc=#GET{un_truc_calculé_dans_le_squelette}
}

C'est bien ça ? Facile !

--
RastaPopoulos

RastaPopoulos a écrit :

Ce que je n'ai pas bien compris, c'est que si tu fais "param=truc" comment tu peux savoir s'il faut chercher #ENV{truc} ou bien s'il faut prendre la valeur "truc". Et surtout je vois pas l'intérêt puisque tu peux écrire directement param=#ENV{truc}. (Et ça c'est juste pour les paramètres facultatifs).

En Lisp, il y a 2 types différents de fonctions :
les SUBR évaluent systématiquement tous leurs arguments
tandis que les FSUBR n'évaluent pas leurs arguments.
Elles ont évidemment des noms différents (SET, SETQ)

#SAISIE simplifie déjà énormément l'écriture
et la rend très sympathique (plus qu'un INCLURE)
même sans faire automatiquement des smart #ENV.

Ton idée est de simplifier encore
dans un certain cadre bien défini de fonctionnement standardisé
dans lequel un traitement complémentaire pourrait être fait systématiquement ?

Alors ça peut être une 2ème balise #SAISIE_AUTO
avec évaluation selon le cadre prédéfini.
Je me demande aussi si ça ne passe pas plutôt
par des déclarations préallable plutôt (espèce de typage des arguments) :
#SAISIE_DANS_ENV{valeur, titre} ou #SAISIE_DANS_GET{valeur, titre}
(bof)

Si tu confirmes la possibilité d'un cadre prédéfini élaboré
et que ce cadre prédéfini te semble en fait très généraliste,
ce pourrait alors être lui qui utiliserait par défaut #SAISIE,
et l'autre balise serait alors #SAISIE_COMPLEXE
- ou alors ce serait un argument supplémentaire qui spécifie
si c'est une saisie auto ou complexe -.

JLuc, pas sur d'être très clair, et qui par ailleurs ne doute pas
que ESJ ou Thomas Passing Curiosity pourraient t'aider à faire un ENV
à l'intérieur de la balise.

Le 17/07/2009 11:51, JLuc a écrit :

JLuc, pas sur d'être très clair, et qui par ailleurs ne doute pas
que ESJ ou Thomas Passing Curiosity pourraient t'aider à faire un ENV
à l'intérieur de la balise.

Je n'ai pas tout compris, mais le truc là, c'est que ça fait ce que je veux en ce moment. Déjà.

Mais il parait juste que c'est pas très homologué la façon dont je le fais :wink: C'est tout.

--
MM.

Le 17 juil. 09 à 12:03, Matthieu Marcillaud a écrit :

Le 17/07/2009 11:51, JLuc a écrit :

JLuc, pas sur d’être très clair, et qui par ailleurs ne doute pas

que ESJ ou Thomas Passing Curiosity pourraient t’aider à faire un ENV

à l’intérieur de la balise.

Je n’ai pas tout compris, mais le truc là, c’est que ça fait ce que je veux en ce moment. Déjà.

Mais il parait juste que c’est pas très homologué la façon dont je le fais :wink: C’est tout.

Bonjour Matthieu,

Je me demande qu’elle est la synthaxe à atteindre :

  • celle-là :

#SET{nom,qto}
[(#SAISIE{selection,nom=#GET{nom},racine_casier=#GET{racine_casier},
fond=saisies/czi_base_xzx,
label=Quel type d’objet,option_intro=Choisir une noisette,
explication=Choisir un objet. Un seul choix pour l’instant,defaut=1,
datas=#ARRAY{
1,pied_menu1,
}})]

  • ou celle là :

#SET{nom,qto}
[(#SAISIE{type=selection,nom=#GET{nom},racine_casier=#GET{racine_casier},
fond=saisies/czi_base_xzx,
label=Quel type d’objet,option_intro=Choisir une noisette,
explication=Choisir un objet. Un seul choix pour l’instant,defaut=1,
datas=#ARRAY{
1,pied_menu1,
}})]

  • ou plus poétique :

#SET{nom,qto}
[(#SAISIE{patronyme=selection,prenom=#GET{nom},racine_casier=#GET{racine_casier},
fond=saisies/czi_base_xzx,
label=Quel type d’objet,option_intro=Choisir une noisette,
explication=Choisir un objet. Un seul choix pour l’instant,defaut=1,
datas=#ARRAY{
1,pied_menu1,
}})]

ou une autre encore ?

J’avoue être un peu perdue là de suite…

pierre