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