source: spip-zone/_squelettes_/soyezcreateurs_net/trunk/plugins/soyezcreateurs/formulaires/ieconfig_import.php @ 111446

Last change on this file since 111446 was 111446, checked in by real3t@…, 2 years ago

Intégration d'un fork de IEConfig en attendant qu'il soit officiellement intégré

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