source: spip-zone/_plugins_/champs_extras/core/branches/v1/cextras_balises.php @ 52818

Last change on this file since 52818 was 52818, checked in by kent1@…, 9 years ago

if (!defined("_ECRIRE_INC_VERSION")) return; sur tout fichier PHP pour sécurité future principalement

File size: 5.4 KB
Line 
1<?php
2
3if (!defined("_ECRIRE_INC_VERSION")) return;
4
5// pouvoir utiliser _T_ou_typo si present
6function _TT($texte) {
7        static $T = null;
8        if (!isset($T)) {
9                $T = function_exists('_T_ou_typo') ? '_T_ou_typo' : false ;
10        }
11        $change = false;
12        // tenter de traiter les "<multi>" et "<:x:>"
13        if ($T) {
14                $t = $T($texte);
15                if ($t !== $texte) {
16                        $change = true;
17                }
18                $texte = $t;
19        }
20        // tenter comme avant avec _T(x)
21        if (!$change) {
22                $texte = _T($texte);
23        }
24       
25        return $texte;
26}
27
28
29/**
30 * Retourne la classe ChampExtra du champ demande
31 * permettant ainsi d'exploiter ses donnees.
32 *
33 * <BOUCLE_x(TABLE)>
34 *  - #CHAMP_EXTRA{nom_du_champ}
35 * </BOUCLE_x>
36 *
37 * @return ChampExtra
38**/
39function balise_CHAMP_EXTRA_dist($p) {
40        // prendre nom de la cle primaire de l'objet pour calculer sa valeur
41        $id_boucle = $p->nom_boucle ? $p->nom_boucle : $p->id_boucle;
42        $objet = $p->boucles[$id_boucle]->id_table;
43       
44        // recuperer les parametres : colonne sql (champ)
45        $colonne = interprete_argument_balise(1, $p);
46        $demande = sinon(interprete_argument_balise(2, $p), "''");
47        $p->code = "calculer_balise_CHAMP_EXTRA('$objet', $colonne, $demande)";
48        return $p;
49}
50
51// retourne un champ extra donne (sa classe) ou une propriete ou methode demandee
52function calculer_balise_CHAMP_EXTRA($objet, $colonne, $demande='') {
53        // recuperer la liste des champs extras existants
54        include_spip('cextras_pipelines');
55        if (!$c = cextras_get_extra($objet, $colonne)) {
56                return '';
57        }
58        if (!$demande) {
59                return $c; // retourner ChampExtra (attention, c'est un objet !)
60        }
61        $chaine = '';
62        if (property_exists($c, $demande)) {
63                $chaine = $c->$demande;
64        }
65        if (method_exists($c, $demande)) {
66                $chaine = $c->$demande();
67        }
68       
69        // appliquer _T ou typo
70        if (is_string($chaine) and !$p->etoile) {
71                // '<multi>' ou '<:x:>' ou 'x:y'
72                $chaine = _TT($chaine);
73        }
74       
75        return $chaine;
76}
77
78
79/**
80 * Retourne les choix possibles d'un champ extra donné
81 *
82 * #LISTER_CHOIX{champ}
83 * #LISTER_CHOIX{champ, " > "}
84 * #LISTER_CHOIX**{champ} // retourne un tableau cle/valeur
85 *
86 * @return ChampExtra
87**/
88function balise_LISTER_CHOIX_dist($p) {
89        // prendre nom de la cle primaire de l'objet pour calculer sa valeur
90        $id_boucle = $p->nom_boucle ? $p->nom_boucle : $p->id_boucle;
91        $objet = $p->boucles[$id_boucle]->id_table;
92       
93        // recuperer les parametres : colonne sql (champ)
94        $colonne = interprete_argument_balise(1, $p);
95        $separateur = interprete_argument_balise(2, $p);
96        if (!$separateur) $separateur = "', '";
97
98        // generer le code d'execution
99        $p->code = "calculer_balise_LISTER_CHOIX('$objet', $colonne)";
100               
101        // retourne un array si #LISTER_CHOIX**
102        // sinon fabrique une chaine avec le separateur designe.
103        if ($p->etoile != "**") {
104                $p->code = "join($separateur, " . $p->code . ")";
105        }
106       
107        return $p;
108}
109
110
111function calculer_balise_LISTER_CHOIX($objet, $colonne) {
112        if ($c = calculer_balise_CHAMP_EXTRA($objet, $colonne)) {
113                // saisie externe (SAISIES)
114                if (isset($c->saisie_parametres['datas']) and $c->saisie_parametres['datas']) {
115                        return $c->saisie_parametres['datas'];
116                }
117                // saisie de ce plugin
118                if ($c->enum) {
119                        $enum = cextras_enum_array($c->enum);
120                        if (!is_array($enum)) {
121                                $enum = array();
122                        }
123                        return $enum;
124                }
125        }
126        return '';
127}
128
129
130
131/*
132 * Liste les valeurs des champs de type liste (enum, radio, case)
133 * Ces champs enregistrent en base la valeur de la cle
134 * Il faut donc transcrire cle -> valeur
135 *
136 * #LISTER_VALEURS{champ}
137 * #LISTER_VALEURS{champ, " > "}
138 * #LISTER_VALEURS**{champ} // retourne un tableau cle/valeur
139 *
140 * /!\
141 * Pour des raisons d'efficacite des requetes SQL
142 * le parametre "champ" ne peut etre calcule
143 * #LISTER_VALEURS{#GET{champ}} ne peut pas fonctionner.
144 *
145 * Si cette restriction est trop limitative, on verra par la suite
146 * pour l'instant, on laisse comme ca...
147 *
148 */
149function balise_LISTER_VALEURS_dist($p) {
150        // prendre nom de la cle primaire de l'objet pour calculer sa valeur
151        $id_boucle = $p->nom_boucle ? $p->nom_boucle : $p->id_boucle;
152        $objet = $p->boucles[$id_boucle]->id_table;
153        $_id_objet = $p->boucles[$id_boucle]->primary;
154        $id_objet = champ_sql($_id_objet, $p);
155
156        // recuperer les parametres : colonne sql (champ) et separateur
157        $colonne = interprete_argument_balise(1, $p);
158        $separateur = interprete_argument_balise(2, $p);
159        if (!$separateur) $separateur = "', '";
160       
161        // demander la colonne dans la requete SQL
162        // $colonne doit etre un texte 'nom'
163        $texte_colonne = $p->param[0][1][0]->texte;
164        $valeur = champ_sql($texte_colonne, $p);
165       
166        // generer le code d'execution
167        $p->code = "calculer_balise_LISTER_VALEURS('$objet', '$_id_objet', $colonne, $id_objet, $valeur)";
168       
169        // retourne un array si #LISTER_VALEURS**
170        // sinon fabrique une chaine avec le separateur designe.
171        if ($p->etoile != "**") {
172                $p->code = "join($separateur, " . $p->code . ")";
173        }
174       
175        return $p;
176}
177
178
179// retourne un tableau de la liste des valeurs choisies pour un champ extra de table donne
180function calculer_balise_LISTER_VALEURS($objet, $_id_objet, $colonne, $id_objet, $cles) {
181        // exploser les cles !
182        $cles = explode(',', $cles);
183
184        // si pas de cles, on part aussi gentiment
185        if (!$cles) return array();
186
187        // recuperer les choix possibles
188        $choix = calculer_balise_LISTER_CHOIX($objet, $colonne);
189
190        // sortir gentiment si pas de champs declares
191        // on ne peut pas traduire les cles
192        if (!$choix) return $cles;
193
194        // correspondances...
195        foreach($choix as $cle=>$valeur) {
196                if (in_array($cle, $cles)) $vals[$cle] = $valeur;
197        }
198
199        // et voici les valeurs !
200        return $vals ? $vals : $cles;
201}
202
203
204
205?>
Note: See TracBrowser for help on using the repository browser.