source: spip-zone/_plugins_/champs_extras/core/trunk/cextras_fonctions.php @ 70444

Last change on this file since 70444 was 70444, checked in by marcimat@…, 7 years ago

C'est pas possible de ne pas respecter ce qui est écrit dans la doc :) C'est bien le type d'objet qui sert à déclarer les autorisations ...

File size: 8.1 KB
Line 
1<?php
2
3/**
4 * Déclarations de balises pour les squelettes
5 *
6 * @package SPIP\Cextras\Fonctions
7**/
8
9// sécurité
10if (!defined("_ECRIRE_INC_VERSION")) return;
11
12/**
13 * Retourne la description de la saisie du champ demandé
14 * permettant ainsi d'exploiter ses données.
15 *
16 * @example
17 *     ```
18 *     <BOUCLE_x(TABLE)>
19 *     - #CHAMP_EXTRA{nom_du_champ}
20 *     - #CHAMP_EXTRA{nom_du_champ,label}
21 *     </BOUCLE_x>
22 *     ```
23 *
24 * @balise CHAMP_EXTRA
25 * @note
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
28 *
29 * @param Champ $p
30 *     AST au niveau de la balise
31 * @return Champ
32 *     AST complété par le code PHP de la balise
33**/
34function 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;
38
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);
43        }
44
45        $demande = sinon(interprete_argument_balise(2, $p), "''");
46        $p->code = "calculer_balise_CHAMP_EXTRA('$objet', $colonne, $demande)";
47        return $p;
48}
49
50/**
51 * Retourne la description d'un champ extra indiqué
52 *
53 * Retourne le tableau de description des options de saisies
54 * ou un des attributs de ce tableau
55 *
56 * @param string $objet
57 *     Type d'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é
63 * @return mixed
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é
67 */
68function 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){
72                $objet = $decoupe[0];
73                $colonne = $decoupe[1];
74        }
75       
76        // recuperer la liste des champs extras existants
77        include_spip('cextras_pipelines');
78        if (!$saisies = champs_extras_objet( $table = table_objet_sql($objet) )) {
79                return '';
80        }
81       
82        include_spip('inc/saisies');
83        if (!$saisie = saisies_chercher($saisies, $colonne)) {
84                return '';
85        }
86
87        if (!$demande) {
88                return $saisie['options']; // retourne la description de la saisie...
89        }
90
91        if (array_key_exists($demande, $saisie['options'])) {
92                return $saisie['options'][$demande];
93        }
94
95        return '';
96}
97
98
99/**
100 * Retourne les choix possibles d'un champ extra donné
101 *
102 * @example
103 *     ```
104 *     #LISTER_CHOIX{champ}
105 *     #LISTER_CHOIX{champ, " > "}
106 *     #LISTER_CHOIX**{champ} // retourne un tableau cle/valeur
107 *     ```
108 *
109 * @balise LISTER_CHOIX
110 * @param Champ $p
111 *     AST au niveau de la balise
112 * @return Champ
113 *     AST complété par le code PHP de la balise
114**/
115function balise_LISTER_CHOIX_dist($p) {
116        // prendre nom de la cle primaire de l'objet pour calculer sa valeur
117        $id_boucle = $p->nom_boucle ? $p->nom_boucle : $p->id_boucle;
118
119        // s'il n'y a pas de nom de boucle, on ne peut pas fonctionner
120        if (!isset($p->boucles[$id_boucle])) {
121                $msg = array('zbug_champ_hors_boucle', array('champ' => ' LISTER_CHOIX'));
122                erreur_squelette($msg, $p);
123                $p->code = "''";
124                return $p;
125        }
126       
127        $objet = $p->boucles[$id_boucle]->id_table;
128       
129        // recuperer les parametres : colonne sql (champ)
130        if (!$colonne = interprete_argument_balise(1, $p)) {
131                $msg = array('zbug_balise_sans_argument',       array('balise' => ' LISTER_CHOIX'));
132                erreur_squelette($msg, $p);
133                $p->code = "''";
134                return $p;
135        }
136       
137        $separateur = interprete_argument_balise(2, $p);
138        if (!$separateur) $separateur = "', '";
139
140        // generer le code d'execution
141        $p->code = "calculer_balise_LISTER_CHOIX('$objet', $colonne)";
142
143        // retourne un array si #LISTER_CHOIX**
144        // sinon fabrique une chaine avec le separateur designe.
145        if ($p->etoile != "**") {
146                $p->code = "(is_array(\$a = $p->code) ? join($separateur, \$a) : " . $p->code . ")";
147        }
148       
149        return $p;
150}
151
152
153/**
154 * Retourne les choix possibles d'un champ extra indiqué
155 *
156 * @param string $objet
157 *     Type d'objet
158 * @param string $colonne
159 *     Nom de la colonne SQL
160 * @return string|array
161 *     - Tableau des couples (clé => valeur) des choix
162 *     - Chaîne vide si le champs extra n'est pas trouvé
163 */
164function calculer_balise_LISTER_CHOIX($objet, $colonne) {
165        if ($options = calculer_balise_CHAMP_EXTRA($objet, $colonne)) {
166                if (isset($options['datas']) and $options['datas']) {
167                        include_spip('inc/saisies');
168                        return saisies_chaine2tableau($options['datas']);
169                }
170        }
171        return '';
172}
173
174
175
176/**
177 * Liste les valeurs des champs de type liste (enum, radio, case)
178 *
179 * Ces champs enregistrent en base la valeur de la clé
180 * Il faut donc transcrire clé -> valeur
181 *
182 * @example
183 *     ```
184 *     #LISTER_VALEURS{champ}
185 *     #LISTER_VALEURS{champ, " > "}
186 *     #LISTER_VALEURS**{champ} // retourne un tableau cle/valeur
187 *     ```
188 *
189 * @note
190 *     Pour des raisons d'efficacité des requetes SQL
191 *     le paramètre "champ" ne peut être calculé
192 *     ``#LISTER_VALEURS{#GET{champ}}`` ne peut pas fonctionner.
193 *
194 *     Si cette restriction est trop limitative, on verra par la suite
195 *     pour l'instant, on laisse comme ca...
196 *
197 * @balise LISTER_VALEURS
198 * @param Champ $p
199 *     AST au niveau de la balise
200 * @return Champ
201 *     AST complété par le code PHP de la balise
202 */
203function balise_LISTER_VALEURS_dist($p) {
204        // prendre nom de la cle primaire de l'objet pour calculer sa valeur
205        $id_boucle = $p->nom_boucle ? $p->nom_boucle : $p->id_boucle;
206
207        // s'il n'y a pas de nom de boucle, on ne peut pas fonctionner
208        if (!isset($p->boucles[$id_boucle])) {
209                $msg = array('zbug_champ_hors_boucle', array('champ' => ' LISTER_VALEURS'));
210                erreur_squelette($msg, $p);
211                $p->code = "''";
212                return $p;
213        }
214       
215        $objet = $p->boucles[$id_boucle]->id_table;
216        $_id_objet = $p->boucles[$id_boucle]->primary;
217        $id_objet = champ_sql($_id_objet, $p);
218
219        // recuperer les parametres : colonne sql (champ)
220        if (!$colonne = interprete_argument_balise(1, $p)) {
221                $msg = array('zbug_balise_sans_argument', array('balise' => ' LISTER_VALEURS'));
222                erreur_squelette($msg, $p);
223                $p->code = "''";
224                return $p;
225        }
226       
227        $separateur = interprete_argument_balise(2, $p);
228        if (!$separateur) $separateur = "', '";
229       
230        // demander la colonne dans la requete SQL
231        // $colonne doit etre un texte 'nom_du_champ'
232        if ($p->param[0][1][0]->type != 'texte') {
233                $msg = array('cextras:zbug_balise_argument_non_texte', array('nb'=>1, 'balise' => ' LISTER_VALEURS'));
234                erreur_squelette($msg, $p);
235                $p->code = "''";
236                return $p;
237        }
238       
239        $texte_colonne = $p->param[0][1][0]->texte;
240       
241        $valeur = champ_sql($texte_colonne, $p);
242
243        // generer le code d'execution
244        $p->code = "calculer_balise_LISTER_VALEURS('$objet', $colonne, $valeur)";
245
246        // retourne un array si #LISTER_VALEURS**
247        // sinon fabrique une chaine avec le separateur designe.
248        if ($p->etoile != "**") {
249                $p->code = "(is_array(\$a = $p->code) ? join($separateur, \$a) : " . $p->code . ")";
250        }
251
252        return $p;
253}
254
255
256/**
257 * Retourne liste des valeurs choisies pour un champ extra indiqué
258 *
259 * @param string $objet
260 *     Type d'objet
261 * @param string $colonne
262 *     Nom de la colonne SQL
263 * @param string $cles
264 *     Valeurs enregistrées pour ce champ dans la bdd pour l'objet en cours
265 *
266 * @return string|array
267 *     - Tableau des couples (clé => valeur) des choix
268 *     - Chaîne vide si le champs extra n'est pas trouvé
269**/
270function calculer_balise_LISTER_VALEURS($objet, $colonne, $cles) {
271
272        // exploser les cles !
273        $cles = explode(',', $cles);
274
275        // si pas de cles, on part aussi gentiment
276        if (!$cles) return array();
277
278        // recuperer les choix possibles
279        $choix = calculer_balise_LISTER_CHOIX($objet, $colonne);
280
281        // sortir gentiment si pas de champs declares
282        // on ne peut pas traduire les cles
283        if (!$choix) return $cles;
284
285        // correspondances...
286        $vals = array_intersect_key($choix, array_flip($cles));
287
288        // et voici les valeurs !
289        return $vals ? $vals : $cles;
290}
291
292
293
294?>
Note: See TracBrowser for help on using the repository browser.