source: spip-zone/_plugins_/courtjus/trunk/courtjus_fonctions.php @ 95589

Last change on this file since 95589 was 95589, checked in by spip.franck@…, 3 years ago

des tab à la place d'espace

File size: 7.6 KB
Line 
1<?php
2/**
3 * Fonctions utiles au plugin Court-jus
4 *
5 * @plugin     Court-jus
6 * @copyright  2014
7 * @author     Phenix
8 * @licence    GNU/GPL
9 * @package    SPIP\Courtjus\Fonctions
10 */
11
12if (!defined('_ECRIRE_INC_VERSION')) {
13        return;
14}
15
16/**
17 * Créer la balise #URL_RUBRIQUE et y affecter les fonctions du courtjus
18 *
19 * @param mixed $p
20 * @access public
21 * @return mixed
22 */
23function balise_URL_RUBRIQUE_dist($p) {
24        $id_rubrique = interprete_argument_balise(1,$p);
25        if (!$id_rubrique) {
26                $id_rubrique = champ_sql('id_rubrique', $p);
27        }
28
29        $code = "courtjus_calculer_rubrique($id_rubrique)";
30        $p->code = $code;
31        $p->interdire_scripts = false;
32        return $p;
33}
34
35/**
36 * Calculer l'url de la rubrique
37 *
38 * @param mixed $id_rubrique
39 * @access public
40 * @return mixed
41 */
42function courtjus_calculer_rubrique($id_rubrique) {
43
44        $par_rubrique = lire_config('courtjus/squelette_par_rubrique');
45        // Si on n'intervient pas sur les squelettes par rubrique
46        if (empty($par_rubrique)) {
47                // Si on trouve une squelette spécifique à cette rubrique,
48                // et que l'option est activé, on renvoie l'URL rubrique
49                // Cela ne gère pas pour les sous-rubrique cependant
50        if (find_in_path('rubrique='.$id_rubrique.'.html')
51                        or find_in_path('rubrique-'.$id_rubrique.'.html')) {
52                return generer_url_entite($id_rubrique, 'rubrique', '', '', true);
53                        }
54
55                // Pour gérer les fichiers rubrique-X parent, on va tester chaque parent
56                include_spip('public/quete');
57                $parent = quete_parent($id_rubrique);
58                do {
59                        if (find_in_path('rubrique-'.$parent.'.html')) {
60                                return generer_url_entite($id_rubrique, 'rubrique', '', '', true);
61                        }
62                } while (($parent = quete_parent($parent)) > 0);
63        }
64        // On récupère l'éventuel objet de redirection
65        $objet = courtjus_trouver_objet($id_rubrique);
66        if ($objet) {
67                return $objet;
68
69                // Sinon, on cherche les enfant de la rubrique
70                // et on cherche un objet dedans
71        } elseif (lire_config('courtjus/rubrique_enfant')) {
72
73                // On chercher parmit les enfants de la rubrique
74                $objet = courtjus_trouver_objet_enfant($id_rubrique);
75
76                // Si on a trouver un objet enfant.
77                if ($objet) {
78                return $objet;
79                }
80        }
81
82        return generer_url_entite($id_rubrique, 'rubrique', '', '', true);
83}
84
85/**
86 * Fonction récurcive de recherche dans les sous-rubriques
87 *
88 * @param mixed $id_rubrique
89 * @access public
90 * @return mixed
91 */
92function courtjus_trouver_objet_enfant($id_rubrique) {
93
94        // Chercher les enfants de la rubrique
95        $enfants = courtjus_quete_enfant($id_rubrique);
96
97        // On cherche un éventuel objet dans les premiers enfants
98        while (list($key,$enfant) = each($enfants) and !$objet) {
99                $objet = courtjus_trouver_objet($enfant);
100
101                // S'il n'y a pas d'objet au premier niveau on lance la récurcivité
102                // pour trouver continuer de descendre dans la hiérachie.
103                if (!$objet) {
104                        $objet = courtjus_trouver_objet_enfant($enfant);
105                }
106        }
107        // On renvoie l'url
108        return $objet;
109}
110
111
112/**
113 * Renvoie le tableau des objets qui possède un id_rubrique.
114 * (sans la table spip_rubrique)
115 *
116 * @access public
117 * @return mixed
118 */
119function courtjus_trouver_objet_rubrique() {
120        // On va cherché les différent objets intaller sur SPIP
121        $objets = lister_tables_objets_sql();
122
123        // On va filtrer pour n'avoir que les objet avec un id_rubrique
124        $objet_in_rubrique = array();
125        foreach ($objets as $table => $data) {
126                // Si on trouve "id_rubrique" dans la liste des champs, on garde
127                // On exclue la table des rubriques de SPIP automatiquement
128                // On exclu aussi éléments marqué comme exclu dans la config
129                if (array_key_exists('id_rubrique', $data['field'])
130                        and $table != table_objet_sql('rubrique')
131                        and !in_array($table, lire_config('courtjus/objet_exclu'))) {
132                        // On garde le champ qui fait office de titre pour l'objet
133                        // dans le tableau afin de pouvoir faire un classement par num titre.
134                        $objet_in_rubrique[] = array($table, $data['titre']);
135                }
136        }
137
138        return $objet_in_rubrique;
139}
140
141/**
142 * Fonction qui traite les objet d'une rubrique et renvoie l'url du court-cuircuit.
143 *
144 * @param mixed $id_rubrique
145 * @access public
146 * @return mixed
147 */
148function courtjus_trouver_objet($id_rubrique) {
149
150        // Aller chercher les filtres
151        include_spip('inc/flitres');
152
153        // On récupère le configuration du plugin
154        $config = lire_config('courtjus');
155
156        // On va compter le nombre d'objet présent dans la rubrique
157        $tables = courtjus_trouver_objet_rubrique();
158
159        // on va compter le nombre d'objet qu'il y a dans la rubrique.
160        $objets_in_rubrique = array();
161
162        // On boucle sur tout les table qui pourrait être ratacher à une rubrique
163        foreach ($tables as $table) {
164                // Simplification des variables. On a besoin du titre pour trouver le num titre
165                list($table, $titre) = $table;
166                // L'objet
167                $objet = table_objet($table);
168                // l'identifiant de l'objet
169                $champs_id = id_table_objet($table);
170
171                // Les champs qui seront utilisé pour la requête.
172                $champs = array(
173                        $champs_id,
174                        $titre
175                );
176
177                // Le where
178                $where = array(
179                        'id_rubrique='.intval($id_rubrique),
180                        'statut='.sql_quote('publie')
181                );
182
183                // Est-ce qu'il faut prendre en compte la langue ?
184                include_spip('formulaires/configurer_multilinguisme');
185                if (table_supporte_trad($table)) {
186                        $where[] = 'lang='.sql_quote($GLOBALS['spip_lang']);
187                }
188
189                // On récupère les objets de la rubrique.
190                $objets_rubrique = sql_allfetsel($champs, $table, $where);
191
192                // On boucle sur les objets à l'intérique de la rubrique.
193                foreach ($objets_rubrique as $objet_rubrique) {
194
195                        $num_titre = recuperer_numero($objet_rubrique['titre']);
196
197                        // On créer le tableau contenant les données de l'objet
198                        $objets_in_rubrique[] = array(
199                                'id_objet' => $objet_rubrique[$champs_id],
200                                'objet' => $objet,
201                                'num_titre' => $num_titre
202                        );
203                }
204        }
205
206        // Maintenant qu'on a le tableau des objets de la rubrique on compte
207        $nb_objet = count($objets_in_rubrique);
208
209        // Si on est à 0 objet, on descend dans une sous rubrique
210        if ($nb_objet <= 0) {
211                // On renvoie false pour déclencher éventuellement la recherche dans une sous rubrique
212                return false;
213        } elseif ($nb_objet == 1) {
214                // Un seul objet dans la rubrique, on renvoie le tableau
215                return generer_url_entite($objets_in_rubrique[0]['id_objet'], $objets_in_rubrique[0]['objet'], '', '', true);
216        } elseif ($nb_objet > 1
217                        and array_sum(array_column($objets_in_rubrique, 'num_titre')) > 0
218                        and $config['num_titre'] == 'on') {
219                // S'il y plusieurs objets dans la rubrique et que le mode "par num titre"
220                // est activé, on regiride sur le num titre le plus petit.
221
222                // On créer un tableau avec uniquement les num titre
223                $minmax = array_column($objets_in_rubrique, 'num_titre');
224
225                // On va filtrer ce tableau pour n'avoir que des nombres à tester
226                $minmax = array_filter($minmax, 'is_numeric');
227
228                // On recherche l'index dans le tableau minmax
229                $index = array_search(min($minmax), $minmax);
230
231                // Créer l'URL de redirection
232                return generer_url_entite(
233                        $objets_in_rubrique[$index]['id_objet'],
234                        $objets_in_rubrique[$index]['objet'],
235                        '',
236                        '',
237                        true
238                );
239        }
240
241        // Sinon, si le mot "plus récent"" est activé on redirige sur l'article le plus récente.
242
243}
244
245/**
246 * Renvoie tout les enfants direct d'une rubrique
247 *
248 * @param mixed $id_rubrique
249 * @access public
250 * @return mixed
251 */
252function courtjus_quete_enfant($id_rubrique) {
253
254        include_spip('inc/filtres');
255
256        // On récupère tous les enfants direct.
257        $enfants = sql_allfetsel('id_rubrique, titre', table_objet_sql('rubrique'), 'id_parent='.intval($id_rubrique));
258
259        // On va chercher un éventuel num_titre dans les titre
260        foreach ($enfants as $index => $enfant) {
261                if ($num_titre = recuperer_numero($enfant['titre'])) {
262                        $enfants[$index]['num_titre'] = $num_titre;
263                }
264        }
265
266        // On simplifie le tableau pour n'avoir que des id
267        $enfants = array_column($enfants, 'id_rubrique', 'num_titre');
268        ksort($enfants);
269        return $enfants;
270}
Note: See TracBrowser for help on using the repository browser.