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

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

Avoir un return par défaut

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