source: spip-zone/_plugins_/rang/branches/automatique/rang_pipelines.php @ 110204

Last change on this file since 110204 was 110204, checked in by rastapopoulos@…, 2 years ago

Correction gros bug : le plugin supprimer les champs rang même sur les tables qui l'avaient déjà avant. Du coup on fait une fonction avec static qui garde en mémoire les tables avec ce champ déclaré avant que Rang ne complète la déclaration des objets. Et du coup lors de la désinstallation on a cette liste pour ne pas supprimer. Au passage on ne déclare aussi que si le champ n'est pas déjà déclaré.

  • Property svn:executable set to *
File size: 3.8 KB
Line 
1<?php
2/**
3 * Utilisations de pipelines par Rang
4 *
5 * @plugin     Rang
6 * @copyright  2016
7 * @author     Peetdu
8 * @licence    GNU/GPL
9 * @package    SPIP\Rang\Pipelines
10 */
11
12if (!defined('_ECRIRE_INC_VERSION')) {
13        return;
14}
15
16include_spip('inc/rang_api');
17include_spip('inc/config');
18
19/**
20 * Declaration du champ Rang sur les objets sélectionnés
21 *
22 * @param array $tables
23 * @return array
24 */
25function rang_declarer_tables_objets_sql($tables) {
26        $tables_objets_selectionnes = lire_config('rang/objets');
27       
28        // Tant qu'on n'a rien rajouté, on commence par lister les tables qui ont DEJA un champ rang !
29        $tables_deja_rang = rang_lister_tables_deja_rang($tables);
30       
31        // On déclare le champ "rang" sur les tables demandées
32        if (is_array($tables_objets_selectionnes)) {
33                foreach ($tables_objets_selectionnes as $table) {
34                        // Mais on ne déclare le champ que s'il n'existait pas déjà !
35                        if (!isset($tables[$table]['field']['rang'])) {
36                                $tables[$table]['field']['rang'] = "SMALLINT NOT NULL";
37                        }
38                }
39        }
40       
41        return $tables;
42}
43
44/**
45 * Calculer et Inserer le JS qui gére le tri par Drag&Drop dans le bon contexte (la page ?exec=xxxxx)
46 *
47 * @param    array $flux Données du pipeline
48 * @return    array        Données du pipeline
49 */
50function rang_recuperer_fond($flux) {
51        $tables_objets_selectionnes = lire_config('rang/objets');
52       
53        if (isset($tables_objets_selectionnes) and !empty($tables_objets_selectionnes)) {
54                // Gestion du contexte : dans quelle page insérer le JS ?
55                if (in_array(_request('exec'), rang_get_contextes())
56                        && in_array($flux['args']['fond'], rang_get_sources())
57                        && strpos($flux['data']['texte'], 'data-objet=')
58                ) {
59                        // recuperer le nom de l'objet
60                        preg_match('/data-objet=["\'](\w+)["\']/', $flux['data']['texte'], $result);
61                        $objet_nom  = $result[1];
62                        $objet_type = objet_type($objet_nom);
63
64                        // insérer le script de tri si on a bien un objet à ranger
65                        if ($objet_type) {
66                                // récupérer le type de parent…
67                                include_spip('base/objets_parents');
68                                $parent       = type_objet_info_parent($objet_type);
69                                $parent_champ = $parent['0']['champ'];
70                                $id_parent    = $flux['args']['contexte'][$parent_champ];
71
72                                // suffixe de la pagination : particularité des objets historiques
73                                switch ($objet_type) {
74                                        case 'article':
75                                                $suffixe_pagination = 'art';
76                                                break;
77                                        case 'site':
78                                                $suffixe_pagination = 'sites';
79                                                break;
80                                        case 'breve':
81                                                $suffixe_pagination = 'bre';
82                                                break;
83                                        default:
84                                                $suffixe_pagination = $objet_type;
85                                                break;
86                                }
87
88                                // Calcul du JS à insérer avec les paramètres
89                                $ajout_script = recuperer_fond('prive/squelettes/inclure/rang', array(
90                                        'suffixe_pagination' => $suffixe_pagination,
91                                        'objet'              => $objet_nom,
92                                        'id_parent'          => $id_parent,
93                                ));
94
95                                // et hop, on insère le JS calculé
96                                $flux['data']['texte'] = str_replace('</table>', '</table>' . $ajout_script, $flux['data']['texte']);
97                        }
98                }
99        }
100       
101        return $flux;
102}
103
104/**
105 * Insertion dans le pipeline pre_edition pour le classer l'objet quand on le publie
106 *
107 * @param    array $flux Données du pipeline
108 * @return    array        Données du pipeline
109 */
110function rang_pre_edition($flux) {
111        $rang_max = lire_config('rang/rang_max');
112
113        if (isset($rang_max) && !empty($rang_max) && $flux['args']['action'] == 'instituer') {
114                $liste_objets  = lire_config('rang/objets');
115                $table         = $flux['args']['table'];
116
117                if (in_array($table, $liste_objets)) {
118                        $id_objet = $flux['args']['id_objet'];
119
120                        // cas des objets avec statut
121                        if (isset($flux['data']['statut']) && $flux['data']['statut'] == 'publie') {
122                                $flux['data']['rang'] = rang_classer_dernier($table, $id_objet);
123                        }
124                        // cas des mots clés
125                        if ($table == 'spip_mots') {
126                                $flux['data']['rang'] = rang_classer_dernier($table, $id_objet);
127                        }
128                }
129        }
130       
131        return $flux;
132}
Note: See TracBrowser for help on using the repository browser.