[SPIP] +2.1.12
[velocampus/web/www.git] / www / plugins / auto / spip-bonux / configurer / pipelines.php
1 <?php
2 /*
3 * Plugin xxx
4 * (c) 2009 xxx
5 * Distribue sous licence GPL
6 *
7 */
8
9 if (!defined("_ECRIRE_INC_VERSION")) return;
10
11 /**
12 * Proposer un chargement par defaut pour les #FORMULAIRE_CONFIGURER_XXX
13 *
14 * @param array $flux
15 * @return array
16 */
17 function spip_bonux_formulaire_charger($flux){
18 if ($form = $flux['args']['form']
19 AND strncmp($form,'configurer_',11)==0 // un #FORMULAIRE_CONFIGURER_XXX
20 AND !charger_fonction("charger","formulaires/$form/",true) // sans fonction charger()
21 #AND !$flux['data'] // ne pas ecraser ce que des plugins on peut etre deja remplis (tq _saisies)
22 ) {
23
24 $flux['data'] = spip_bonux_formulaires_configurer_recense($form);
25 $flux['data']['editable'] = true;
26 if (_request('var_mode')=='configurer' AND autoriser('webmestre')){
27 if (!_AJAX) var_dump($flux['data']);
28 // reinjecter pour la trace au traitement
29 $flux['data']['_hidden'] = "<input type='hidden' name='var_mode' value='configurer' />";
30 }
31 }
32 return $flux;
33 }
34
35 /**
36 * Proposer un traitement par defaut pour les #FORMULAIRE_CONFIGURER_XXX
37 *
38 * @param array $flux
39 * @return array
40 */
41 function spip_bonux_formulaire_traiter($flux){
42 if ($form = $flux['args']['form']
43 AND strncmp($form,'configurer_',11)==0 // un #FORMULAIRE_CONFIGURER_XXX
44 AND !charger_fonction("traiter","formulaires/$form/",true) // sans fonction charger()
45 ) {
46
47 // charger les valeurs
48 // ce qui permet de prendre en charge une fonction charger() existante
49 // qui prend alors la main sur l'auto detection
50 if ($charger_valeurs = charger_fonction("charger","formulaires/$form/",true))
51 $valeurs = call_user_func_array($charger_valeurs,$flux['args']['args']);
52 $valeurs = pipeline(
53 'formulaire_charger',
54 array(
55 'args'=>array('form'=>$form,'args'=>$flux['args']['args'],'je_suis_poste'=>false),
56 'data'=>$valeurs)
57 );
58 // ne pas stocker editable !
59 unset($valeurs['editable']);
60
61 // recuperer les valeurs postees
62 $store = array();
63 foreach($valeurs as $k=>$v){
64 if (substr($k,0,1)!=='_')
65 $store[$k] = _request($k);
66 }
67
68 $trace = spip_bonux_configurer_stocker($form,$valeurs,$store);
69
70 $flux['data'] = array('message_ok'=>_T('config_info_enregistree').$trace,'editable'=>true);
71 }
72 return $flux;
73 }
74
75 /**
76 * Retrouver les champs d'un formulaire en parcourant son squelette
77 * et en extrayant les balises input, textarea, select
78 *
79 * @param string $form
80 * @return array
81 */
82 function spip_bonux_formulaires_configurer_recense($form){
83 $valeurs = array();
84
85 // traiter d'abord le cas fichier yaml de description
86
87 // TODO
88
89 // sinon cas analyse du squelette
90 if ($f = find_in_path($form.'.' . _EXTENSION_SQUELETTES, 'formulaires/')
91 AND lire_fichier($f, $contenu)) {
92
93 for ($i=0;$i<2;$i++) {
94 // a la seconde iteration, evaluer le fond avec les valeurs deja trouvees
95 // permet de trouver aussi les name="#GET{truc}"
96 if ($i==1) $contenu = recuperer_fond("formulaires/$form",array_merge($valeurs,array('editable'=>' ')));
97
98 $balises = array_merge(extraire_balises($contenu,'input'),
99 extraire_balises($contenu,'textarea'),
100 extraire_balises($contenu,'select'));
101
102 foreach($balises as $b) {
103 if ($n = extraire_attribut($b, 'name')
104 AND preg_match(",^([\w\-]+)(\[\w*\])*$,",$n,$r)
105 AND !in_array($n,array('formulaire_action','formulaire_action_args'))
106 AND extraire_attribut($b,'type')!=='submit') {
107 $valeurs[$r[1]] = '';
108 // recuperer les valeurs _meta_xx qui peuvent etre fournies
109 // en input hidden dans le squelette
110 if (strncmp($r[1],'_meta_',6)==0)
111 $valeurs[$r[1]] = extraire_attribut($b,'value');
112 }
113 }
114 }
115 }
116
117
118 spip_bonux_configurer_lire_meta($form,$valeurs);
119 return $valeurs;
120 }
121
122 /**
123 * Definir la regle de conteneur, en fonction de la presence
124 * des
125 * _meta_table : nom de la table meta ou stocker (par defaut 'meta')
126 * _meta_casier : nom du casier dans lequel serializer (par defaut xx de formulaire_configurer_xx)
127 * _meta_prefixe : prefixer les meta (alternative au casier) dans la table des meta (par defaur rien)
128 *
129 * @param string $form
130 * @param array $valeurs
131 */
132 function spip_bonux_definir_configurer_conteneur($form,$valeurs) {
133 // stocker en base
134 // par defaut, dans un casier serialize dans spip_meta (idem CFG)
135 $casier = substr($form,11);
136 $table = 'meta';
137 $prefixe = '';
138
139 // si on indique juste une table, il faut vider les autres proprietes
140 // car par defaut on utilise ni casier ni prefixe dans ce cas
141 if (isset($valeurs['_meta_table'])) {
142 $table = $valeurs['_meta_table'];
143 $casier = (isset($valeurs['_meta_casier'])?$valeurs['_meta_casier']:'');
144 $prefixe = (isset($valeurs['_meta_prefixe'])?$valeurs['_meta_prefixe']:'');
145 }
146 else {
147 if(isset($valeurs['_meta_casier']))
148 $casier = $valeurs['_meta_casier'];
149 if(isset($valeurs['_meta_prefixe']))
150 $prefixe = $valeurs['_meta_prefixe'];
151 }
152
153 return array($table,$casier,$prefixe);
154 }
155
156 /**
157 * Stocker les metas
158 * @param <type> $form
159 * @param <type> $valeurs
160 * @param <type> $store
161 */
162 function spip_bonux_configurer_stocker($form,$valeurs,$store) {
163 $trace = '';
164 list($table,$casier,$prefixe) = spip_bonux_definir_configurer_conteneur($form,$valeurs);
165 // stocker en base
166 // par defaut, dans un casier serialize dans spip_meta (idem CFG)
167 if (!isset($GLOBALS[$table]))
168 lire_metas($table);
169
170 // le casier peut etre de la forme casierprincipal/sous/casier
171 // on ecrit donc au bon endroit sans perdre les autres sous casier freres
172 if ($casier) {
173 $c = explode('/',$casier);
174 $casier_principal = array_shift($c);
175 $st = isset($GLOBALS[$table][$casier_principal])?$GLOBALS[$table][$casier_principal]:array();
176 if (is_string($st) AND (count($c) OR is_array($store))) {
177 $st = unserialize($st);
178 if ($st===false)
179 $st=array();
180 }
181 $sc = &$st;
182 while (count($c) AND $cc=reset($c)) {
183 // creer l'entree si elle n'existe pas
184 if (!isset($sc[$cc]))
185 $sc[$cc] = array();
186 $sc = &$sc[$cc];
187 array_shift($c);
188 }
189 if (is_array($sc) AND count($sc))
190 $sc = array_merge($sc,$store);
191 else
192 $sc = $store;
193 $store = array($casier_principal => serialize($st));
194 }
195
196 $prefixe = ($prefixe?$prefixe.'_':'');
197 foreach($store as $k=>$v){
198 ecrire_meta($prefixe.$k, $v, true, $table);
199 if (_request('var_mode')=='configurer' AND autoriser('webmestre')){
200 $trace .= "<br />table $table : ".$prefixe.$k." = $v;";
201 }
202 }
203 return $trace;
204 }
205
206 function spip_bonux_configurer_lire_meta($form,&$valeurs) {
207 list($table,$casier,$prefixe) = spip_bonux_definir_configurer_conteneur($form,$valeurs);
208
209 $prefixe = ($prefixe?$prefixe.'_':'');
210 if ($casier) {
211 $meta = spip_bonux_lire_config("/$table/$prefixe$casier");
212 $prefixe = '';
213 }
214 else {
215 $meta = spip_bonux_lire_config("/$table");
216 }
217
218 foreach($valeurs as $k=>$v){
219 if (substr($k,0,1)!=='_')
220 $valeurs[$k] = (isset($meta[$prefixe.$k])?$meta[$prefixe.$k]:'');
221 }
222 }
223
224 /**
225 * Lecture de la configuration
226 *
227 * lire_config() permet de recuperer une config depuis le php<br>
228 * memes arguments que la balise (forcement)<br>
229 * $cfg: la config, lire_config('montruc') est un tableau<br>
230 * lire_config('/table/champ') lit le valeur de champ dans la table des meta 'table'<br>
231 * lire_config('montruc/sub') est l'element "sub" de cette config equivalent a lire_config('/meta/montruc/sub')<br>
232 *
233 * $unserialize est mis par l'histoire
234 *
235 * @param string $cfg la config
236 * @param mixed $def un défaut optionnel
237 * @param boolean $unserialize n'affecte que le dépôt 'meta'
238 * @return string
239 */
240 function spip_bonux_lire_config($cfg='', $def=null, $unserialize=true) {
241 // lire le stockage sous la forme /table/valeur
242 // ou valeur qui est en fait implicitement /meta/valeur
243 // ou casier/valeur qui est en fait implicitement /meta/casier/valeur
244 if ($cfg AND strpos($cfg,'/')===false){
245 return isset($GLOBALS['meta'][$cfg])?
246 ((!$unserialize OR ($t=unserialize($GLOBALS['meta'][$cfg]))===false)?$GLOBALS['meta'][$cfg]:$t)
247 :$def;
248 }
249
250 // par defaut, sur la table des meta
251 $table = 'meta';
252 $cfg = explode('/',$cfg);
253 // si le premier argument est vide, c'est une syntaxe /table/ ou un appel vide ''
254 if (!reset($cfg) AND count($cfg)>1) {
255 array_shift($cfg);
256 if (count($cfg)) $table = array_shift($cfg);
257 if (!isset($GLOBALS[$table]))
258 lire_metas($table);
259 if (!isset($GLOBALS[$table]))
260 return $def;
261 }
262
263 $r = $GLOBALS[$table];
264
265 // si on a demande #CONFIG{/meta,'',0}
266 if (!count($cfg))
267 return $unserialize ? $r : serialize($r);
268
269 $deserialize = false; // on ne deserialise qu'une seule fois...
270 while($casier = array_shift($cfg)) {
271 $r = isset($r[$casier])?$r[$casier]:null;
272 // deserializer tant que c'est necessaire
273 if (!$deserialize AND $r AND is_string($r) AND (count($cfg) OR $unserialize)) {
274 $deserialize = true;
275 $r = unserialize($r);
276 }
277 }
278
279 if (is_null($r)) return $def;
280 return $r;
281 }
282
283
284 if (!function_exists('balise_CONFIG')) {
285 /**
286 * #CONFIG retourne lire_config()
287 *
288 * Le 3eme argument permet de controler la serialisation du resultat
289 * (mais ne sert que pour le depot 'meta') qui doit parfois deserialiser
290 *
291 * ex: |in_array{#CONFIG{toto,#ARRAY,1}}.
292 *
293 * Ceci n'affecte pas d'autres depots et |in_array{#CONFIG{toto/,#ARRAY}} sera equivalent
294 * #CONFIG{/tablemeta/champ,defaut} lit la valeur de 'champ' dans la table des meta 'tablemeta'
295 *
296 * @param Object $p Arbre syntaxique du compilo
297 * @return Object
298 */
299 function balise_CONFIG($p) {
300 if (!$arg = interprete_argument_balise(1,$p)) {
301 $arg = "''";
302 }
303 $sinon = interprete_argument_balise(2,$p);
304 $unserialize = sinon(interprete_argument_balise(3,$p),"false");
305
306 $p->code = 'spip_bonux_lire_config(' . $arg . ',' .
307 ($sinon && $sinon != "''" ? $sinon : 'null') . ',' . $unserialize . ')';
308
309 return $p;
310 }
311 }
312
313 include_spip('inc/config');
314 ?>