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

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

Appliquer sur #CHAMP_EXTRA, s'il retourne un texte, typo(texte) (si présence de <multi>) sinon _T(texte).

Utiliser #CHAMP_EXTRA* pour ne plus avoir ce filtre par défaut.

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