source: spip-zone/_plugins_/champs_extras/interface/trunk/action/iextras_exporter.php @ 90665

Last change on this file since 90665 was 90665, checked in by marcimat@…, 5 years ago

En fait, les options 'data' des saisies PHP doivent être sous forme de tableau.
Du coup, on les transforme en tableau, et ça permet de remettre facilement les tabulations dans l'export php.

File size: 7.0 KB
Line 
1<?php
2
3if (!defined("_ECRIRE_INC_VERSION")) return;
4
5/**
6 * Exporte des champs extras
7 *
8 * Crée un fichier PHP contenant des informations relatives (array)
9 * aux saisies utilisées par les champs extras sur un ou plusieurs objets
10 *
11 * Paramètres d'action :
12 *
13 * - yaml/tous                       Tous les champs extras de tous les objets
14 * - php/tous                        Tous les champs extras de tous les objets (export PHP)
15 * - yaml/objet/{type}/tous          Tous les champs extras de l'objet {type}. {@example: `yaml/objet/auteur/tous`}
16 * - yaml/objet/{type}/champ/{nom}   Le champ {nom} de l'objet {type}. {@example: `yaml/objet/auteur/champ/date_naissance`}
17 *
18**/
19function action_iextras_exporter_dist() {
20        $securiser_action = charger_fonction('securiser_action', 'inc');
21        $arg = $securiser_action();
22
23        // droits
24        include_spip('inc/autoriser');
25        if (!autoriser('configurer', 'iextra')) {
26                include_spip('inc/minipres');
27                echo minipres();
28                exit;
29        }
30
31        list($format, $quoi, $objet, $quoi_objet, $champ) = array_pad(explode('/', $arg), 5, null);
32
33        // formats possibles
34        if (!in_array($format, array('yaml', 'php'))) {
35                include_spip('inc/minipres');
36                echo minipres(_T('iextras:erreur_format_export',array("format" => $format)));
37                exit;
38        }
39
40        // actions possibles
41        if (!in_array($quoi, array('tous','objet'))) {
42                include_spip('inc/minipres');
43                echo minipres(_T('iextras:erreur_action',array("action" => $quoi)));
44                exit;
45        }
46
47        // liste des champs extras par table SQL array(table sql => array(saisies))
48        $champs = array();
49        $titre = "";
50
51        if ($quoi == 'tous') {
52                $titre  = 'tous';
53                $champs = iextras_exporter_tous();
54        }
55        elseif ($quoi_objet == 'tous') {
56                $titre = $objet;
57                $champs = iextras_exporter_objet_tous($objet);
58        }
59        else {
60                $titre = "$objet-$champ";
61                $champs = iextras_exporter_objet_champ($objet, $champ);
62        }
63
64        return iextras_envoyer_export($champs, $titre, $format);
65}
66
67
68/**
69 * Retourne tous les champs extras par table SQL
70**/
71function iextras_exporter_tous() {
72        include_spip('inc/iextras');
73        $tables = lister_tables_objets_sql();
74        $champs = array();
75        foreach ($tables as $table => $desc) {
76                if ($liste = iextras_champs_extras_definis($table)) {
77                        $champs[$table] = $liste;
78                }
79        }
80        return $champs;
81}
82
83
84/**
85 * Retourne tous les champs extras d'un objet
86 *
87 * @param string $objet
88**/
89function iextras_exporter_objet_tous($objet) {
90        include_spip('inc/iextras');
91        $champs = array();
92        $table = table_objet_sql($objet);
93        if ($liste = iextras_champs_extras_definis($table)) {
94                $champs[$table] = $liste;
95        }
96        return $champs;
97}
98
99
100/**
101 * Retourne un champ extra d'un objet
102 *
103 * @param string $objet
104 * @param string $champ
105**/
106function iextras_exporter_objet_champ($objet, $champ) {
107        include_spip('inc/iextras');
108        $champs = array();
109        $table = table_objet_sql($objet);
110        if ($liste = iextras_champs_extras_definis($table)) {
111                include_spip('inc/saisies');
112                $liste = saisies_lister_par_nom($liste);
113                if (!empty($liste[$champ])) {
114                        $champs[$table] = array();
115                        $champs[$table][] = $liste[$champ];
116                }
117        }
118        return $champs;
119}
120
121
122/**
123 * Exporte un contenu (description de champs extras) au format YAML
124 *
125 * Envoie les données au navigateur !
126 *
127 * @param array $export
128 * @param string $nom_fichier
129 * @param string $format
130 *     Format d'export (yaml ou php)
131**/
132function iextras_envoyer_export($export, $nom_fichier, $format = 'yaml') {
133
134        switch ($format) {
135                case 'php':
136                        $export = iextras_preparer_export_php($export);
137                        $export = iextras_ecrire_export_php($export);
138                       
139                        break;
140
141                case 'yaml':
142                default:
143                        // On envode en yaml
144                        include_spip('inc/yaml');
145                        $export = yaml_encode($export);
146                        break;
147        }
148
149
150        $date = date("Ymd-His");
151        Header("Content-Type: text/x-yaml;");
152        Header("Content-Disposition: attachment; filename=champs_extras_export-$date-$nom_fichier.$format");
153        Header("Content-Length: " . strlen($export));
154        echo $export;
155        exit;
156}
157
158
159/**
160 * Prépare les saisies (les simplifie) pour un export au format PHP
161 *
162 * @param array $export
163 *     Liste des saisies, par table SQL
164 * @return array
165 *     Idem, simplifié
166**/
167function iextras_preparer_export_php($export) {
168        include_spip('inc/saisies');
169        foreach ($export as $table => $champs) {
170                if (!$champs) {
171                        unset($export[$table]);
172                        continue;
173                }
174
175                // simplifier chaque champ
176                foreach ($champs as $i => $champ) {
177                        $export[$table][$i] = iextras_preparer_export_php_saisie($champ);
178                }
179        }
180
181        return $export;
182}
183
184/**
185 * Simplifie l'écriture d'une saisie de champs extras
186 *
187 * @param array Description de saisie
188 * @return array
189**/
190function iextras_preparer_export_php_saisie($saisie) {
191
192        // 1 mettre 'saisie' en tout premier, c'est plus pratique !
193        $saisie = array('saisie' => $saisie['saisie']) + $saisie;
194
195        // 2 mettre 'saisies' en dernier
196        if (isset($saisie['saisies'])) {
197                $saisies = $saisie['saisies'];
198                unset($saisie['saisies']);
199                $saisie['saisies'] = $saisies;
200                // 2 bis : traiter toutes les saisies enfants
201                foreach ($saisie['saisies'] as $k => $s) {
202                        $saisie['saisies'][$k] = iextras_preparer_export_php_saisie($s);
203                }
204        }
205
206        // 3 pas besoin d'identifiant
207        unset($saisie['identifiant']);
208        // 4 nettoyage de quelques champs souvent vides
209        if (isset($saisie['options']['restrictions'])) {
210                if (empty($saisie['options']['restrictions']['secteurs'])) {
211                        unset($saisie['options']['restrictions']['secteurs']);
212                }
213                if (empty($saisie['options']['restrictions']['branches'])) {
214                        unset($saisie['options']['restrictions']['branches']);
215                }
216                if (empty($saisie['options']['restrictions']['voir']['auteur'])) {
217                        unset($saisie['options']['restrictions']['voir']['auteur']);
218                }
219                if (empty($saisie['options']['restrictions']['modifier']['auteur'])) {
220                        unset($saisie['options']['restrictions']['modifier']['auteur']);
221                }
222                if (empty($saisie['options']['restrictions']['voir'])) {
223                        unset($saisie['options']['restrictions']['voir']);
224                }
225                if (empty($saisie['options']['restrictions']['modifier'])) {
226                        unset($saisie['options']['restrictions']['modifier']);
227                }
228                if (empty($saisie['options']['restrictions'])) {
229                        unset($saisie['options']['restrictions']);
230                }
231        }
232
233        // 5 les datas doivent être des tableaux
234        if (isset($saisie['options']['datas'])) {
235                if (!is_array($saisie['options']['datas'])) {
236                        $saisie['options']['datas'] = saisies_chaine2tableau($saisie['options']['datas']);
237                }
238        }
239
240        return $saisie;
241}
242
243/**
244 * Écrit le code PHP de l'export PHP
245 *
246 * @param array $export
247 *     Liste des saisies, par table SQL
248 * @return string
249 *     Code PHP
250**/
251function iextras_ecrire_export_php($export) {
252        $contenu = <<<EOF
253<?php
254if (!defined("_ECRIRE_INC_VERSION")) return;
255
256function monplugin_declarer_champs_extras(\$champs = array()) {
257EOF;
258        foreach ($export as $table => $champs) {
259                $contenu .= "
260
261        // Table : $table
262        if (!is_array(\$champs['$table'])) {
263                \$champs['$table'] = array();
264        }
265";
266                foreach ($champs as $champ) {
267                        $nom = $champ['options']['nom'];
268                        $desc = var_export($champ, true);
269                        $desc = explode("\n", $desc);
270                        $desc = implode("\n\t\t", $desc);
271                        $contenu .= "\n\t\$champs['$table']['$nom'] = $desc;\n";
272                }
273        }
274
275        $contenu .= <<<EOF
276
277        return \$champs;
278}
279EOF;
280
281        return $contenu;
282}
Note: See TracBrowser for help on using the repository browser.