[SPIP] ~maj 3.0.10 --> 3.0.14
[lhc/web/www.git] / www / ecrire / inc / cvt_configurer.php
1 <?php
2
3 /***************************************************************************\
4 * SPIP, Systeme de publication pour l'internet *
5 * *
6 * Copyright (c) 2001-2014 *
7 * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James *
8 * *
9 * Ce programme est un logiciel libre distribue sous licence GNU/GPL. *
10 * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. *
11 \***************************************************************************/
12
13 if (!defined('_ECRIRE_INC_VERSION')) return;
14
15 include_spip('inc/config');
16
17 /**
18 * Proposer un chargement par defaut pour les #FORMULAIRE_CONFIGURER_XXX
19 *
20 * @param array $flux
21 * @return array
22 */
23 function cvtconf_formulaire_charger($flux){
24 if ($form = $flux['args']['form']
25 AND strncmp($form,'configurer_',11)==0 // un #FORMULAIRE_CONFIGURER_XXX
26 AND !charger_fonction("charger","formulaires/$form/",true) // sans fonction charger()
27 ) {
28
29 $flux['data'] = cvtconf_formulaires_configurer_recense($form);
30 $flux['data']['editable'] = true;
31 if (_request('var_mode')=='configurer' AND autoriser('webmestre')){
32 if (!_AJAX) var_dump($flux['data']);
33 // reinjecter pour la trace au traitement
34 $flux['data']['_hidden'] = "<input type='hidden' name='var_mode' value='configurer' />";
35 }
36 }
37 return $flux;
38 }
39
40 /**
41 * Proposer un traitement par defaut pour les #FORMULAIRE_CONFIGURER_XXX
42 *
43 * @param array $flux
44 * @return array
45 */
46 function cvtconf_formulaire_traiter($flux){
47 if ($form = $flux['args']['form']
48 AND strncmp($form,'configurer_',11)==0 // un #FORMULAIRE_CONFIGURER_XXX
49 AND !charger_fonction("traiter","formulaires/$form/",true) // sans fonction traiter()
50 ) {
51 $trace = cvtconf_formulaires_configurer_enregistre($form,$flux['args']['args']);
52 $flux['data'] = array('message_ok'=>_T('config_info_enregistree').$trace,'editable'=>true);
53 }
54 return $flux;
55 }
56
57 /**
58 * Enregistrer les donnees d'un formulaire $form appele avec les arguments $args
59 * Cette fonction peut etre appellee manuellement et explicitement depuis la fonction traiter()
60 * d'un formulaire configurer_xxx dont on veut personaliser le traitement
61 * sans reecrire le stockage des donnees
62 *
63 * @param string $form
64 * nom du formulaire "configurer_xxx"
65 * @param array $args
66 * arguments de l'appel de la fonction traiter ($args = func_get_args();)
67 * @return string
68 */
69 function cvtconf_formulaires_configurer_enregistre($form,$args){
70 $valeurs = array();
71 // charger les valeurs
72 // ce qui permet de prendre en charge une fonction charger() existante
73 // qui prend alors la main sur l'auto detection
74 if ($charger_valeurs = charger_fonction("charger","formulaires/$form/",true))
75 $valeurs = call_user_func_array($charger_valeurs,$args);
76 $valeurs = pipeline(
77 'formulaire_charger',
78 array(
79 'args'=>array('form'=>$form,'args'=>$args,'je_suis_poste'=>false),
80 'data'=>$valeurs)
81 );
82 // ne pas stocker editable !
83 unset($valeurs['editable']);
84
85 // recuperer les valeurs postees
86 $store = array();
87 foreach($valeurs as $k=>$v){
88 if (substr($k,0,1)!=='_')
89 $store[$k] = _request($k);
90 }
91
92 return cvtconf_configurer_stocker($form,$valeurs,$store);
93 }
94
95 /**
96 * Definir la regle de conteneur, en fonction de la presence
97 * des
98 * _meta_table : nom de la table meta ou stocker (par defaut 'meta')
99 * _meta_casier : nom du casier dans lequel serializer (par defaut xx de formulaire_configurer_xx)
100 * _meta_prefixe : prefixer les meta (alternative au casier) dans la table des meta (par defaur rien)
101 * _meta_stockage : Methode externe de stockage. Aucune n'est fournie par le core.
102 *
103 * @param string $form
104 * @param array $valeurs
105 * @return array
106 */
107 function cvtconf_definir_configurer_conteneur($form,$valeurs) {
108 // stocker en base
109 // par defaut, dans un casier serialize dans spip_meta (idem CFG)
110 $casier = substr($form,11);
111 $table = 'meta';
112 $prefixe = '';
113 $stockage = '';
114
115 if (isset($valeurs['_meta_casier'])) $casier = $valeurs['_meta_casier'];
116 if (isset($valeurs['_meta_prefixe'])) $prefixe = $valeurs['_meta_prefixe'];
117 if (isset($valeurs['_meta_stockage'])) $stockage = $valeurs['_meta_stockage'] . '::';
118
119 // si on indique juste une table, il faut vider les autres proprietes
120 // car par defaut on utilise ni casier ni prefixe dans ce cas
121 if (isset($valeurs['_meta_table'])) {
122 $table = $valeurs['_meta_table'];
123 $casier = (isset($valeurs['_meta_casier'])?$valeurs['_meta_casier']:'');
124 }
125
126 return array($table,$casier,$prefixe,$stockage);
127 }
128
129 /**
130 * Retrouver les champs d'un formulaire en parcourant son squelette
131 * et en extrayant les balises input, textarea, select
132 *
133 * @param string $form
134 * @return array
135 */
136 function cvtconf_formulaires_configurer_recense($form){
137 $valeurs = array('editable'=>' ');
138
139 // sinon cas analyse du squelette
140 if ($f = find_in_path($form.'.' . _EXTENSION_SQUELETTES, 'formulaires/')
141 AND lire_fichier($f, $contenu)) {
142
143 for ($i=0;$i<2;$i++) {
144 // a la seconde iteration, evaluer le fond avec les valeurs deja trouvees
145 // permet de trouver aussi les name="#GET{truc}"
146 if ($i==1) $contenu = recuperer_fond("formulaires/$form",$valeurs);
147
148 $balises = array_merge(extraire_balises($contenu,'input'),
149 extraire_balises($contenu,'textarea'),
150 extraire_balises($contenu,'select'));
151
152 foreach($balises as $b) {
153 if ($n = extraire_attribut($b, 'name')
154 AND preg_match(",^([\w\-]+)(\[\w*\])?$,",$n,$r)
155 AND !in_array($n,array('formulaire_action','formulaire_action_args'))
156 AND extraire_attribut($b,'type')!=='submit') {
157 $valeurs[$r[1]] = '';
158 // recuperer les valeurs _meta_xx qui peuvent etre fournies
159 // en input hidden dans le squelette
160 if (strncmp($r[1],'_meta_',6)==0)
161 $valeurs[$r[1]] = extraire_attribut($b,'value');
162 }
163 }
164 }
165 }
166
167
168 cvtconf_configurer_lire_meta($form,$valeurs);
169 return $valeurs;
170 }
171
172 /**
173 * Stocker les metas
174 * @param string $form
175 * @param array $valeurs
176 * @param array $store
177 * @return string
178 */
179 function cvtconf_configurer_stocker($form,$valeurs,$store) {
180 $trace = '';
181 list($table,$casier,$prefixe,$stockage) = cvtconf_definir_configurer_conteneur($form,$valeurs);
182 // stocker en base
183 // par defaut, dans un casier serialize dans spip_meta (idem CFG)
184 if (!isset($GLOBALS[$table]))
185 lire_metas($table);
186
187 $prefixe = ($prefixe?$prefixe.'_':'');
188 $table = ($table) ? "/$table/" : "";
189 $casier = ($casier) ? rtrim($casier,'/').'/' : ""; // slash final, sinon rien
190
191 foreach($store as $k=>$v){
192 ecrire_config("$stockage$table$prefixe$casier$k", $v);
193 if (_request('var_mode')=='configurer' AND autoriser('webmestre')){
194 $trace .= "<br />table $table : ".$prefixe.$k." = $v;";
195 }
196 }
197 return $trace;
198 }
199
200 /**
201 * Lecture en base des metas d'un form
202 * @param string $form
203 * @param array $valeurs
204 */
205 function cvtconf_configurer_lire_meta($form,&$valeurs) {
206 list($table,$casier,$prefixe,$stockage) = cvtconf_definir_configurer_conteneur($form,$valeurs);
207
208 $table = ($table) ? "/$table/" : "";
209 $prefixe = ($prefixe?$prefixe.'_':'');
210 if ($casier) {
211 $meta = lire_config("$stockage$table$prefixe$casier");
212 $prefixe = '';
213 }
214 else {
215 $table = rtrim($table, '/');
216 $meta = lire_config("$stockage$table");
217 }
218
219 foreach($valeurs as $k=>$v){
220 if (substr($k,0,1)!=='_')
221 $valeurs[$k] = (isset($meta[$prefixe.$k])?$meta[$prefixe.$k]:'');
222 }
223 }
224
225
226 ?>