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

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

Notices PHP

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