4 * Déclarations de balises pour les squelettes
6 * @package SPIP\Cextras\Fonctions
10 if (!defined("_ECRIRE_INC_VERSION")) return;
13 * Retourne la description de la saisie du champ demandé
14 * permettant ainsi d'exploiter ses données.
19 * - #CHAMP_EXTRA{nom_du_champ}
20 * - #CHAMP_EXTRA{nom_du_champ,label}
26 * Lève une erreur de squelette si le nom de champs extras
27 * n'est pas indiqué en premier paramètre de la balise
30 * AST au niveau de la balise
32 * AST complété par le code PHP de la balise
34 function balise_CHAMP_EXTRA_dist($p) {
35 // prendre nom de la cle primaire de l'objet pour calculer sa valeur
36 $id_boucle = $p->nom_boucle ?
$p->nom_boucle
: $p->id_boucle
;
37 $objet = $p->boucles
[$id_boucle]->id_table
;
39 // recuperer les parametres : colonne sql (champ)
40 if (!$colonne = interprete_argument_balise(1, $p)) {
41 $msg = array('zbug_balise_sans_argument', array('balise' => ' CHAMP_EXTRA'));
42 erreur_squelette($msg, $p);
45 $demande = sinon(interprete_argument_balise(2, $p), "''");
46 $p->code
= "calculer_balise_CHAMP_EXTRA('$objet', $colonne, $demande)";
51 * Retourne la description d'un champ extra indiqué
53 * Retourne le tableau de description des options de saisies
54 * ou un des attributs de ce tableau
56 * @param string $objet
58 * @param string $colonne
59 * Nom de la colonne SQL
60 * @param string $demande
61 * Nom du paramètre demandé.
62 * Non renseigné, tout le tableau de description est retourné
64 * - Tableau si toute la description est demandée
65 * - Indéfini si un élément spécifique de la description est demandé.
66 * - Chaine vide si le champs extra n'est pas trouvé
68 function calculer_balise_CHAMP_EXTRA($objet, $colonne, $demande='') {
69 // Si la balise n'est pas dans une boucle, on cherche un objet explicite dans le premier argument
70 // de la forme "trucs/colonne" ou "spip_trucs/colonne"
71 if (!$objet and $decoupe = explode('/', $colonne) and count($decoupe) == 2){
73 $colonne = $decoupe[1];
76 // recuperer la liste des champs extras existants
77 include_spip('cextras_pipelines');
78 if (!$saisies = champs_extras_objet( $table = table_objet_sql($objet) )) {
82 include_spip('inc/saisies');
83 if (!$saisie = saisies_chercher($saisies, $colonne)) {
88 return $saisie['options']; // retourne la description de la saisie...
91 if (array_key_exists($demande, $saisie['options'])) {
92 return $saisie['options'][$demande];
100 * Retourne les choix possibles d'un champ extra donné
104 * #LISTER_CHOIX{champ}
105 * #LISTER_CHOIX{champ, " > "}
106 * // ** pour retourner un tableau (cle => valeur),
107 * // ou tableau groupe => tableau (cle => valeur) si déclaration de groupements.
108 * #LISTER_CHOIX**{champ}
113 * AST au niveau de la balise
115 * AST complété par le code PHP de la balise
117 function balise_LISTER_CHOIX_dist($p) {
118 // prendre nom de la cle primaire de l'objet pour calculer sa valeur
119 $id_boucle = $p->nom_boucle ?
$p->nom_boucle
: $p->id_boucle
;
121 // s'il n'y a pas de nom de boucle, on ne peut pas fonctionner
122 if (!isset($p->boucles
[$id_boucle])) {
123 $msg = array('zbug_champ_hors_boucle', array('champ' => ' LISTER_CHOIX'));
124 erreur_squelette($msg, $p);
129 $objet = $p->boucles
[$id_boucle]->id_table
;
131 // recuperer les parametres : colonne sql (champ)
132 if (!$colonne = interprete_argument_balise(1, $p)) {
133 $msg = array('zbug_balise_sans_argument', array('balise' => ' LISTER_CHOIX'));
134 erreur_squelette($msg, $p);
139 $separateur = interprete_argument_balise(2, $p);
140 if (!$separateur) $separateur = "', '";
142 // generer le code d'execution
143 $applatir = ($p->etoile
== "**") ?
'false' : 'true';
144 $p->code
= "calculer_balise_LISTER_CHOIX('$objet', $colonne, $applatir)";
146 // retourne un array si #LISTER_CHOIX**
147 // sinon fabrique une chaine avec le separateur designe.
148 if ($p->etoile
!= "**") {
149 $p->code
= "(is_array(\$a = $p->code) ? join($separateur, \$a) : " . $p->code
. ")";
157 * Retourne les choix possibles d'un champ extra indiqué
160 * Le plugin saisies tolère maintenant des sélections avec
161 * un affichage par groupe (optgroup / options) avec une syntaxe
162 * spécifique. Ici nous devons pouvoir applatir
163 * toutes les cle => valeur.
165 * @param string $objet
167 * @param string $colonne
168 * Nom de la colonne SQL
169 * @param bool $applatir
170 * true pour applatir les choix possibles au premier niveau
171 * même si on a affaire à une liste de choix triée par groupe
172 * @return string|array
173 * - Tableau des couples (clé => valeur) des choix
174 * - Chaîne vide si le champs extra n'est pas trouvé
176 function calculer_balise_LISTER_CHOIX($objet, $colonne, $applatir = true) {
177 if ($options = calculer_balise_CHAMP_EXTRA($objet, $colonne)) {
178 if (isset($options['datas']) and $options['datas']) {
179 include_spip('inc/saisies');
180 $choix = saisies_chaine2tableau($options['datas']);
181 // applatir les sous-groupes si présents
183 $choix = saisies_aplatir_tableau($choix);
194 * Liste les valeurs des champs de type liste (enum, radio, case)
196 * Ces champs enregistrent en base la valeur de la clé
197 * Il faut donc transcrire clé -> valeur
201 * #LISTER_VALEURS{champ}
202 * #LISTER_VALEURS{champ, " > "}
203 * #LISTER_VALEURS**{champ} // retourne un tableau cle/valeur
207 * Pour des raisons d'efficacité des requetes SQL
208 * le paramètre "champ" ne peut être calculé
209 * ``#LISTER_VALEURS{#GET{champ}}`` ne peut pas fonctionner.
211 * Si cette restriction est trop limitative, on verra par la suite
212 * pour l'instant, on laisse comme ca...
216 * AST au niveau de la balise
218 * AST complété par le code PHP de la balise
220 function balise_LISTER_VALEURS_dist($p) {
221 // prendre nom de la cle primaire de l'objet pour calculer sa valeur
222 $id_boucle = $p->nom_boucle ?
$p->nom_boucle
: $p->id_boucle
;
224 // s'il n'y a pas de nom de boucle, on ne peut pas fonctionner
225 if (!isset($p->boucles
[$id_boucle])) {
226 $msg = array('zbug_champ_hors_boucle', array('champ' => ' LISTER_VALEURS'));
227 erreur_squelette($msg, $p);
232 $objet = $p->boucles
[$id_boucle]->id_table
;
233 $_id_objet = $p->boucles
[$id_boucle]->primary
;
234 $id_objet = champ_sql($_id_objet, $p);
236 // recuperer les parametres : colonne sql (champ)
237 if (!$colonne = interprete_argument_balise(1, $p)) {
238 $msg = array('zbug_balise_sans_argument', array('balise' => ' LISTER_VALEURS'));
239 erreur_squelette($msg, $p);
244 $separateur = interprete_argument_balise(2, $p);
245 if (!$separateur) $separateur = "', '";
247 // demander la colonne dans la requete SQL
248 // $colonne doit etre un texte 'nom_du_champ'
249 if ($p->param
[0][1][0]->type
!= 'texte') {
250 $msg = array('cextras:zbug_balise_argument_non_texte', array('nb'=>1, 'balise' => ' LISTER_VALEURS'));
251 erreur_squelette($msg, $p);
256 $texte_colonne = $p->param
[0][1][0]->texte
;
258 $valeur = champ_sql($texte_colonne, $p);
260 // generer le code d'execution
261 $p->code
= "calculer_balise_LISTER_VALEURS('$objet', $colonne, $valeur)";
263 // retourne un array si #LISTER_VALEURS**
264 // sinon fabrique une chaine avec le separateur designe.
265 if ($p->etoile
!= "**") {
266 $p->code
= "(is_array(\$a = $p->code) ? join($separateur, \$a) : " . $p->code
. ")";
274 * Retourne liste des valeurs choisies pour un champ extra indiqué
276 * @param string $objet
278 * @param string $colonne
279 * Nom de la colonne SQL
280 * @param string $cles
281 * Valeurs enregistrées pour ce champ dans la bdd pour l'objet en cours
283 * @return string|array
284 * - Tableau des couples (clé => valeur) des choix
285 * - Chaîne vide si le champs extra n'est pas trouvé
287 function calculer_balise_LISTER_VALEURS($objet, $colonne, $cles) {
289 // exploser les cles !
290 $cles = explode(',', $cles);
292 // si pas de cles, on part aussi gentiment
293 if (!$cles) return array();
295 // recuperer les choix possibles
296 $choix = calculer_balise_LISTER_CHOIX($objet, $colonne);
298 // sortir gentiment si pas de champs declares
299 // on ne peut pas traduire les cles
300 if (!$choix) return $cles;
302 // correspondances...
303 $vals = array_intersect_key($choix, array_flip($cles));
305 // et voici les valeurs !
306 return $vals ?
$vals : $cles;