source: spip-zone/_plugins_/fabrique/formulaires/fabriquer_plugin_actions.php @ 63512

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

Notices PHP

File size: 10.5 KB
Line 
1<?php
2
3if (!defined("_ECRIRE_INC_VERSION")) return;
4
5
6// Effectue l'action demandee
7// et retourne le tableau de retour de traitement du formulaire
8function fabrique_action_modification_formulaire($f_action, $data) {
9        // name="f_action[type]" ou "f_action[type][id]"
10        $type_action = current(array_keys($f_action));
11        $valeur_action = $f_action[$type_action];
12        $message = '';
13
14        switch ($type_action) {
15
16
17                // Deplacement d'un objet (avec ui.tabs + ui.sortable)
18                case "taborder":
19                        // la tab paquet, on s'en fiche
20                        $order = array_diff($a = explode(',', $valeur_action), array('paquet'));
21                        $order = array_values($order); // renumeroter
22                        $images = session_get(FABRIQUE_ID_IMAGES);
23                        $new_objets = array();
24                        $new_images = array();
25                        foreach ($order as $nom) {
26                                $j = substr($nom, 5); // enlever 'objet' de 'objet2'
27                                $new_objets[] = $data  ['objets'][$j];
28                                $new_images[] = $images['objets'][$j];
29                        }
30                        $data  ['objets'] = $new_objets;
31                        $images['objets'] = $new_images;
32                        session_set(FABRIQUE_ID, $data);
33                        session_set(FABRIQUE_ID_IMAGES, $images);
34                        $message = _T('fabrique:objet_deplace');
35                        break;
36
37
38
39                // Deplacement d'un champ (avec ui.accordion + ui.sortable)
40                case "champorder":
41                        $i = current(array_keys($valeur_action)); // numero d'objet
42                        $order = explode(',', $valeur_action[$i]); 
43                        $order = array_values($order); // renumeroter
44                        $new_champs = array();
45                        foreach ($order as $nom) {
46                                $noms = explode('-', $nom);
47                                $j = substr(array_pop($noms), 5); // enlever 'objetX-champ' de 'objet1-champ2'
48                                $new_champs[] = $data['objets'][$i]['champs'][$j];
49                        }
50                        $data['objets'][$i]['champs'] = $new_champs;
51                        session_set(FABRIQUE_ID, $data);
52                        $message = _T('fabrique:champ_deplace');
53                        break;
54
55
56
57                // Ajout d'un objet
58                case "ajouter_objet":
59                        // on ajoute un element a l'objet et a l'image.
60                        $images = session_get(FABRIQUE_ID_IMAGES);
61                        $data  ['objets'][] = array();
62                        $images['objets'][] = array();
63                        session_set(FABRIQUE_ID, $data);
64                        session_set(FABRIQUE_ID_IMAGES, $images);
65                        // on ouvre sur la nouvelle tab
66                        set_request('open_tab', count($data['objets']));
67                        $message = _T('fabrique:objet_ajoute');
68                        break;
69
70
71
72                // Suppression d'un objet
73                case "supprimer_objet":
74                        // l'objet a supprimer est dans [supprimer_objet][i]
75                        $i = current(array_keys($valeur_action));
76                        // on supprime l'element i de l'objet et des images.
77                        $images = session_get(FABRIQUE_ID_IMAGES);
78                        unset($data  ['objets'][$i]);
79                        unset($images['objets'][$i]);
80                        array_values($data  ['objets']);
81                        array_values($images['objets']);
82                        session_set(FABRIQUE_ID, $data);
83                        session_set(FABRIQUE_ID_IMAGES, $images);
84                        // on supprime l'accordion ouvert (sinon il se reouvre sur l'onglet suppression).
85                        $accordion = _request('open_accordion');
86                        unset($accordion[$i+1]);
87                        set_request('open_accordion', $accordion);
88                        $message = _T('fabrique:objet_supprime');
89                        break;
90
91
92
93                // Renseigner un objet depuis une table SQL
94                case "renseigner_objet":
95                        // l'objet a renseigner est dans [renseigner_objet][i]
96                        $i = current(array_keys($valeur_action));
97                        $data['objets'][$i] = fabrique_renseigner_objet($data['objets'][$i]);
98                        session_set(FABRIQUE_ID, $data);
99                        // on ouvre du coup le 2e accordion par defaut.
100                        $accordion = _request('open_accordion');
101                        $accordion[$i+1] = 1;
102                        set_request('open_accordion', $accordion);
103                        $message = _T('fabrique:objet_renseigne');
104                        break;
105
106
107                // Supprimer un logo
108                case "supprimer_logo":
109                        // i = paquet/logo | objet/n/logo_32
110                        $i = current(array_keys($valeur_action));
111                        $i = explode('/', $i);
112                        $type = array_shift($i);
113                        $images = session_get(FABRIQUE_ID_IMAGES);
114                        if (isset($images[$type])) {
115                                if (count($i) == 2) {
116                                        unset ($images[$type][ $i[0] ][ $i[1] ]); // paquet/logo/0
117                                } elseif (count($i) == 3) {
118                                        unset ($images[$type][ $i[0] ][ $i[1] ][ $i[2] ]); // obje/x/logo/0
119                                }
120                        }
121                        session_set(FABRIQUE_ID_IMAGES, $images);
122                        $message = _T('fabrique:image_supprimee');
123                        break;
124
125
126
127                // Effacer les chaines de langue d'un objet
128                case "reinitialiser_chaines":
129                        $i = current(array_keys($valeur_action));
130                        $data['objets'][$i]['chaines'] = array();
131                        session_set(FABRIQUE_ID, $data);
132                        $message = _T('fabrique:objet_chaines_reinitialisees');
133                        break;
134
135
136
137                // Effacer les autorisations d'un objet
138                case "reinitialiser_autorisations":
139                        $i = current(array_keys($valeur_action));
140                        $data['objets'][$i]['autorisations'] = array();
141                        session_set(FABRIQUE_ID, $data);
142                        $message = _T('fabrique:objet_autorisations_reinitialisees');
143                        break;
144
145
146
147                // Ajouter un champ dans un objet
148                case "ajouter_champ":
149                        $i = current(array_keys($valeur_action));
150                        $data['objets'][$i]['champs'][] = array();
151                        session_set(FABRIQUE_ID, $data);
152                        $message = _T('fabrique:champ_ajoute');
153                        break;
154
155
156
157                // Ajouter un champ dans un objet
158                case "supprimer_champ":
159                        $o = current(array_keys($valeur_action));
160                        $c = current(array_keys($valeur_action[$o]));
161                        unset($data['objets'][$o]['champs'][$c]);
162                        array_values($data['objets'][$o]['champs']);
163                        session_set(FABRIQUE_ID, $data);
164                        $message = _T('fabrique:champ_supprime');
165                        break;
166
167
168
169                // par defaut, c'est qu'on s'est mal compris !
170                default:
171                        $message = _T('fabrique:action_incomprise', array('f_action'=>$f_action));
172                        break;
173
174        }
175
176
177        // on ne prend pas les champs postes
178        // pour que le charger() ajoute bien toutes les infos
179        // supplementaires a nos tableaux (images, raccourcis...)
180        set_request('objets', null);
181        set_request('paquet', null);
182
183        return array(
184                'editable'=>'oui',
185                'message_ok' => $message,
186        );
187
188}
189
190
191
192/**
193 * Recupere les images uploades et les stocke dans la session
194 *
195**/
196function fabrique_recuperer_et_stocker_les_images($data) {
197
198        // on stocke l'image dans local/ pour les traitements d'image
199        sous_repertoire(_DIR_VAR, FABRIQUE_VAR_SOURCE);
200
201        // logo du plugin
202        // _FILES[paquet][name][logo][taille]
203        // _FILES[objets][name][n][logo][taille] n : numero de l'objet
204        foreach (array('paquet', 'objets') as $type) {
205                // aucun objet declarer, pas la peine de chercher le reste.
206                if (!isset($_FILES[$type])) continue;
207
208                // on cherche s'il y a une numero d'objet intercale dans le tableau.
209                $prof = !isset($_FILES[$type]['name']['logo']); // paquet : 0 / objet : 1
210                $names = $prof ? $_FILES[$type]['name'] : array($_FILES[$type]['name']);
211                if (is_array($names)) { // au premier objet, c'est pas forcement la
212                        foreach ($names as $c => $name) {
213                                foreach ($name['logo'] as $taille => $fichier) {
214                                        // un fichier est envoye ?
215                                        if ($fichier) {
216                                                $erreur = $_FILES[$type]['error'];
217                                                $erreur = $prof ? $erreur[$c]['logo'][$taille] : $erreur['logo'][$taille];
218                                                if (!$erreur) {
219                                                        $ext = explode('.', $fichier);
220                                                        $ext = array_pop($ext);
221                                                        $tmp_name = $_FILES[$type]['tmp_name'];
222                                                        $tmp_name = $prof ? $tmp_name[$c]['logo'][$taille] : $tmp_name['logo'][$taille];
223                                                        $contenu = spip_file_get_contents($tmp_name);
224                                                        $images = session_get(FABRIQUE_ID_IMAGES);
225                                                        $desc = array(
226                                                                'extension' => $ext,
227                                                                'contenu' => base64_encode($contenu)
228                                                        );
229                                                       
230                                                        if ($prof) { // on est dans l'objet
231                                                                $obj = table_objet($data['objets'][$c]['table']);
232                                                                $dest = _DIR_VAR . FABRIQUE_VAR_SOURCE . $data['paquet']['prefixe'] . '_' . $obj . '_' . $taille . '.' . $ext;
233                                                                ecrire_fichier($dest, $contenu);
234                                                                $desc['fichier'] = $dest;
235                                                                $images[$type][$c]['logo'][$taille] = $desc;
236                                                        } else {
237                                                                $dest = _DIR_VAR . FABRIQUE_VAR_SOURCE . $data['paquet']['prefixe'] . '_' . $taille . '.' . $ext;
238                                                                ecrire_fichier($dest, $contenu);
239                                                                $desc['fichier'] = $dest;
240                                                                $images[$type]['logo'][$taille] = $desc;
241                                                        }
242                                                        session_set(FABRIQUE_ID_IMAGES, $images);
243                                                }
244                                        }
245                                 }
246                        }
247                }
248        }
249}
250
251
252
253/**
254 * Sauvegarder 10 exports de chaque plugins (en se basant sur le prefixe)
255 * ce qui permet de restaurer de vieilles versions.
256 * Attention, cela ne sauve que le fichier d'export / import pour la Fabrique.
257 *
258 * @param string $fichier
259 *              Fichier source a sauver
260 * @param string $destination
261 *              Répertoire de backup
262 * @return null
263**/
264function fabrique_sauvegarde_tournante_export($fichier, $destination) {
265        $destination .= 'exports';
266        sous_repertoire_complet($destination);
267        // pas de deux points dans les systemes de fichiers Windows
268        $date = date("Y-m-d H-i-s");
269        $base = basename($fichier, '.php');
270        $copie = $base . ' ' . $date . '.php';
271
272        $fichiers =
273                new RegexIterator(
274                new DirectoryIterator($destination), '/fabrique_' . substr($base, 9) . '.*\.php$/');
275        // trier par date les fichiers
276        $tri = array();
277        foreach ($fichiers as $f) {
278                $tri[$f->getMTime()] = $f->getPathname();
279        }
280        // enlever les vieux
281        krsort($tri);
282        $tri = array_slice($tri, 9);
283        foreach ($tri as $f) {
284                supprimer_fichier($f);
285        }
286        copy($fichier, $destination . '/' . $copie);
287}
288
289
290/**
291 * Generer un diff entre la precedente generation
292 * du plugin et cette nouvelle creation
293 *
294 * Ce diff est affiche ensuite au retour du formulaire de creation
295 * et egalement stocke dans le plugin cree, dans le fichier 'fabrique_diff.diff'
296 *
297 * @param string $ancien
298 *              Chemin du repertoire de l'ancienne creation de plugin
299 * @param string $nouveau
300 *              Chemin du repertoire de la nouvelle creation
301 * @return
302 *              null
303**/
304function fabrique_generer_diff($ancien, $nouveau, $prefixe) {
305        if (is_dir($ancien)) {
306                include_spip('inc/fdiff');
307                $fdiff = new Fdiff($ancien, $nouveau);
308                $fdiff->add_ignorer(array("fabrique_diff.diff", "fabrique_".$prefixe.".php"));
309                $tab = $fdiff->get_diff();
310                $diff         = $tab["diff"];
311                $diff_humain  = $tab["affiche"];
312                $suppressions = $tab["suppressions"];
313
314                ecrire_fichier($nouveau . 'fabrique_diff.diff', $diff);
315                // coloration si le plugin 'coloration_code' est la
316                $diff = propre("<cadre class='diff'>\n$diff_humain\n</cadre>");
317                set_request('message_diff', $diff);
318                if ($suppressions) {
319                        set_request('message_diff_suppressions', $suppressions);
320                }
321        }
322}
323
324
325/**
326 * Execute (uniquement si webmestre) des scripts saisis dans le formulaire
327 * de creation de plugin.
328 * 
329 *
330 * @param string $quoi
331 *              Nom du type de script
332 * @param array $data
333 *              Toutes les infos du formulaire
334 * @param array $contexte
335 *              Variables disponibles pour les scripts (nom => valeur)
336 * @return null
337**/
338function fabrique_executer_script($quoi, $data, $contexte = array()) {
339        if (!isset($data['paquet']['scripts'][$quoi])
340        OR  !$script = trim($data['paquet']['scripts'][$quoi])) {
341                return;
342        }
343       
344        // juste les webmestres pour executer des scripts, sinon ce ne serait pas tres securise
345        static $autoriser = null;
346        if (is_null($autoriser)) {
347                $autoriser = autoriser('webmestre');
348        }
349        if (!$autoriser) {
350                return;
351        }
352
353        extract($contexte);
354        eval($script);
355}
356?>
Note: See TracBrowser for help on using the repository browser.