source: spip-zone/_plugins_/fabrique/trunk/formulaires/fabriquer_plugin.php @ 69999

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

Mise à jour des accordions, et correction de notices PHP

File size: 30.3 KB
Line 
1<?php
2
3/**
4 * Gestion du formulaire de fabrication de plugin
5 *
6 * @package SPIP\Fabrique\Formulaires
7**/
8if (!defined("_ECRIRE_INC_VERSION")) return;
9
10/**
11 * Hash du formulaire de fabrication de plugin
12 *
13 * @return string
14 *     Hash du formulaire
15**/
16function formulaires_fabriquer_plugin_identifier_dist(){
17        return serialize(true);
18}
19
20/**
21 * Chargement du formulaire de fabrication de plugin
22 *
23 * @return array
24 *     Environnement du formulaire
25**/
26function formulaires_fabriquer_plugin_charger_dist() {
27
28        // v_spip = 3.0.0-beta2
29        // v_futur = 3.0.*
30        $v_spip = $GLOBALS['spip_version_branche'];
31        $v_futur = explode('.', $v_spip);
32        array_pop($v_futur);
33        $v_futur = implode('.', $v_futur) . '.*';
34        $contexte = array(
35                'fabrique' => array(), // ne sert pas dans ce formulaire, mais un jour peut être
36                'paquet' => array(
37                        'prefixe' => '',// 'Nouveau plugin',
38                        'version' => '1.0.0',
39                        'auteur' => $GLOBALS['visiteur_session']['nom'],
40                        'auteur_lien' => $GLOBALS['visiteur_session']['url_site'],
41                        'categorie' => '',
42                        'etat' => 'dev', // c'est du développement au debut, normalement.
43                        'compatibilite' => '[' . $v_spip . ';' . $v_futur . ']',
44                        'licence' => 'GNU/GPL',
45                        'schema' => '1.0.0',
46                        'fichiers' => array(),
47                        'exemples' => '', // inserer des exemples, de l'aide dans les fichiers.
48                ),
49                'objets' => array(),
50        );
51
52        // On initialise la session si elle est vide
53        if (is_null($fabrique = session_get(FABRIQUE_ID))){
54                session_set(FABRIQUE_ID, $contexte);
55                $fabrique = array();
56        }
57       
58        // ça merge que la profondeur 1, c'est surtout la 2 qui interesse
59        #$contexte = array_merge($contexte, $fabrique);
60        foreach ($contexte as $c=>$v) {
61                if (isset($fabrique[$c])) {
62                        $contexte[$c] = array_merge($contexte[$c], $fabrique[$c]);
63                }
64        }
65
66        //on ajoute des informations d'image qui peuvent servir dans notre tableau de données.
67        $contexte = fabrique_completer_contexte_images($contexte);
68
69        //on ajoute des informations qui servent souvent dans notre tableau de données.
70        $contexte = fabrique_completer_contexte($contexte);
71
72        // et quelques autres informations de destination
73        $destination = fabrique_destination();
74        $contexte['destination'] = $destination;
75        if (!$prefixe = $contexte['paquet']['prefixe']) {
76                $prefixe = 'prefixe';
77        } 
78        $contexte['destination_plugin']        = $destination  . $prefixe . '/';
79        $contexte['destination_ancien_plugin'] = $destination  . '.backup/' . $prefixe . '/';
80
81
82        // on ouvre sur la tab d'un nouvel objet lorsqu'il est cree
83        $tab = _request('open_tab', '');
84        $contexte['open_tab'] = $tab;
85
86        // on ouvre du coup le 2e accordion par defaut.
87        // si l'objet a deja ete rempli une fois
88        $accordion = _request('open_accordion', array());
89        foreach ($contexte['objets'] as $c => $o) {
90                if (isset($o['champs']) and count($o['champs'])) {
91                        $accordion[$c+1] = 1;
92                }
93        }
94        $contexte['open_accordion'] = $accordion;
95
96        // relou pour passer un message en plus depuis le traiter.
97        $contexte['_message_info'] = _request('message_info');
98        $contexte['_message_diff'] = _request('message_diff');
99        $contexte['_message_diff_suppressions'] = _request('message_diff_suppressions');
100
101        // es-t-on webmestre
102        $contexte['webmestre'] = autoriser('webmestre');
103
104        return $contexte;
105}
106
107
108
109
110/**
111 * Vérifications du formulaire de fabrication de plugin
112 *
113 * @return array
114 *     Erreurs du formulaire
115**/
116function formulaires_fabriquer_plugin_verifier_dist(){
117
118        // cas d'action qui n'ont pas a être testées ici.
119        if (_request('f_action')) {
120                return array(); // forcer aucune erreur
121        }
122
123        $erreurs = array();
124
125        $paquet = _request('paquet');
126        foreach (array('prefixe', 'version', 'categorie', 'etat', 'nom') as $obli) {
127                if (!$paquet[$obli]) {
128                        $erreurs['paquet'][$obli] = _T("info_obligatoire");
129                }
130        }
131
132        $objets = _request('objets');
133        if (is_array($objets)) {
134                foreach ($objets as $c => $o) {
135                        foreach (array('nom', 'table') as $obli) {
136                                if (!$o[$obli]) {
137                                        $erreurs['objets'][$c][$obli] = _T("info_obligatoire");
138                                }
139                        }
140                        if (is_array($o['champs'])) {
141                                foreach ($o['champs'] as $n => $champ) {
142                                        foreach (array('nom', 'champ', 'sql') as $obli) {
143                                                if (!$champ[$obli]) {
144                                                        $erreurs['objets'][$c]['champs'][$n][$obli] = _T("info_obligatoire");
145                                                }
146                                        }
147                                }
148                        }
149                }
150        }
151
152        if (count($erreurs)) {
153                $erreurs['message_erreur'] = _T("fabrique:erreurs");
154        }
155
156        return $erreurs;
157}
158
159
160
161
162/**
163 * Traitements du formulaire de fabrication de plugin
164 *
165 * @return array
166 *     Retours du traitement
167**/
168function formulaires_fabriquer_plugin_traiter_dist(){
169        include_spip('fabrique_fonctions');
170        include_spip('formulaires/fabriquer_plugin_actions');
171
172        $paquet = _request('paquet');
173        $objets = _request('objets');
174        if (!is_array($objets)) {
175                $objets = array();
176        }
177
178        $data = array(
179                'fabrique' => array('version' => FABRIQUE_VERSION),
180                'paquet' => $paquet,
181                'objets' => $objets,
182        );
183
184        // gerer les cas d'envoi d'images.
185        // (avant les éventuels retours sur l'ajout / suppression d'objet !)
186        fabrique_recuperer_et_stocker_les_images($data);
187
188
189        // Gerer les actions de la fabrique,
190        // avec des input.submit name=f_action[type]
191        // exemple : ajouter / supprimer un objet, supprimer des logos,
192        // deplacer des champs, tabs ...
193        if ($f_action = _request('f_action')) {
194                return fabrique_action_modification_formulaire($f_action, $data);
195        }
196
197
198        // calcul automatique de certains champs lorsqu'ils ne sont pas remplis
199        foreach ($data['objets'] as $c => $o) {
200                if ($o['table'] and !$o['cle_primaire']) {
201                        $data['objets'][$c]['cle_primaire'] = id_table_objet($o['table']);
202                }
203                if ($o['table'] and !$o['cle_primaire_sql']) {
204                        $data['objets'][$c]['cle_primaire_sql'] = "bigint(21) NOT NULL";
205                }
206                if ($o['table'] and !$o['table_type']) {
207                        $data['objets'][$c]['table_type'] = objet_type($data['objets'][$c]['cle_primaire']);
208                }
209        }
210
211        // sinon c'est creation du plugin
212        session_set(FABRIQUE_ID, $data);
213
214        // creation du repertoire de stockage du plugin cree dans
215        // plugins/fabrique/$prefixe (si possible), sinon dans
216        // tmp/cache/fabrique/$prefixe/
217        $destination = fabrique_destination();
218        $prefixe = $paquet['prefixe']; // il nous sert souvent ce prefixe !
219
220        // $_d... pour eviter des rtrim '/' en dessous
221        $_destination_plugin        = $destination . $prefixe;
222        $_destination_backup        = $destination . '.backup';
223        $_destination_ancien_plugin = $_destination_backup . '/' . $prefixe;
224
225        $destination_plugin         = $_destination_plugin . '/';
226        $destination_backup         = $_destination_backup  . '/';
227        $destination_ancien_plugin  = $_destination_ancien_plugin . '/';
228
229        // liste des variables disponibles pour l'execution de scripts
230        // (en plus de $data)
231        $contexte_scripts = compact(
232                'prefixe',
233                'destination',
234                'destination_plugin',
235                'destination_backup',
236                'destination_ancien_plugin');
237
238        // executer des actions si demandees
239        fabrique_executer_script('pre_copie', $data, $contexte_scripts);
240
241        // on efface l'eventuelle sauvegarde et on colle l'eventuel plugin deja genere a la place
242        supprimer_repertoire($_destination_ancien_plugin);
243        sous_repertoire_complet($_destination_backup);
244        // si la sauvegarde est encore présente, c'est que la suppression s'est mal passée
245        // il vaut mieux quitter en indiquant une erreur
246        if (is_dir($_destination_ancien_plugin)) {
247                fabrique_remettre_contexte($data);
248                return array(
249                        'editable'=>'oui',
250                        'message_erreur' => _T('fabrique:erreur_suppression_sauvegarde', array('dir'=>$_destination_ancien_plugin))
251                );
252        }
253       
254        if (is_dir($_destination_plugin)) {
255                // try ne fonctionne pas sur rename()
256                if (!@rename($_destination_plugin, $_destination_ancien_plugin)) {
257                        // une erreur sur le rename signifie qu'on a pas les droits suffisants sur $_destination_plugin
258                        fabrique_remettre_contexte($data);
259                        return array(
260                                'editable'=>'oui',
261                                'message_erreur' => _T('fabrique:erreur_copie_sauvegarde', array('dir'=>$_destination_plugin))
262                        );
263                }
264        }
265        if (is_dir($_destination_plugin)) {
266                supprimer_repertoire($_destination_plugin);
267        }
268        sous_repertoire_complet($_destination_plugin);
269
270        // inutiles maintenant
271        unset($_destination_plugin, $_destination_ancien_plugin, $_destination_backup);
272
273        // sauver le descriptif de creation.
274        // ce qui permet de pouvoir restaurer toutes les donnees de construction
275        // afin de relancer la procédure avec des versions ulterieures du plugin
276
277        // on nettoie les noms de fichiers images locaux avant
278        $images = session_get(FABRIQUE_ID_IMAGES);
279        foreach ($images['paquet']['logo'] as $taille => $im) {
280                if (is_array($im)) { // evitons une fatale erreur (mais ca ne devrait pas arriver !)
281                        unset($images['paquet']['logo'][$taille]['fichier']);
282                }
283        }
284        foreach ($images['objets'] as $c => $objet) {
285                if (isset($objet['logo']) and is_array($objet['logo'])) {
286                        foreach ($objet['logo'] as $taille => $im) {
287                                if (is_array($im)) { // evitons une fatale erreur (mais ca ne devrait pas arriver !)
288                                        unset($images['objets'][$c]['logo'][$taille]['fichier']);
289                                }
290                        }
291                }
292        }
293        // on nettoie les saisies checkbox de vue_liens qui peuvent ne rien envoyer
294        // on nettoie une eventuelle table ayant servi a pre-remplir l'objet
295        foreach ($data['objets'] as $c => $o) {
296                if (!isset($o['vue_liens']) OR !is_array($o['vue_liens'])) {
297                        $o['vue_liens'] = array();
298                }
299                unset($data['objets'][$c]['renseigner_avec_table']);
300        }
301
302
303        // cas particulier data (+images) pour l'export.
304        fabriquer_fichier("fabrique_prefixe.php", array_merge($data, array('data'=>array_merge($data, array('images' => $images))))); 
305        fabrique_sauvegarde_tournante_export($destination_plugin . "fabrique_$prefixe.php", $destination_backup);
306
307        // pour tous les autres, on ajoute des informations dans notre tableau de données
308        $data = fabrique_completer_contexte_images($data); // liste des fichiers images presents (pour paquet.xml)
309        $data = fabrique_completer_contexte($data); // raccourcis
310
311        // definir les fichiers indispensables au paquet.xml / plugin :
312        // si des fichiers sont indispensables aux objets
313        // a cause des options d'un objet, on les ajoute a ceux deja demandes
314        $fichiers = fabrique_fichiers_paquets($data);
315
316        // creer le paquet.xml
317        // en declarant tous les fichiers necessaires
318        $fichiers_coches = isset($data['paquet']['fichiers']) ? $data['paquet']['fichiers'] : array();
319        $data['paquet']['fichiers'] = $fichiers;
320        fabriquer_fichier("paquet.xml", $data);
321        // on remet ce qu'avait saisi l'utilisateur
322        $data['paquet']['fichiers'] = $fichiers_coches;
323
324        // creer la langue du paquet.
325        fabriquer_fichier("lang/paquet-prefixe_fr.php", $data);
326
327        // creer la langue du plugin
328        fabriquer_fichier("lang/prefixe_fr.php", $data);
329
330        // creer le formulaire de configuration
331        if ($paquet['formulaire_config']) {
332                // creer le squelette d'appel du formulaire
333                fabriquer_fichier("prive/squelettes/contenu/configurer_prefixe.html", $data);
334
335                // creer le formulaire de config (simple, type CFG avec un champ d'exemple)
336                fabriquer_fichier("formulaires/configurer_prefixe.html", $data);
337        }
338
339        // creer le fichier d'administrations
340        if ($paquet['administrations']) {
341                fabriquer_fichier("prefixe_administrations.php", $data);
342        }
343
344
345        // creer le fichier d'options, de fonctions, autorisations et de pipelines
346        foreach($fichiers as $fichier) {
347                fabriquer_fichier("prefixe_$fichier.php", $data);
348        }
349
350
351        // gerer plus specifiquement les objets
352        if (count($data['objets'])) {
353
354                // creer le fichier de declaration de tables SQL
355                fabriquer_fichier("base/prefixe.php", $data);
356
357                // pour chaque objet
358                foreach ($data['objets'] as $c => $objet) {
359
360                        // des raccourcis de plus pour les squelettes specifiques aux objets
361                        $data['objet']       = $objet;
362                        $data['id_objet']    = $objet['id_objet'];
363                        $data['type']        = $objet['type'];
364                        $data['table']       = $objet['table'];
365                        $data['mobjet']      = $objet['mobjet']; // m = majuscule
366                        $data['lobjet']      = $objet['objet'];  // l = lower, minuscule, car on ne peut pas utiliser 'objet'
367                        $data['mtype']       = $objet['mtype'];  // m = majuscule
368                        $data['mid_objet']   = $objet['mid_objet']; // m = majuscule
369
370                        // creer les langues
371                        fabriquer_fichier("lang/objet_fr.php", $data);
372
373                        // créer le formulaire d'edition
374                        fabriquer_fichier("formulaires/editer_objet.html", $data);
375                        fabriquer_fichier("formulaires/editer_objet.php", $data);
376
377                        // créer la vue du contenu d'un objet
378                        fabriquer_fichier("prive/objets/contenu/objet.html", $data);
379
380                        // créer la liste d'un objet
381                        fabriquer_fichier("prive/objets/liste/objets.html", $data);
382
383                        // créer les listes de liaison
384                        if (option_presente($objet, 'vue_liens')) {
385                                fabriquer_fichier("prive/objets/liste/objets_lies.html", $data);
386                                fabriquer_fichier("prive/objets/liste/objets_lies_fonctions.php", $data); // pff
387                                fabriquer_fichier("prive/objets/liste/objets_associer.html", $data);
388                                fabriquer_fichier("prive/objets/liste/objets_associer_fonctions.php", $data); // pff
389                                // ce fichier est nécessaire
390                                fabriquer_fichier("prive/squelettes/contenu/objet_edit.html", $data);
391
392                                // la meme chose avec des roles s'il y en a
393                                if (option_presente($objet, 'roles')) {
394                                        fabriquer_fichier("prive/objets/liste/objets_roles_lies.html", $data);
395                                        fabriquer_fichier("prive/objets/liste/objets_roles_lies_fonctions.php", $data); // pff
396                                        fabriquer_fichier("prive/objets/liste/objets_roles_associer.html", $data);
397                                        fabriquer_fichier("prive/objets/liste/objets_roles_associer_fonctions.php", $data); // pff
398                                }
399                        }
400
401                        // si traductions demandees, creer le fichier de pre-chargement
402                        if (champ_present($objet, 'id_trad')) {
403                                fabriquer_fichier("inc/precharger_objet.php", $data);
404                        }
405
406                        // fichiers echafaudes par SPIP mais demandes explicitement
407                        if (isset($objet['echafaudages']) AND is_array($objet['echafaudages'])) {
408                                foreach ($objet['echafaudages'] as $fichier) {
409                                        fabriquer_fichier($fichier, $data);
410                                }
411                        }
412
413                        // saisies demandees
414                        if (isset($objet['saisies']) and is_array($objet['saisies'])) {
415                                foreach ($objet['saisies'] as $saisie) {
416                                        fabriquer_fichier('saisies/' . $saisie . '.html', $data);
417                                        fabriquer_fichier('saisies-vues/' . $saisie . '.html', $data);
418                                        // si parentee presente, saisie propose un mode recursif
419                                        if (champ_present($objet, 'id_parent')) {
420                                                fabriquer_fichier('saisies/_' . $saisie . '_recurs.html', $data);
421                                        }
422                                }
423                        }
424
425                }
426
427                unset($data['objet'],  $data['id_objet'], $data['type'],  $data['table']);
428                unset($data['mobjet'], $data['lobjet'],   $data['mtype'], $data['mid_objet']);
429
430        }
431
432        // creer les images
433        // logo du plugin
434        $images = session_get(FABRIQUE_ID_IMAGES);
435        if ($i = $images['paquet']['logo'][0]['fichier']) {
436                fabriquer_miniature($prefixe, $i, $prefixe, 128);
437                fabriquer_miniature($prefixe, $i, $prefixe, 64);
438                fabriquer_miniature($prefixe, $i, $prefixe, 32);
439        }
440        // logos des objets
441        foreach ($images['objets'] as $c => $image) {
442                $obj = $data['objets'][$c]['type'];
443                $i_precedent = '';
444                // on prend en priorite la taille desiree,
445                // sinon la plus proche, avant,
446                // sinon le logo de l'objet, sinon le logo du plugin.
447                foreach (array(32, 24, 16) as $taille) {
448                        if ((isset($image['logo'][$taille]) AND $i = $image['logo'][$taille]['fichier'])
449                        OR ($i = $i_precedent)
450                        OR (isset($image['logo'][0]['fichier']) and $i = $image['logo'][0]['fichier'])
451                        OR (isset($images['paquet']['logo'][0]['fichier']) and $i = $images['paquet']['logo'][0]['fichier'])) {
452                                $i_precedent = $i; // privilegier l'image juste plus grande que la precedente
453                                fabriquer_miniature($prefixe, $i, $obj, $taille);
454                                if ($data['objets'][$c]['logo_variantes']) {
455                                        fabriquer_miniature($prefixe, $i, $obj, $taille, 'new');
456                                        fabriquer_miniature($prefixe, $i, $obj, $taille, 'add');
457                                        fabriquer_miniature($prefixe, $i, $obj, $taille, 'del');
458                                        fabriquer_miniature($prefixe, $i, $obj, $taille, 'edit');
459                                } elseif ($taille == 16) {
460                                        // creer la variante 16+ qui sert a la barre outils_rapides
461                                        fabriquer_miniature($prefixe, $i, $obj, $taille, 'new');
462                                }
463                        }
464                }
465        }
466
467        // executer des actions si demandees
468        fabrique_executer_script('post_creation', $data, $contexte_scripts);
469
470
471        // supprimer tous les fichiers .ok des sous-répertoires de destination
472        $fichiers =
473                new RegexIterator(
474                new RecursiveIteratorIterator(
475                new RecursiveDirectoryIterator($destination . $prefixe)), '/[.]ok$/');
476        foreach ($fichiers as $f) {
477                supprimer_fichier((string)$f);
478        }
479        // activer un plugin peut creer un .ok a la racine de celui ci (avec skeleditor actif !).
480        supprimer_fichier($destination_ancien_plugin . '.ok');
481
482
483        // calcul du diff avec l'ancien plugin
484        fabrique_generer_diff($destination_ancien_plugin, $destination_plugin, $prefixe);
485
486        // ne pas prendre les champs postes
487        // ils sont sauves en session php
488        set_request('objets', null);
489        set_request('paquet', null);
490
491        // enlever les erreurs de plugin qui ont pu arriver
492        // si l'on recree un plugin actif dans fabrique_auto.
493        include_spip('inc/plugin');
494        actualise_plugins_actifs();
495
496        // indiquer qu'on peut creer le repertoire dans plugins.
497        if (!is_writable(_DIR_PLUGINS . rtrim(FABRIQUE_DESTINATION_PLUGINS, '/'))) {
498                set_request("message_info", _T('fabrique:repertoire_plugin_fabrique', array(
499                        'dir' => rtrim(FABRIQUE_DESTINATION_PLUGINS, '/'),
500                        'dir_cache' => rtrim(FABRIQUE_DESTINATION_CACHE, '/'))));
501        }
502
503        $res = array(
504                'editable'=>'oui',
505                'message_ok' => _T('fabrique:plugin_cree_succes_dans', array('dir'=>$destination_plugin))
506        );
507        return $res;
508}
509
510
511/**
512 * Cherche un fichier dans la fabrique,
513 * le calcule et le copie dans le répertoire du futur plugin
514 *
515 * @param string $chemin
516 *     Chemin du fichier (depuis la racine du répertoire de fabrique)
517 * @param array $data
518 *     Environnement du calcul
519**/
520function fabriquer_fichier($chemin, $data) {
521        static $reps = array(); // repertoire de destination deja crees.
522        static $chemins = array(); // fichiers sources deja utilises
523        // retrouver la destination de copie des fichiers
524        $destination = fabrique_destination();
525        $destination .= $data['paquet']['prefixe'] . '/';
526
527        // on retrouve le nom du fichier et la base du chemin de destination
528        $dest = explode('/', $chemin);
529        $nom = array_pop($dest);
530        $chemin_dest = implode('/', $dest);
531
532        // ne pas creer systematiquement les repertoires tout de meme.
533        if (!isset($reps[$chemin_dest])) {
534                sous_repertoire_complet($destination . $chemin_dest);
535                $reps[$chemin_dest] = true;
536        }
537
538        // on modifie le nom de destination :
539        // 'prefixe' => $prefixe.
540        // 'objet'   => $objet.
541        $nom = str_replace('prefixe', $data['paquet']['prefixe'], $nom);
542        if (isset($data['objet'])) {
543                $nom = str_replace('objets',  $data['objet']['lobjet'], $nom);
544                $nom = str_replace('objet',   $data['objet']['type'], $nom);
545        }
546
547        // calcul du squelette et copie a destination du contenu.
548        $contenu = recuperer_fond(FABRIQUE_SKEL_SOURCE . $chemin, $data);
549
550        ecrire_fichier($destination . $chemin_dest . '/' . $nom, $contenu);
551}
552
553
554
555/**
556 * Réduit une image dont l'adresse est donnée,
557 * et la place dans prive/themes/spip/images du futur plugin
558 *
559 * @param string $prefixe
560 *     Préfixe du plugin
561 * @param string $src
562 *     Source de l'image
563 * @param string $nom
564 *     Nom du fichier d'image
565 * @param int $taille
566 *     Taille de l'image en pixels
567 * @param string $variante
568 *     Variante tel que `del`, `edit`, `new`, `add`
569**/
570function fabriquer_miniature($prefixe, $src, $nom, $taille=128, $variante='') {
571        // retrouver la destination de copie des fichiers
572        $destination = fabrique_destination();
573        $destination .= $prefixe . '/';
574        // creer une fois l'arborescence de destination
575        static $chemin = false;
576        if (!$chemin) {
577                $chemin = "prive/themes/spip/images";
578                sous_repertoire_complet($destination . $chemin);
579        }
580
581        include_spip('inc/filtres_images');
582        // passer en png
583        $img = filtrer('image_format', $src, 'png');
584        // reduire et graver
585        $img = filtrer('image_passe_partout', $img, $taille, $taille);
586        if ($variante and $img_variante = find_in_path("prive/themes/spip/images/$variante-$taille.png")) {
587                $img = filtrer('image_masque', $img, $img_variante, 'mode=normal');
588        }
589        $img = filtrer('image_graver', $img);
590        $src_img = extraire_attribut($img, 'src');
591        // pas de ?date pour recuperer le contenu
592        $src_img = explode('?', $src_img);
593        $src_img = array_shift($src_img);
594        $contenu = spip_file_get_contents($src_img);
595        if ($contenu) {
596                $nom = $nom . ($variante ? "-$variante" : ''). "-$taille.png";
597                ecrire_fichier($destination . "$chemin/$nom", $contenu);
598        }
599}
600
601
602/**
603 * Complète la description du paquet des fichiers indispensables
604 * pour les objets demandés
605 *
606 * @param array $data
607 *     Informations sur le plugin à construire
608 * @return array
609 *     Liste des fichiers indispensables au plugin (et ceux qui étaient déjà demandés)
610**/
611function fabrique_fichiers_paquets($data) {
612        $fichiers = array();
613        if (isset($data['paquet']['fichiers']) AND is_array($data['paquet']['fichiers'])) {
614                $fichiers = $data['paquet']['fichiers'];
615        }
616       
617        // si tout est coche deja, on sort !
618        if (count($fichiers) == 4) {
619                return $fichiers;
620        }
621
622        if (!in_array('pipelines', $fichiers)) {
623                if (fabrique_necessite_pipeline($data['objets'], 'optimiser_base_disparus')
624                OR  fabrique_necessite_pipeline($data['objets'], 'affiche_enfants')
625                OR  fabrique_necessite_pipeline($data['objets'], 'affiche_auteurs_interventions')
626                OR  fabrique_necessite_pipeline($data['objets'], 'affiche_milieu')) {
627                        $fichiers[] = 'pipelines';
628                }
629        }
630
631        if (!in_array('autorisations', $fichiers)) {
632                if (fabrique_necessite_pipeline($data['objets'], 'autoriser')) {
633                        $fichiers[] = 'autorisations';
634                }
635        }
636
637        return $fichiers;
638}
639
640
641/**
642 * Remet les infos de contexte dans l'environnement
643 *
644 * Certaines infos sont remises dans l'environnement
645 * - parce qu'on en ajoute par rapport à ce qui est posté -
646 * afin de réafficher correctement le formulaire si on a des erreurs
647 * dans la partie traiter(), car dans ce cas, le formulaire ne repasse pas dans le charger().
648 *
649 * @param array $data
650 *     Les infos postées
651**/
652function fabrique_remettre_contexte($data) {
653        // on reintroduit le contexte complet, parce que l'erreur ne repasse pas dans charger() dans ce cas.
654        $data = fabrique_completer_contexte_images($data); // liste des fichiers images presents (pour paquet.xml)
655        $data = fabrique_completer_contexte($data); // raccourcis
656        foreach($data as $nom => $valeur) {
657                set_request($nom, $valeur);
658        }
659}
660
661
662/**
663 * Complète les données connues avec des données qui servent souvent
664 *
665 * Ceci pour se simplifier (un peu) les squelettes, et éviter de multiples calculs
666 * (type, table, id_objet, objet...)
667 *
668 * @param array $data
669 *     Les infos du plugin à construire connues
670 * @return array
671 *     Les mêmes infos complétées
672**/
673function fabrique_completer_contexte($data) {
674        $data['prefixe']  = $data['paquet']['prefixe'];
675        $data['mprefixe'] = strtoupper($data['paquet']['prefixe']); // m = majuscule
676        $data['exemples'] = $data['paquet']['exemples'];
677        if (!is_array($data['objets'])) $data['objets'] = array();
678        $data['les_objets'] = $data['les_types'] = $data['les_id_objets'] = array();
679        foreach( $data['objets'] as $c => $o ) {
680                // quelques raccourcis
681                if (isset($o['table']) and $o['table']) {
682                        $data['objets'][$c]['objets_surnoms'] = array();
683
684                        // si la table est different de spip_xxs
685                        // ou si elle possede des espaces spip_xx_yys
686                        // on indique qu'il faudra creer
687                        // des surnoms car ce n'est pas un nommage standard.
688                        // on s'appuie sur la table pour calculer l'objet (pluriel en general)
689                        $preparation_objet = preg_replace(',^spip_|^id_|s$,', '', $o['table']);
690                        // table avec espace
691                        if (false !== strpos($preparation_objet, '_')) {
692                                // on prend en surnom d'objet le type sans son espace
693                                $data['objets'][$c]['objets_surnoms'][] = str_replace('_', '', $preparation_objet); // xxyy = xx_yy
694                        }
695                        // table non standard sans s
696                        if (rtrim($o['table'], 's') == $o['table']) {
697                                // la table n'est pas standard.
698                                $data['objets'][$c]['objets_surnoms'][] = $o['table_type']; // xx
699                                $data['les_objets'][] = $data['objets'][$c]['objet'] = $preparation_objet;
700                        }
701                        // table standard avec s
702                        else {
703                                $data['les_objets'][] = $data['objets'][$c]['objet'] = table_objet($o['table']);
704                        }
705                        $data['les_types'][]     = $data['objets'][$c]['type']     = $o['table_type'];
706                        $data['les_id_objets'][] = $data['objets'][$c]['id_objet'] = $o['cle_primaire'];
707                        // l'objet en majuscule
708                        $data['objets'][$c]['mobjet']     = strtoupper($data['objets'][$c]['objet']);
709                        $data['objets'][$c]['mtype']      = strtoupper($data['objets'][$c]['type']);
710                        $data['objets'][$c]['mid_objet']  = strtoupper($data['objets'][$c]['id_objet']);
711                        // l'objet en minuscule
712                        $data['objets'][$c]['lobjet'] = $data['objets'][$c]['objet']; // etre coherent avec l'appel de squelettes specifiques a un objet
713                        // la table de liens
714                        if ($o['table_liens']) {
715                                $data['objets'][$c]['nom_table_liens'] = $o['table'] . '_liens';
716                        }
717                }
718                // mettre les majuscules sur les champs aussi dans mchamp
719                if (isset($o['champs']) and is_array($o['champs'])) {
720                        foreach ($o['champs'] as $j => $champ) {
721                                if (isset($champ['champ'])) {
722                                         $data['objets'][$c]['champs'][$j]['mchamp'] = strtoupper($champ['champ']);
723                                }
724                        }
725                }
726        }
727        // fabrique_lister_tables() apres avoir ajoute les infos en plus sur les objets
728        // pour pouvoir les utiliser dedans.
729        $data['les_tables']        = fabrique_lister_tables($data['objets']);
730        $data['les_tables_objets'] = fabrique_lister_tables($data['objets'], 'objets');
731        $data['les_tables_liens']  = fabrique_lister_tables($data['objets'], 'liens');
732        return $data;
733}
734
735
736
737/**
738 * Complète les données connues avec les noms des fichiers d'images
739 *
740 * @param array $data
741 *     Les infos du plugin à construire connues
742 * @return array
743 *     Les mêmes infos complétées
744**/
745function fabrique_completer_contexte_images($data) {
746
747        // gestion des images
748        // en dehors des donnees postees
749        // pour ne pas surcharger le formulaire
750        // et poster à chaque fois les images.
751        $images = array(
752                'paquet' => array(
753                        'logo' => array(
754                                0 => array(
755                                        'fichier' => '',
756                                        'extension' => '',
757                                        'contenu' => '',
758                                )
759                        )
760                ),
761                'objets' => array()
762        );
763
764        // On initialise la session image si elle est vide
765        if (is_null($fabrique_images = session_get(FABRIQUE_ID_IMAGES)) OR !is_array($fabrique_images)){
766                session_set(FABRIQUE_ID_IMAGES, $images);
767                $fabrique_images = array();
768        }
769
770        // On merge avec ce que l'on a dans la session
771        foreach ($images as $c=>$v) {
772                if (isset($fabrique_images[$c])) {
773                        $images[$c] = array_merge($images[$c], $fabrique_images[$c]);
774                }
775        }
776
777        // on ajoute la localisation de l'image dans le contexte si presente
778        // logo de plugin
779        if (isset($images['paquet']['logo'][0]['fichier']) and $f = $images['paquet']['logo'][0]['fichier']) {
780                $data['paquet']['logo'][0]['fichier'] = $f;
781        }
782        // logo des objets
783        foreach ($images['objets'] as $c=>$image) {
784                foreach (array(0, 32, 24, 16) as $taille) {
785                        if (isset($image['logo'][$taille]['fichier']) and $f = $image['logo'][$taille]['fichier']) {
786                                $data['objets'][$c]['logo'][$taille]['fichier'] = $f;
787                        }
788                }
789        }
790
791        return $data;
792}
793
794
795/**
796 * Complète les informations d'un objet
797 * en fonction de la table SQL qui a été demandé.
798 *
799 * On essaie d'extraire de la table le plus d'info possibles.
800 *
801 * @param array $objet
802 *     Description connue de l'objet éditorial désiré
803 * @return array $objet
804 *     Description éventuellement complétée si une table SQL source était renseignée
805**/
806function fabrique_renseigner_objet($objet) {
807        $table = $objet['renseigner_avec_table'];
808        if (!$table) {
809                return $objet;
810        }
811
812        // 'spip_articles' ou
813        // 'autreconnect:spip_articles'
814        list($connect, $table) = array_pad(explode(':', $table), 2, null);
815        if (!$table) {
816                $table = $connect;
817                $connect = '';
818        }
819
820        // extraire le prefixe si present, pour remettre spip_
821        $desc = sql_showtable($table, false, $connect); // avant l'utiliation de la globale connexions.
822        $connexion = $GLOBALS['connexions'][$connect ? $connect : 0];
823        if ($prefixe = $connexion['prefixe']) {
824                $table_spip = preg_replace("/^$prefixe/", 'spip', $table);
825        } else {
826                $table_spip = $table;
827        }
828
829        // prefixer systematiquement de spip_ la table
830        if (substr($table_spip,0,5) !== 'spip_') {
831                $table_spip = 'spip_' . $table_spip;
832        }
833
834        // definir la table et le nom.
835        $objet['table'] = $table_spip;
836        $objet['nom'] = ucfirst(str_replace('_', ' ', substr($table_spip, 5)));
837        $objet['nom_singulier'] = rtrim($objet['nom'], 's');
838
839        // analyser les champs
840        $fields = $desc['field'];
841
842        // id_rubrique
843        if (isset($fields['id_rubrique'])) {
844                if (!isset($objet['rubriques'])) {
845                        $objet['rubriques'] = array();
846                }
847                if (!in_array('id_rubrique', $objet['rubriques'])) {
848                        $objet['rubriques'][] = 'id_rubrique';
849                }
850                unset($fields['id_rubrique']);
851        }
852
853        // lang
854        if (isset($fields['lang'])) {
855                if (!isset($objet['langues'])) {
856                        $objet['langues'] = array();
857                }
858                if (!in_array('lang', $objet['langues'])) {
859                        $objet['langues'][] = 'lang';
860                }
861                unset($fields['lang'], $fields['langue_choisie']);
862        }
863
864        // id_trad
865        if (isset($fields['id_trad'])) {
866                if (!isset($objet['langues'])) {
867                        $objet['langues'] = array();
868                }
869                if (!in_array('id_trad', $objet['langues'])) {
870                        $objet['langues'][] = 'id_trad';
871                }
872                // il faut absolument lang pour id_trad !
873                if (!in_array('lang', $objet['langues'])) {
874                        $objet['langues'][] = 'lang';
875                }
876                unset($fields['id_trad']);
877        }
878
879
880        // on enleve la cle primaire (elle sera automatiquement ajoutée)
881        $pk = $desc['key']['PRIMARY KEY'];
882        unset($fields[$pk]);
883        $objet['cle_primaire'] = $pk;
884
885        // on enleve 'maj' (il sera automatiquement ajouté)
886        unset($fields['maj']);
887
888        // 'statut'
889        if (isset($fields['statut'])) {
890                unset($fields['statut']);
891                $objet['statut'] = 'on';
892        }
893
894        // champ titre
895        foreach (array('titre', 'nom') as $titre) {
896                if (isset($fields[$titre])) {
897                        $objet['champ_titre'] = $titre;
898                        break;
899                }
900        }
901
902        // champ date
903        foreach (array('date', 'date_publication') as $date) {
904                if (isset($fields[$date])) {
905                        $objet['champ_date'] = $date;
906                        // ce champ sera automatiquement ajouté
907                        unset($fields[$date]);
908                        break;
909                }
910        }
911
912        // pour tous les autres. Il faut les créer.
913        $champs = isset($objet['champs']) ? $objet['champs'] : array();
914
915        // on enleve tous les champs qui ne sont pas de cette table
916        foreach ($champs as $c => $champ) {
917                if (!isset($fields[$champ['champ']])) {
918                        unset($champs[$c]);
919                }
920        }
921        $champs = array_values($champs);
922
923        // on ajoute (ou modifie) tous les champs de cette table
924        foreach ($fields as $colonne => $sql) {
925                // on n'ajoute pas un champ qui existe deja
926                // on le modifie simplement
927                $present = false;
928                foreach ($champs as $c => $champ) {
929                        if ($champ['champ'] == $colonne) {
930                                $present = true;
931                                break;
932                        }
933                }
934                if (!$present) {
935                        $champs[] = array();
936                        $c = count($champs)-1;
937                }
938
939                $champs[$c]['champ'] = $colonne;
940                $champs[$c]['nom']   = ucfirst(str_replace('_', ' ', $colonne));
941                $champs[$c]['sql']   = $sql;
942        }
943        $objet['champs'] = $champs;
944
945        // On enleve les chaines de langue
946        unset($objet['chaines']);
947
948        return $objet;
949}
950?>
Note: See TracBrowser for help on using the repository browser.