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

Last change on this file since 74705 was 74705, checked in by joseph@…, 6 years ago

Dans le pipeline ieconfig_metas, pouvoir spécifier, avec *, un préfixe de métas à importer/exporter. Ainsi, si on indique "pre_*", toutes les métas commencant par "pre_" seront exportées.

File size: 8.1 KB
Line 
1<?php
2
3if (!defined("_ECRIRE_INC_VERSION")) return;
4
5function ieconfig_saisies_import(){
6        // Etape de selection du fichier
7        if (!_request('_code_yaml') or _request('annuler') or _request('importer')){
8                $saisies = array(
9                        array(
10                                'saisie' => 'fieldset',
11                                'options' => array(
12                                        'nom' => 'ieconfig_import_choix_fichier',
13                                        'label' => '<:ieconfig:label_ieconfig_import_choix_fichier:>',
14                                        'icone' => 'img/ieconfig-import.png'
15                                ),
16                                'saisies' => array(
17                                        array(
18                                                'saisie' => 'input',
19                                                'options' => array(
20                                                        'type' => 'file',
21                                                        'nom' => 'ieconfig_import_fichier',
22                                                        'label' => '<:ieconfig:label_ieconfig_import_fichier:>',
23                                                        'explication' => '<:ieconfig:explication_ieconfig_import_fichier:>'
24                                                )
25                                        ),
26                                        array(
27                                                'saisie' => 'selection',
28                                                'options' => array(
29                                                        'type' => 'selection',
30                                                        'nom' => 'ieconfig_import_local',
31                                                        'label' => '<:ieconfig:label_ieconfig_import_local:>',
32                                                        'explication' => '<:ieconfig:explication_ieconfig_import_local:>',
33                                                        'datas' => ieconfig_config_locales()
34                                                )
35                                        )
36                                )
37                        )
38                );
39                // Options d'importations
40        } else {
41                include_spip('inc/yaml');
42                $config = yaml_decode(_request('_code_yaml'));
43                $texte_explication = '<b>' . _T('ieconfig:texte_nom') . '</b> ' . _T_ou_typo($config['nom']);
44                if ($config['description']!='')
45                        $texte_explication .= '<br /><b>' . _T('ieconfig:texte_description') . '</b> ' . _T_ou_typo($config['description']);
46                // On identifie les entrées ne correspondant pas à un plugin
47                // Ou bien non déclarées dans ieconfig_metas
48                // Convention : les clés du tableau de config correspondent aux préfixes des plugins
49                $entrees = $config;
50                unset($entrees['nom']);
51                unset($entrees['description']);
52                unset($entrees['necessite']);
53                $entrees = array_map('strtolower', array_keys($entrees));
54                $plugins = array_map('strtolower', array_keys(unserialize($GLOBALS['meta']['plugin'])));
55                $entrees_prises_en_charge = array_merge(array_keys(pipeline('ieconfig_metas', array())), $plugins);
56                $plugins_manquants = array_diff($entrees, $entrees_prises_en_charge);
57                if (count($plugins_manquants)>0)
58                        $texte_explication .= '<p class="reponse_formulaire reponse_formulaire_erreur">' . _T('ieconfig:texte_plugins_manquants', array('plugins' => implode(', ', $plugins_manquants))) . '</p>';
59
60                $saisies = array(
61                        array(
62                                'saisie' => 'explication',
63                                'options' => array(
64                                        'nom' => 'import_details',
65                                        'texte' => $texte_explication
66                                )
67                        )
68                );
69
70                // Gestion des plugins utilisant le pipeline ieconfig_metas
71                $ieconfig_metas = array();
72                foreach (pipeline('ieconfig_metas', array()) as $prefixe => $data){
73                        if (isset($config[$prefixe])){
74                                if (isset($data['icone'])){
75                                        $icone = chemin_image($data['icone']);
76                                        if (!$icone) $icone = find_in_path($data['icone']);
77                                        if ($icone) $icone = '<img src="' . $icone . '" alt="" style="margin-left:-50px; margin-right:34px;" />';
78                                } else $icone = '';
79                                $ieconfig_metas[$prefixe] = $icone . (isset($data['titre']) ? $data['titre'] : $prefixe);
80                        }
81                }
82                if (count($ieconfig_metas)>0)
83                        $saisies[] = array(
84                                'saisie' => 'fieldset',
85                                'options' => array(
86                                        'nom' => 'metas_fieldset',
87                                        'label' => _T('ieconfig:label_importer_metas'),
88                                        'icone' => 'config-export-16.png'
89                                ),
90                                'saisies' => array(
91                                        array(
92                                                'saisie' => 'checkbox',
93                                                'options' => array(
94                                                        'nom' => 'import_metas',
95                                                        'label' => _T('ieconfig:label_importer'),
96                                                        'tout_selectionner' => 'oui',
97                                                        'datas' => $ieconfig_metas
98                                                )
99                                        )
100                                )
101                        );
102
103                // On passe via le pipeline ieconfig
104                $saisies = pipeline('ieconfig', array(
105                        'args' => array(
106                                'action' => 'form_import',
107                                'config' => $config
108                        ),
109                        'data' => $saisies
110                ));
111        }
112
113        return $saisies;
114}
115
116function formulaires_ieconfig_import_charger_dist(){
117        include_spip('inc/saisies');
118        $saisies = ieconfig_saisies_import();
119        $contexte = array(
120                '_saisies' => $saisies,
121        );
122        if (_request('_code_yaml') and !_request('annuler') and !_request('importer'))
123                $contexte['_code_yaml'] = _request('_code_yaml');
124        return array_merge(saisies_charger_champs($saisies), $contexte);
125}
126
127function formulaires_ieconfig_import_verifier_dist(){
128        $erreurs = array();
129        // Etape de selection du fichier
130        if (!_request('_code_yaml')){
131                // On a rien transmis et pas de fichier local
132                if (!_request('ieconfig_import_local') AND $_FILES['ieconfig_import_fichier']['name']=='')
133                        $erreurs['message_erreur'] = _T('ieconfig:message_erreur_fichier_import_manquant');
134        } // Options d'import
135        else {
136                include_spip('inc/saisies');
137                $erreurs = saisies_verifier(ieconfig_saisies_import());
138        }
139        return $erreurs;
140}
141
142function formulaires_ieconfig_import_traiter_dist(){
143
144        include_spip('inc/config');
145
146        // Si on est à l'étape de sélection d'un fichier de configuration
147        // On place le code YAML dans le contexte
148        if (!_request('_code_yaml')){
149                if ($_FILES['ieconfig_import_fichier']['name']!=''){
150                        $dir = sous_repertoire(_DIR_TMP, 'ieconfig');
151                        $hash = md5("ieimport-".$GLOBALS['visiteur_session']['id_auteur'].time());
152                        $fichier = $dir . $hash . "-" . $_FILES['ieconfig_import_fichier']['name'];
153                        move_uploaded_file($_FILES['ieconfig_import_fichier']['tmp_name'],$fichier);
154                        lire_fichier($fichier, $code_yaml);
155                        @unlink($fichier);
156                }
157                else {
158                        $fichier = _request('ieconfig_import_local');
159                        lire_fichier($fichier, $code_yaml);
160                }
161                set_request('_code_yaml', $code_yaml);
162        } // Si on valide l'import
163        elseif (_request('importer') && _request('_code_yaml')) {
164                include_spip('inc/yaml');
165                $config = yaml_decode(_request('_code_yaml'));
166
167                // On passe via le pipeline ieconfig
168                $message_erreur = pipeline('ieconfig', array(
169                        'args' => array(
170                                'action' => 'import',
171                                'config' => $config
172                        ),
173                        'data' => ''
174                ));
175
176                // Gestion des plugins utilisant le pipeline ieconfig_metas
177                $import_metas = _request('import_metas');
178                if (!is_array($import_metas)) $import_metas = array();
179
180
181                foreach (pipeline('ieconfig_metas', array()) as $prefixe => $data){
182                        if (in_array($prefixe, $import_metas) && isset($config[$prefixe])){
183                                if (isset($data['metas_brutes']))
184                                        foreach (explode(',', $data['metas_brutes']) as $meta) {
185                                                // On teste le cas ou un prefixe est indique (dernier caractere est *)
186                                                if (substr($meta,-1)=='*') {
187                                                        $p = substr($meta,0,-1);
188                                                        foreach ($config[$prefixe] as $m => $v) {
189                                                                if (substr($m,0,strlen($p))==$p)
190                                                                        ecrire_config($m . '/', $v);
191                                                        }
192                                                } elseif (isset($config[$prefixe][$meta]))
193                                                        ecrire_config($meta . '/', $config[$prefixe][$meta]);
194                                        }
195                                if (isset($data['metas_serialize']))
196                                        foreach (explode(',', $data['metas_serialize']) as $meta) {
197                                                // On teste le cas ou un prefixe est indique (dernier caractere est *)
198                                                if (substr($meta,-1)=='*') {
199                                                        $p = substr($meta,0,-1);
200                                                        foreach ($config[$prefixe] as $m => $v) {
201                                                                if (substr($m,0,strlen($p))==$p)
202                                                                        ecrire_config($m . '/', serialize($v));
203                                                        }
204                                                } elseif (isset($config[$prefixe][$meta]))
205                                                        ecrire_config($meta . '/', serialize($config[$prefixe][$meta]));
206                                        }
207                        }
208                }
209
210
211                if ($message_erreur!='')
212                        return array('message_erreur' => $message_erreur);
213                else
214                        return array('message_ok' => _T('ieconfig:message_ok_import'));
215        }
216}
217
218// Renvoie la liste des fichiers de configurations présents dans un sous-répertoires ieconfig/
219function ieconfig_config_locales(){
220        static $liste_config = null;
221
222        if (is_null($liste_config)){
223                include_spip('inc/yaml');
224                $liste_config = array();
225                $match = ".+[.]yaml$";
226                foreach (array_merge(find_all_in_path('ieconfig/', $match), find_all_in_path(_DIR_TMP . 'ieconfig/', $match)) as $fichier => $chemin){
227                        $config = yaml_decode_file($chemin);
228                        // On regarde s'il y a un necessite
229                        $ok = true;
230                        if (isset($config['necessite'])){
231                                if (!is_array($config['necessite']))
232                                        $config['necessite'] = array($config['necessite']);
233                                foreach ($config['necessite'] as $plugin)
234                                        if (!defined('_DIR_PLUGIN_' . strtoupper($plugin)))
235                                                $ok = false;
236                        }
237                        //on vérifie s'il y a un champs nom
238                        if ($ok){
239                                if (isset($config['nom']))
240                                        $liste_config[$chemin] = _T_ou_typo($config['nom']);
241                                else
242                                        $liste_config[$chemin] = $fichier;
243                        }
244                }
245        }
246        return $liste_config;
247}
248
249
250?>
Note: See TracBrowser for help on using the repository browser.