source: spip-zone/_plugins_/ieconfig/trunk/formulaires/ieconfig_import.php @ 111258

Last change on this file since 111258 was 111258, checked in by riedel.nobuyuki@…, 13 months ago

A nouveau des correction de bug dans l'importation

File size: 11.5 KB
Line 
1<?php
2
3if (!defined('_ECRIRE_INC_VERSION')) {
4        return;
5}
6
7function ieconfig_saisies_import() {
8        // Etape de selection du fichier
9        if (!_request('_code_yaml') or _request('annuler') or _request('importer')) {
10                $saisies = array(
11                        array(
12                                'saisie' => 'fieldset',
13                                'options' => array(
14                                        'nom' => 'ieconfig_import_choix_fichier',
15                                        'label' => '<:ieconfig:label_ieconfig_import_choix_fichier:>',
16                                        'icone' => 'img/ieconfig-import.png',
17                                ),
18                                'saisies' => array(
19                                        array(
20                                                'saisie' => 'input',
21                                                'options' => array(
22                                                        'type' => 'file',
23                                                        'nom' => 'ieconfig_import_fichier',
24                                                        'label' => '<:ieconfig:label_ieconfig_import_fichier:>',
25                                                        'explication' => '<:ieconfig:explication_ieconfig_import_fichier:>',
26                                                ),
27                                        ),
28                                        array(
29                                                'saisie' => 'selection',
30                                                'options' => array(
31                                                        'type' => 'selection',
32                                                        'nom' => 'ieconfig_import_local',
33                                                        'label' => '<:ieconfig:label_ieconfig_import_local:>',
34                                                        'explication' => '<:ieconfig:explication_ieconfig_import_local:>',
35                                                        'datas' => ieconfig_config_locales(),
36                                                ),
37                                        ),
38                                ),
39                        ),
40                );
41                // Options d'importations
42        } else {
43                include_spip('inc/yaml');
44                $config = yaml_decode(_request('_code_yaml'));
45                $texte_explication = '<b>' . _T('ieconfig:texte_nom') . '</b> ' . _T_ou_typo($config['nom']);
46                if ($config['description'] != '') {
47                        $texte_explication .= '<br /><b>' . _T('ieconfig:texte_description') . '</b> ' . _T_ou_typo($config['description']);
48                }
49                // On identifie les entrées ne correspondant pas à un plugin
50                // Ou bien non déclarées dans ieconfig_metas
51                // Convention : les clés du tableau de config correspondent aux préfixes des plugins
52                $entrees = $config;
53                unset($entrees['nom']);
54                unset($entrees['description']);
55                unset($entrees['necessite']);
56                $entrees = array_map('strtolower', array_keys($entrees));
57                $plugins = array_map('strtolower', array_keys(unserialize($GLOBALS['meta']['plugin'])));
58                $entrees_prises_en_charge = array_merge(array_keys(pipeline('ieconfig_metas', array())), $plugins);
59                $plugins_manquants = array_diff($entrees, $entrees_prises_en_charge);
60                if (count($plugins_manquants) > 0) {
61                        $texte_explication .= '<p class="reponse_formulaire reponse_formulaire_erreur">' . _T('ieconfig:texte_plugins_manquants', array('plugins' => implode(', ', $plugins_manquants))) . '</p>';
62                }
63
64                $saisies = array(
65                        array(
66                                'saisie' => 'explication',
67                                'options' => array(
68                                        'nom' => 'import_details',
69                                        'texte' => $texte_explication,
70                                ),
71                        ),
72                );
73
74                // Gestion des plugins utilisant le pipeline ieconfig_metas
75                $ieconfig_metas = array();
76                foreach (pipeline('ieconfig_metas', array()) as $prefixe => $data) {
77                        if (isset($config[$prefixe])) {
78                                if (isset($data['icone'])) {
79                                        $icone = chemin_image($data['icone']);
80                                        if (!$icone) {
81                                                $icone = find_in_path($data['icone']);
82                                        }
83                                } else {
84                                        $icone = 'config-export-16.png';
85                                }
86                                $ieconfig_metas[$prefixe] = $prefixe;
87                                $saisies[] = array(
88                                'saisie' => 'fieldset',
89                                'options' => array(
90                                        'nom' => 'metas_fieldset',
91                                        'label' => $prefixe,
92                                        'icone' => $icone,
93                                        ),
94                                'saisies' => array ( 
95                                        array(
96                                                'saisie' => 'radio',
97                                                'options' => array(
98                                                        'nom' => $prefixe,
99                                                        'label' => '<:ieconfig:ieconfig_import:>',
100                                                        'datas' => array(
101                                                                'rien' => '<:ieconfig:ieconfig_import_rien:>',
102                                                                'fusion' => '<:ieconfig:ieconfig_import_fusionner:>',
103                                                                'ecrase' => '<:ieconfig:ieconfig_import_ecraser:>',
104                                                                'fusion_inv' => '<:ieconfig:ieconfig_import_fusionner_inv:>',                                           
105                                                                ),
106                                                        'defaut' => 'fusion',
107                                                        )
108                                                )
109                                        )
110                                );
111                        }
112                }
113               
114                // On passe via le pipeline ieconfig
115                $saisies = pipeline('ieconfig', array(
116                        'args' => array(
117                                'action' => 'form_import',
118                                'config' => $config,
119                        ),
120                        'data' => $saisies,
121                ));
122        }
123        return $saisies;
124}
125
126function formulaires_ieconfig_import_charger_dist() {
127        include_spip('inc/saisies');
128        $saisies = ieconfig_saisies_import();
129        $contexte = array(
130                '_saisies' => $saisies,
131        );
132        if (_request('_code_yaml') and !_request('annuler') and !_request('importer')) {
133                $contexte['_code_yaml'] = _request('_code_yaml');
134        }
135
136        return array_merge(saisies_charger_champs($saisies), $contexte);
137}
138
139function formulaires_ieconfig_import_verifier_dist() {
140        $erreurs = array();
141        // Etape de selection du fichier
142        if (!_request('_code_yaml')) {
143                // On a rien transmis et pas de fichier local
144                if (!_request('ieconfig_import_local') and $_FILES['ieconfig_import_fichier']['name'] == '') {
145                        $erreurs['message_erreur'] = _T('ieconfig:message_erreur_fichier_import_manquant');
146                }
147        } // Options d'import
148        else {
149                include_spip('inc/saisies');
150                $erreurs = saisies_verifier(ieconfig_saisies_import());
151        }
152
153        return $erreurs;
154}
155
156function formulaires_ieconfig_import_traiter_dist() {
157        include_spip('inc/config');
158
159        // Si on est à l'étape de sélection d'un fichier de configuration
160        // On place le code YAML dans le contexte
161        if (!_request('_code_yaml')) {
162                if ($_FILES['ieconfig_import_fichier']['name'] != '') {
163                        $dir = sous_repertoire(_DIR_TMP, 'ieconfig');
164                        $hash = md5('ieimport-' . $GLOBALS['visiteur_session']['id_auteur'] . time());
165                        $fichier = $dir . $hash . '-' . $_FILES['ieconfig_import_fichier']['name'];
166                        move_uploaded_file($_FILES['ieconfig_import_fichier']['tmp_name'], $fichier);
167                        lire_fichier($fichier, $code_yaml);
168                        @unlink($fichier);
169                } else {
170                        $fichier = _request('ieconfig_import_local');
171                        lire_fichier($fichier, $code_yaml);
172                }
173                set_request('_code_yaml', $code_yaml);
174        } // Si on valide l'import
175        elseif (_request('importer') && _request('_code_yaml')) {
176                include_spip('inc/yaml');
177                $config = yaml_decode(_request('_code_yaml'));
178
179                // On passe via le pipeline ieconfig
180                $message_erreur = pipeline('ieconfig', array(
181                        'args' => array(
182                                'action' => 'import',
183                                'config' => $config,
184                        ),
185                        'data' => '',
186                ));
187
188                // Gestion des plugins utilisant le pipeline ieconfig_metas
189                foreach (pipeline('ieconfig_metas', array()) as $prefixe => $data) {
190                        //Si on veut une importation avec écrasement
191                        if ($option === 'ecrase') {
192                               
193                                if (isset($data['metas_brutes'])) {
194                                        foreach (explode(',', $data['metas_brutes']) as $meta) {
195                                                // On teste le cas ou un prefixe est indique (dernier caractere est *)
196                                                if (substr($meta, -1) == '*') {
197                                                        $p = substr($meta, 0, -1);
198                                                        foreach ($config[$prefixe] as $m => $v) {
199                                                                if (substr($m, 0, strlen($p)) == $p) {
200                                                                        ecrire_config($m . '/', $v);
201                                                                }
202                                                        }
203                                                } elseif (isset($config[$prefixe][$meta])) {
204                                                        ecrire_config($meta . '/', $config[$prefixe][$meta]);
205                                                }
206                                        }
207                                }
208                                if (isset($data['metas_serialize'])) {
209                                        foreach (explode(',', $data['metas_serialize']) as $meta) {
210                                                // On teste le cas ou un prefixe est indique (dernier caractere est *)
211                                                if (substr($meta, -1) == '*') {
212                                                        $p = substr($meta, 0, -1);
213                                                        foreach ($config[$prefixe] as $m => $v) {
214                                                                if (substr($m, 0, strlen($p)) == $p) {
215                                                                        ecrire_config($m . '/', serialize($v));
216                                                                }
217                                                        }
218                                                } elseif (isset($config[$prefixe][$meta])) {
219                                                        ecrire_config($meta . '/', serialize($config[$prefixe][$meta]));
220                                                }
221                                        }
222                                }
223                        }
224                        //Si on veut une importation avec fusion
225                        if ($option === 'fusion') {
226                               
227                                if (isset($data['metas_brutes'])) {
228                                        foreach (explode(',', $data['metas_brutes']) as $meta) {
229                                                // On teste le cas ou un prefixe est indique (dernier caractere est *)
230                                                if (substr($meta, -1) == '*') {
231                                                        $p = substr($meta, 0, -1);
232                                                        foreach ($config[$prefixe] as $m => $v) {
233                                                                if (substr($m, 0, strlen($p)) == $p) {
234                                                                        $sc = lire_config($m . '/', $v);
235                                                                        $v = array_merge($sc,$v);
236                                                                        ecrire_config($m . '/', $v);
237                                                                }
238                                                        }
239                                                } elseif (isset($config[$prefixe][$meta])) {
240                                                        $sc = lire_config($meta . '/', $config[$prefixe][$meta]);
241                                                        $config[$prefixe][$meta] = array_merge($sc,$config[$prefixe][$meta]);
242                                                        ecrire_config($meta . '/', $config[$prefixe][$meta]);
243                                                }
244                                        }
245                                }
246                                if (isset($data['metas_serialize'])) {
247                                        foreach (explode(',', $data['metas_serialize']) as $meta) {
248                                                // On teste le cas ou un prefixe est indique (dernier caractere est *)
249                                                if (substr($meta, -1) == '*') {
250                                                        $p = substr($meta, 0, -1);
251                                                        foreach ($config[$prefixe] as $m => $v) {
252                                                                if (substr($m, 0, strlen($p)) == $p) {
253                                                                        $sc = lire_config($m . '/', serialize($v));
254                                                                        $v = array_merge($sc,$v);
255                                                                        ecrire_config($m . '/', serialize($v));
256                                                                }
257                                                        }
258                                                } elseif (isset($config[$prefixe][$meta])) {
259                                                        $sc = lire_config($meta . '/', serialize($config[$prefixe][$meta]));
260                                                        $config[$prefixe][$meta] = array_merge($sc,$config[$prefixe][$meta]);
261                                                        ecrire_config($meta . '/', serialize($config[$prefixe][$meta]));
262                                                }
263                                        }
264                                }
265                        }
266                        //Si on veut une importation avec fusion_inv
267                        if ($option === 'fusion_inv') {
268                                if (isset($data['metas_brutes'])) {
269                                        foreach (explode(',', $data['metas_brutes']) as $meta) {
270                                                // On teste le cas ou un prefixe est indique (dernier caractere est *)
271                                                if (substr($meta, -1) == '*') {
272                                                        $p = substr($meta, 0, -1);
273                                                        foreach ($config[$prefixe] as $m => $v) {
274                                                                if (substr($m, 0, strlen($p)) == $p) {
275                                                                        $sc = lire_config($m . '/', $v);
276                                                                        $v = array_merge($v,$sc);
277                                                                        ecrire_config($m . '/', $v);
278                                                                }
279                                                        }
280                                                } elseif (isset($config[$prefixe][$meta])) {
281                                                        $sc = lire_config($meta . '/', $config[$prefixe][$meta]);
282                                                        $config[$prefixe][$meta] = array_merge($config[$prefixe][$meta],$sc);
283                                                        ecrire_config($meta . '/', $config[$prefixe][$meta]);
284                                                }
285                                        }
286                                }
287                                if (isset($data['metas_serialize'])) {
288                                        foreach (explode(',', $data['metas_serialize']) as $meta) {
289                                                // On teste le cas ou un prefixe est indique (dernier caractere est *)
290                                                if (substr($meta, -1) == '*') {
291                                                        $p = substr($meta, 0, -1);
292                                                        foreach ($config[$prefixe] as $m => $v) {
293                                                                if (substr($m, 0, strlen($p)) == $p) {
294                                                                        $sc = lire_config($m . '/', serialize($v));
295                                                                        $v = array_merge($v,$sc);
296                                                                        ecrire_config($m . '/', serialize($v));
297                                                                }
298                                                        }
299                                                } elseif (isset($config[$prefixe][$meta])) {
300                                                        $sc = lire_config($meta . '/', serialize($config[$prefixe][$meta]));
301                                                        $config[$prefixe][$meta] = array_merge($config[$prefixe][$meta],$sc);
302                                                        ecrire_config($meta . '/', serialize($config[$prefixe][$meta]));
303                                                }
304                                        }
305                                }
306                        }
307                }
308
309                if ($message_erreur != '') {
310                        return array('message_erreur' => $message_erreur);
311                } else {
312                        return array('message_ok' => _T('ieconfig:message_ok_import'));
313                }
314        }
315}
316
317// Renvoie la liste des fichiers de configurations présents dans un sous-répertoires ieconfig/
318function ieconfig_config_locales() {
319        static $liste_config = null;
320
321        if (is_null($liste_config)) {
322                include_spip('inc/yaml');
323                $liste_config = array();
324                $match = '.+[.]yaml$';
325                foreach (array_merge(find_all_in_path('ieconfig/', $match), find_all_in_path(_DIR_TMP . 'ieconfig/', $match)) as $fichier => $chemin) {
326                        $config = yaml_decode_file($chemin);
327                        // On regarde s'il y a un necessite
328                        $ok = true;
329                        if (isset($config['necessite'])) {
330                                if (!is_array($config['necessite'])) {
331                                        $config['necessite'] = array($config['necessite']);
332                                }
333                                foreach ($config['necessite'] as $plugin) {
334                                        if (!defined('_DIR_PLUGIN_' . strtoupper($plugin))) {
335                                                $ok = false;
336                                        }
337                                }
338                        }
339                        //on vérifie s'il y a un champs nom
340                        if ($ok) {
341                                if (isset($config['nom'])) {
342                                        $liste_config[$chemin] = _T_ou_typo($config['nom']);
343                                } else {
344                                        $liste_config[$chemin] = $fichier;
345                                }
346                        }
347                }
348        }
349
350        return $liste_config;
351}
Note: See TracBrowser for help on using the repository browser.