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

Last change on this file since 95163 was 95163, checked in by p@…, 4 years ago

Indentation

File size: 8.5 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.