source: spip-zone/_plugins_/champs_extras2/core/cextras_balises.php @ 45361

Last change on this file since 45361 was 45361, checked in by marcimat@…, 10 years ago
  • simplification de #LISTER_VALEURS en s'appuyant sur #LISTER_CHOIX
File size: 4.8 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        if (property_exists($c, $demande)) {
37                return $c->$demande;
38        }
39        if (method_exists($c, $demande)) {
40                return $c->$demande();
41        }
42        return '';
43}
44
45
46/**
47 * Retourne les choix possibles d'un champ extra donné
48 *
49 * #LISTER_CHOIX{champ}
50 * #LISTER_CHOIX{champ, " > "}
51 * #LISTER_CHOIX**{champ} // retourne un tableau cle/valeur
52 *
53 * @return ChampExtra
54**/
55function balise_LISTER_CHOIX_dist($p) {
56        // prendre nom de la cle primaire de l'objet pour calculer sa valeur
57        $id_boucle = $p->nom_boucle ? $p->nom_boucle : $p->id_boucle;
58        $objet = $p->boucles[$id_boucle]->id_table;
59       
60        // recuperer les parametres : colonne sql (champ)
61        $colonne = interprete_argument_balise(1, $p);
62        $separateur = interprete_argument_balise(2, $p);
63        if (!$separateur) $separateur = "', '";
64
65        // generer le code d'execution
66        $p->code = "calculer_balise_LISTER_CHOIX('$objet', $colonne)";
67               
68        // retourne un array si #LISTER_CHOIX**
69        // sinon fabrique une chaine avec le separateur designe.
70        if ($p->etoile != "**") {
71                $p->code = "join($separateur, " . $p->code . ")";
72        }
73       
74        return $p;
75}
76
77
78function calculer_balise_LISTER_CHOIX($objet, $colonne) {
79        if ($c = calculer_balise_CHAMP_EXTRA($objet, $colonne)) {
80                // saisie externe (SAISIES)
81                if (isset($c->saisie_parametres['datas']) and $c->saisie_parametres['datas']) {
82                        return $c->saisie_parametres['datas'];
83                }
84                // saisie de ce plugin
85                if ($c->enum) {
86                        $enum = cextras_enum_array($c->enum);
87                        if (!is_array($enum)) {
88                                $enum = array();
89                        }
90                        return $enum;
91                }
92        }
93        return '';
94}
95
96
97
98/*
99 * Liste les valeurs des champs de type liste (enum, radio, case)
100 * Ces champs enregistrent en base la valeur de la cle
101 * Il faut donc transcrire cle -> valeur
102 *
103 * #LISTER_VALEURS{champ}
104 * #LISTER_VALEURS{champ, " > "}
105 * #LISTER_VALEURS**{champ} // retourne un tableau cle/valeur
106 *
107 * /!\
108 * Pour des raisons d'efficacite des requetes SQL
109 * le parametre "champ" ne peut etre calcule
110 * #LISTER_VALEURS{#GET{champ}} ne peut pas fonctionner.
111 *
112 * Si cette restriction est trop limitative, on verra par la suite
113 * pour l'instant, on laisse comme ca...
114 *
115 */
116function balise_LISTER_VALEURS_dist($p) {
117        // prendre nom de la cle primaire de l'objet pour calculer sa valeur
118        $id_boucle = $p->nom_boucle ? $p->nom_boucle : $p->id_boucle;
119        $objet = $p->boucles[$id_boucle]->id_table;
120        $_id_objet = $p->boucles[$id_boucle]->primary;
121        $id_objet = champ_sql($_id_objet, $p);
122
123        // recuperer les parametres : colonne sql (champ) et separateur
124        $colonne = interprete_argument_balise(1, $p);
125        $separateur = interprete_argument_balise(2, $p);
126        if (!$separateur) $separateur = "', '";
127       
128        // demander la colonne dans la requete SQL
129        // $colonne doit etre un texte 'nom'
130        $texte_colonne = $p->param[0][1][0]->texte;
131        $valeur = champ_sql($texte_colonne, $p);
132       
133        // generer le code d'execution
134        $p->code = "calculer_balise_LISTER_VALEURS('$objet', '$_id_objet', $colonne, $id_objet, $valeur)";
135       
136        // retourne un array si #LISTER_VALEURS**
137        // sinon fabrique une chaine avec le separateur designe.
138        if ($p->etoile != "**") {
139                $p->code = "join($separateur, " . $p->code . ")";
140        }
141       
142        return $p;
143}
144
145
146// retourne un tableau de la liste des valeurs choisies pour un champ extra de table donne
147function calculer_balise_LISTER_VALEURS($objet, $_id_objet, $colonne, $id_objet, $cles) {
148        // exploser les cles !
149        $cles = explode(',', $cles);
150
151        // si pas de cles, on part aussi gentiment
152        if (!$cles) return array();
153
154        // recuperer les choix possibles
155        $choix = calculer_balise_LISTER_CHOIX($objet, $colonne);
156
157        // sortir gentiment si pas de champs declares
158        // on ne peut pas traduire les cles
159        if (!$choix) return $cles;
160
161        // correspondances...
162        foreach($choix as $cle=>$valeur) {
163                if (in_array($cle, $cles)) $vals[$cle] = $valeur;
164        }
165
166        // et voici les valeurs !
167        return $vals ? $vals : $cles;
168}
169
170
171
172?>
Note: See TracBrowser for help on using the repository browser.