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