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

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

Petit notice PHP

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