source: spip-zone/_plugins_/rang/branches/automatique/inc/rang_api.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: 6.1 KB
Line 
1<?php
2/**
3 * Fonctions utiles au plugin Rang
4 *
5 * @plugin     Rang
6 * @copyright  2016
7 * @author     Peetdu
8 * @licence    GNU/GPL
9 * @package    SPIP\Rang\Fonctions
10 */
11
12if (!defined('_ECRIRE_INC_VERSION')) {
13        return;
14}
15
16/**
17 * Remplir ou ressortir les tables ayant déjà un rang
18 *
19 * Au premier appel on fournit la liste complète de toutes les tables d'objets, pour faire la recherche.
20 * Ensuite on peut appeler la fonction sans rien, et elle sortira la liste des tables qui ont un rang AVANT le plugin Rang.
21 *
22 * @param array $tables
23 *              Le tableau complet de toutes les tables d'objets au premier appel
24 **/
25function rang_lister_tables_deja_rang($tables=null) {
26        static $tables_deja_rang = null;
27       
28        // Si on n'a pas encore fait la recherche et qu'on a fourni la liste des tables d'objets
29        if (is_null($tables_deja_rang) and is_array($tables)) {
30                $tables_deja_rang = array();
31                foreach ($tables as $table => $description) {
32                        if (isset($description['field']['rang'])) {
33                                $tables_deja_rang[] = $table;
34                        }
35                }
36        }
37       
38        return $tables_deja_rang;
39}
40
41/**
42 * Construire la liste des objets à exclure de la configuration
43 *
44 * @return array
45 *      tableau des tables SPIP à exclure (ex : spip_auteurs, spip_mots, etc.)
46 */
47function rang_objets_a_exclure() {
48        $exclus = array();
49
50        // on exclu toujours les objets suivants
51        $liste_toujours_exclus = array('spip_auteurs', 'spip_documents', 'spip_groupes_mots', 'spip_messages');
52        $exclus = array_merge($exclus, $liste_toujours_exclus);
53       
54        // Pour le moment, on ne gère pas les rubriques elles-memes
55        array_push($exclus, 'spip_rubriques');
56
57        // et on ne gère pas les breves et sites
58        array_push($exclus, 'spip_syndic');
59        array_push($exclus, 'spip_breves');
60
61        return $exclus;
62}
63
64/**
65 * Créer les champs 'rang' sur les tables des objets reçus en paramètre
66 * et initialiser la valeur du rang
67 * TODO : à compléter !
68 *
69 * @param array $objets
70 *     liste d'objets
71 **/
72function rang_creer_champs ($objets) {
73        foreach ($objets as $table) {
74                if (!empty($table)) {
75                        $champs_table = sql_showtable($table);
76                       
77                        // si le champ 'rang' n'existe pas, le créer et le remplir
78                        if (!isset($champs_table['field']['rang'])) {
79                                // créer le champ 'rang'
80                                sql_alter('TABLE ' . $table . ' ADD rang SMALLINT NOT NULL');
81
82                                // remplir #1 : si aucun numero_titre n'est trouvé, on met la valeur de l'id_prefixe dans rang
83                                if (!rang_tester_presence_numero($table)) {
84                                        $id = id_table_objet($table);
85                                        $desc = lister_tables_objets_sql($table);
86                                        if (isset($desc['field']['id_rubrique'])) {
87                                                $quelles_rubriques = sql_allfetsel('id_rubrique', $table, '', 'id_rubrique');
88
89                                                foreach ($quelles_rubriques as $key => $value) {
90                                                        $id_rub =  $value['id_rubrique'];
91                                                        $quelles_items = sql_allfetsel($id, $table, 'id_rubrique='.$id_rub);
92
93                                                        $i = 1;
94                                                        foreach ($quelles_items as $key => $value) {
95                                                                $id_prefixe = $value[$id];
96                                                                sql_update($table, array( 'rang' => $i ), "$id = $id_prefixe");
97                                                                $i++;
98                                                        }
99                                                }
100                                        }
101                                }
102
103                                // remplir #2 sinon , recuperer le numero_titre et l'insérer dans rang
104                                // à faire !!
105                        }
106                }
107        }
108}
109
110
111/**
112 * Construction, a partir des objets selectionnes, des chemins de sources vers les listes correspondantes
113 * Ce tableau sera ensuite comparé à la valeur $flux['data']['source'] fourni par le pipeline recuperer_fond()
114 *
115 * @return array
116 *     les chemins sources vers les listes où activer Rang
117 **/
118
119function rang_get_sources() {
120        include_spip('inc/config');
121        // mettre en cache le tableau calculé
122        static $sources;
123        if(is_array($sources)){
124                return $sources;
125        }
126       
127        $sources = array();
128        $objets = lire_config('rang/objets');
129
130        foreach ($objets as $value) {
131                $objet = table_objet($value);
132                if (!empty($value)) {
133                        $source = 'prive/objets/liste/'.$objet;
134                        $sources[] = $source;
135                }
136
137                // cas objets historiques
138                if ($objet == 'mots') {
139                        $source = 'prive/objets/liste/mots-admin';
140                        $sources[] = $source;
141                }
142        }
143
144        // tempo : test sur des liaisons
145        $sources[] = 'prive/objets/liste/mots_lies';
146
147        return $sources;
148}
149
150/**
151 * Retourne la listes des pages (exec) sur lesquelles activer Rang.
152 * On prend la liste des objets cochés dans la configuration en considérant que le nom de l'objet et de l'exec sont identiques.
153 * Si ce n'est pas le cas, le pipeline rang_declarer_contexte permet d'ajouter un exec spécifique.
154 * On ajoute aussi les cas particuliers historiques.
155 *
156 * @return array
157 */
158function rang_get_contextes() {
159        static $contextes;
160        if(is_array($contextes)){
161                return $contextes;
162        }
163        include_spip('base/objets_parents');
164        $tables = lire_config('rang/objets');
165        $contextes = array();
166       
167        foreach ($tables as $table) {
168                // le nom de l'objet au pluriel
169                $contextes[] = table_objet($table);
170                // si l'objet a un parent, on ajoute le nom de cet objet
171                $info_parent = type_objet_info_parent(objet_type($table));
172                if (isset($info_parent['type']) && $info_parent['type']) {
173                        $contextes[] = $info_parent['type'];
174                }
175                if($table=='spip_mots'){
176                        $contextes[] = 'groupe_mots';
177                }
178        }
179        // vérifier si des plugins déclarent des contextes spécifiques
180        $contextes = pipeline('rang_declarer_contexte',$contextes);
181        return $contextes;
182}
183
184/**
185 * Calculer le rang pour la nouvelle occurence de l’objet
186 * @param string $table
187 * @param int $id_objet
188 * @return int
189 */
190 function rang_classer_dernier($table, $id_objet) {
191
192        $objet_type = objet_type($table);
193        include_spip('base/objets_parents');
194
195        // si l'objet à un parent…
196        if ($parent = type_objet_info_parent($objet_type)) {
197                $id_table_objet = id_table_objet($table);
198                $parent_champ = $parent['0']['champ'];
199                $id_parent = sql_getfetsel($parent_champ, $table, "$id_table_objet = $id_objet");
200                $rang = sql_getfetsel('max(rang)', $table, "$parent_champ = $id_parent");
201        } else {
202        // si pas de parent, c'est plus simple
203                $rang = sql_getfetsel('max(rang)', $table);
204        }
205         
206        // todo : on classe l'objet à la fin (rang max) mais on pourrait vouloir le classer au début
207        // il faudrait donc une configuration pour ça, et dans ce cas reclasser tous les autres à un rang++
208        $dernier = $rang+1;
209
210        return $dernier;
211 }
212
213function rang_tester_presence_numero($table) {
214        return false;
215}
216
Note: See TracBrowser for help on using the repository browser.