9149b8cc05212cd6250f3d4442006658121556ab
4 * Déclaration de la classe `Pile` et de la balise `#SAISIE`
6 * @package SPIP\Saisies\Balises
9 if (!defined("_ECRIRE_INC_VERSION")) return;
11 // pour ne pas interferer avec d'eventuelles futures fonctions du core
12 // on met le tout dans une classe ; les fonctions sont autonomes.
15 * Conteneur pour modifier les arguments d'une balise SPIP (de classe Champ) à compiler
18 * Ces fonctions visent à modifier l'AST (Arbre de Syntaxe Abstraite) issues
19 * de l'analyse du squelette. Très utile pour créer des balises qui
20 * transmettent des arguments supplémentaires automatiquement, à des balises
22 * Voir un exemple d'utilisation dans `balise_SAISIE_dist()`.
25 * Les arguments sont stockés sont dans l'entree 0 de la propriété `param`
26 * dans l'objet Champ (représenté par `$p`), donc dans `$p->param[0]`.
28 * `param[0][0]` vaut toujours '' (ou presque ?)
30 * @see balise_SAISIE_dist() Pour un exemple d'utilisation
36 * Récupère un argument de balise
40 * @return mixed|null Élément de l'AST représentant l'argument s'il existe
42 static function recuperer_argument_balise($pos, $p) {
43 if (!isset($p->param
[0])) {
46 if (!isset($p->param
[0][$pos])) {
49 return $p->param
[0][$pos];
53 * Supprime un argument de balise
59 static function supprimer_argument_balise($pos, $p) {
60 if (!isset($p->param
[0])) {
63 if (!isset($p->param
[0][$pos])) {
67 array_shift($p->param
[0]);
69 $debut = array_slice($p->param
[0], 0, $pos);
70 $fin = array_slice($p->param
[0], $pos+
1);
71 $p->param
[0] = array_merge($debut, $fin);
78 * Retourne un argument de balise, et le supprime de la liste des arguments
80 * @uses Pile::recuperer_argument_balise()
81 * @uses Pile::supprimer_argument_balise()
85 * @return mixed|null Élément de l'AST représentant l'argument s'il existe
87 static function recuperer_et_supprimer_argument_balise($pos, &$p) {
88 $arg = Pile
::recuperer_argument_balise($pos, $p);
89 $p = Pile
::supprimer_argument_balise($pos, $p);
95 * Ajoute un argument de balise
97 * Empile l'argument à la suite des arguments déjà existants pour la balise
99 * @param mixed $element Élément de l'AST représentant l'argument à ajouter
103 static function ajouter_argument_balise($element, $p) {
104 if (isset($p->param
[0][0])) {
105 $zero = array_shift($p->param
[0]);
106 array_unshift($p->param
[0], $element);
107 array_unshift($p->param
[0], $zero);
109 if (!is_array($p->param
[0])) {
110 $p->param
[0] = array();
112 array_unshift($p->param
[0], $element);
119 * Crée l'élément de l'AST représentant un argument de balise.
123 * $nom = Pile::creer_argument_balise(nom); // {nom}
124 * $nom = Pile::creer_argument_balise(nom, 'coucou'); // {nom=coucou}
126 * $balise = Pile::creer_balise('BALISE');
127 * $nom = Pile::creer_argument_balise(nom, $balise); // {nom=#BALISE}
132 * @param string|object $valeur
133 * Valeur de l'argument. Peut être une chaîne de caractère ou un autre élément d'AST
136 static function creer_argument_balise($nom, $valeur = null) {
137 include_spip('public/interfaces');
142 // si #BALISE cree avec Pile::creer_balise(), le mettre en array, comme les autres
143 if (is_object($valeur)) {
144 $valeur = array($valeur);
150 if (is_null($valeur)) {
154 elseif (is_string($valeur)) {
155 $s->texte
.= "=$valeur";
159 elseif (is_array($valeur)) {
160 $s->texte
.= "="; // /!\ sans cette toute petite chose, ça ne fait pas d'egalite :)
161 $res = array_merge(array($s), $valeur);
169 * Crée et ajoute un argument à une balise
171 * @uses Pile::creer_argument_balise()
172 * @uses Pile::ajouter_argument_balise()
177 * @param string|object $valeur
178 * Valeur de l'argument. Peut être une chaîne de caractère ou un autre élément d'AST
181 static function creer_et_ajouter_argument_balise($p, $nom, $valeur = null) {
182 $new = Pile
::creer_argument_balise($nom, $valeur);
183 return Pile
::ajouter_argument_balise($new, $p);
189 * Crée l'AST d'une balise
193 * // Crée : #ENV*{titre}
194 * $titre = Pile::recuperer_argument_balise(1, $p); // $titre, 1er argument de la balise actuelle
195 * $env = Pile::creer_balise('ENV', array('param' => array($titre), 'etoile' => '*'));
201 * Options (remplira les propriétés correspondantes de l'objet Champ)
204 static function creer_balise($nom, $opt = array()) {
205 include_spip('public/interfaces');
207 $b->nom_champ
= strtoupper($nom);
208 foreach ($opt as $o=>$val) {
209 if (property_exists($b,$o)) {
211 array_unshift($val, '');
212 $b->$o = array($val);
225 * Compile la balise `#SAISIE` qui retourne le code HTML de la saisie de formulaire indiquée.
227 * Cette balise incluera le squelette `saisies/_base.html` et lui-même `saisies/{type}.html`
229 * La balise `#SAISIE` est un raccourci pour une écriture plus compliquée de la balise `#INCLURE`.
230 * La balise calcule une série de paramètre récupérer et à transmettre à `#INCLURE`,
231 * en fonction des valeurs des 2 premiers paramètres transmis.
233 * Les autres arguments sont transmis tels quels à la balise `#INCLURE`.
235 * Ainsi `#SAISIE{input,nom,label=Nom,...}` exécutera l'équivalent de
236 * `#INCLURE{nom=nom,valeur=#ENV{nom},type_saisie=input,erreurs,fond=saisies/_base,label=Nom,...}`
238 * @syntaxe `#SAISIE{type,nom[,option=xx,...]}`
240 * @uses Pile::recuperer_et_supprimer_argument_balise()
241 * @uses Pile::creer_balise()
242 * @uses Pile::creer_et_ajouter_argument_balise()
243 * @see balise_INCLURE_dist()
248 function balise_SAISIE_dist($p) {
250 // on recupere les parametres sans les traduire en code d'execution php
251 $type_saisie = Pile
::recuperer_et_supprimer_argument_balise(1, $p); // $type
252 $titre = Pile
::recuperer_et_supprimer_argument_balise(1, $p); // $titre
254 // creer #ENV*{$titre} (* pour les cas de tableau serialises par exemple, que l'on veut reutiliser)
255 $env_titre = Pile
::creer_balise('ENV', array('param' => array($titre), 'etoile' => '*')); // #ENV*{titre}
257 // on modifie $p pour ajouter des arguments
258 // {nom=$titre, valeur=#ENV{$titre}, erreurs, type_saisie=$type, fond=saisies/_base}
259 $p = Pile
::creer_et_ajouter_argument_balise($p, 'nom', $titre);
260 $p = Pile
::creer_et_ajouter_argument_balise($p, 'valeur', $env_titre);
261 $p = Pile
::creer_et_ajouter_argument_balise($p, 'type_saisie', $type_saisie);
262 $p = Pile
::creer_et_ajouter_argument_balise($p, 'erreurs');
263 $p = Pile
::creer_et_ajouter_argument_balise($p, 'fond', 'saisies/_base');
265 // on appelle la balise #INCLURE
266 // avec les arguments ajoutes
267 if (function_exists('balise_INCLURE')) {
268 return balise_INCLURE($p);
270 return balise_INCLURE_dist($p);