source: spip-zone/_plugins_/rang/branches/automatique/inc/rang_api.php @ 110177

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

Nettoyage : aucune raison de stocker la config dans une liste à virgule avec ensuite des explode partout dans le code ensuite, alors qu'on sait parfaitement enregistrer nos configs en tableaux et listes. Donc on met à jour la base pour transformer l'ancien stockage, et on met à jour le code en conséquence. Au passage aussi, pas besoin de remettre un préfixe rang_ devant le nom de la config puisque désormais on est déjà dans un casier rang/.

  • Property svn:executable set to *
File size: 5.2 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 * Construire la liste des objets à exclure de la configuration
18 *
19 * @return array
20 *      tableau des tables SPIP à exclure (ex : spip_auteurs, spip_mots, etc.)
21 */
22function rang_objets_a_exclure() {
23        $exclus = array();
24
25        // on exclu toujours les objets suivants
26        $liste_toujours_exclus = array('spip_auteurs', 'spip_documents', 'spip_groupes_mots', 'spip_messages');
27        $exclus = array_merge($exclus, $liste_toujours_exclus);
28       
29        // Pour le moment, on ne gère pas les rubriques elles-memes
30        array_push($exclus, 'spip_rubriques');
31
32        // et on ne gère pas les breves et sites
33        array_push($exclus, 'spip_syndic');
34        array_push($exclus, 'spip_breves');
35
36        return $exclus;
37}
38
39/**
40 * Créer les champs 'rang' sur les tables des objets reçus en paramètre
41 * et initialiser la valeur du rang
42 * TODO : à compléter !
43 *
44 * @param array $objets
45 *     liste d'objets
46 **/
47function rang_creer_champs ($objets) {
48        foreach ($objets as $key => $table) {
49                if (!empty($table)) {
50                        // si le champ 'rang' n'existe pas, le créer et le remplir
51                        $champs_table = sql_showtable($table);
52                        if (!isset($champs_table['field']['rang'])) {
53
54                                // créer le champ 'rang'
55                                sql_alter('TABLE '.$table.' ADD rang SMALLINT NOT NULL');
56
57                                // remplir #1 : si aucun numero_titre n'est trouvé, on met la valeur de l'id_prefixe dans rang
58                                if (!rang_tester_presence_numero($table)) {
59                                        $id = id_table_objet($table);
60                                        $desc = lister_tables_objets_sql($table);
61                                        if (isset($desc['field']['id_rubrique'])) {
62                                                $quelles_rubriques = sql_allfetsel('id_rubrique', $table, '', 'id_rubrique');
63
64                                                foreach ($quelles_rubriques as $key => $value) {
65                                                        $id_rub =  $value['id_rubrique'];
66                                                        $quelles_items = sql_allfetsel($id, $table, 'id_rubrique='.$id_rub);
67
68                                                        $i = 1;
69                                                        foreach ($quelles_items as $key => $value) {
70                                                                $id_prefixe = $value[$id];
71                                                                sql_update($table, array( 'rang' => $i ), "$id = $id_prefixe");
72                                                                $i++;
73                                                        }
74                                                }
75                                        }
76                                }
77
78                                // remplir #2 sinon , recuperer le numero_titre et l'insérer dans rang
79                                // à faire !!
80                        }
81                }
82        }
83}
84
85
86/**
87 * Construction, a partir des objets selectionnes, des chemins de sources vers les listes correspondantes
88 * Ce tableau sera ensuite comparé à la valeur $flux['data']['source'] fourni par le pipeline recuperer_fond()
89 *
90 * @return array
91 *     les chemins sources vers les listes où activer Rang
92 **/
93
94function rang_get_sources() {
95        include_spip('inc/config');
96        // mettre en cache le tableau calculé
97        static $sources;
98        if(is_array($sources)){
99                return $sources;
100        }
101       
102        $sources = array();
103        $objets = lire_config('rang/objets');
104
105        foreach ($objets as $value) {
106                $objet = table_objet($value);
107                if (!empty($value)) {
108                        $source = 'prive/objets/liste/'.$objet;
109                        $sources[] = $source;
110                }
111
112                // cas objets historiques
113                if ($objet == 'mots') {
114                        $source = 'prive/objets/liste/mots-admin';
115                        $sources[] = $source;
116                }
117        }
118
119        // tempo : test sur des liaisons
120        $sources[] = 'prive/objets/liste/mots_lies';
121
122        return $sources;
123}
124
125/**
126 * Retourne la listes des pages (exec) sur lesquelles activer Rang.
127 * 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.
128 * Si ce n'est pas le cas, le pipeline rang_declarer_contexte permet d'ajouter un exec spécifique.
129 * On ajoute aussi les cas particuliers historiques.
130 *
131 * @return array
132 */
133function rang_get_contextes() {
134        static $contextes;
135        if(is_array($contextes)){
136                return $contextes;
137        }
138        include_spip('base/objets_parents');
139        $tables = lire_config('rang/objets');
140        $contextes = array();
141       
142        foreach ($tables as $table) {
143                // le nom de l'objet au pluriel
144                $contextes[] = table_objet($table);
145                // si l'objet a un parent, on ajoute le nom de cet objet
146                $info_parent = type_objet_info_parent(objet_type($table));
147                if (isset($info_parent['type']) && $info_parent['type']) {
148                        $contextes[] = $info_parent['type'];
149                }
150                if($table=='spip_mots'){
151                        $contextes[] = 'groupe_mots';
152                }
153        }
154        // vérifier si des plugins déclarent des contextes spécifiques
155        $contextes = pipeline('rang_declarer_contexte',$contextes);
156        return $contextes;
157}
158
159/**
160 * Calculer le rang pour la nouvelle occurence de l’objet
161 * @param string $table
162 * @param int $id_objet
163 * @return int
164 */
165 function rang_classer_dernier($table, $id_objet) {
166
167        $objet_type = objet_type($table);
168        include_spip('base/objets_parents');
169
170        // si l'objet à un parent…
171        if ($parent = type_objet_info_parent($objet_type)) {
172                $id_table_objet = id_table_objet($table);
173                $parent_champ = $parent['0']['champ'];
174                $id_parent = sql_getfetsel($parent_champ, $table, "$id_table_objet = $id_objet");
175                $rang = sql_getfetsel('max(rang)', $table, "$parent_champ = $id_parent");
176        } else {
177        // si pas de parent, c'est plus simple
178                $rang = sql_getfetsel('max(rang)', $table);
179        }
180         
181        // todo : on classe l'objet à la fin (rang max) mais on pourrait vouloir le classer au début
182        // il faudrait donc une configuration pour ça, et dans ce cas reclasser tous les autres à un rang++
183        $dernier = $rang+1;
184
185        return $dernier;
186 }
187
188function rang_tester_presence_numero($table) {
189        return false;
190}
191
Note: See TracBrowser for help on using the repository browser.