source: spip-zone/_plugins_/champs_extras_interface/trunk/action/iextras_exporter.php @ 99188

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

Améliorer la présentation de l'export PHP des champs extras : chez SPIP on utilise des tabs,
on a l'habitude de mettre array( sur la même ligne que => s'il précède, et de l'écrire
sans espace entre array et la parenthèse.

File size: 7.4 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                        // remplacer les espaces par des tabulations
271                        foreach ($desc as $i => $l) {
272                                $l = str_replace("  ", "\t", $l);
273                                $desc[$i] = str_replace("array (", "array(", $l);
274                        }
275                        // mettre des tabulations en début de chaque ligne
276                        // sauf 'array(' que l'on laisse sur la même ligne que le signe =>
277                        $d = "";
278                        foreach ($desc as $i => $l) {
279                                if (strpos(ltrim($l, "\t"), 'array(') === 0) {
280                                        $d .= ltrim($l, "\t");
281                                } else {
282                                        $d .= "\n\t\t" . $l;
283                                }
284                        }
285                        $contenu .= "\n\t\$champs['$table']['$nom'] = $d;\n";
286                }
287        }
288
289        $contenu .= <<<EOF
290
291        return \$champs;
292}
293EOF;
294
295        return $contenu;
296}
Note: See TracBrowser for help on using the repository browser.