source: spip-zone/_plugins_/_dev_/acces_groupes/inc/rubriques.php @ 5862

Last change on this file since 5862 was 5862, checked in by cy_altern@…, 15 years ago

début du filtrage complet de l'espace privé par surcharge des requêtes SQL : plus de rubriques restreintes *presque partout*, reste les articles, les sites et les forums...

File size: 14.6 KB
Line 
1<?php
2
3/***************************************************************************\
4 *  SPIP, Systeme de publication pour l'internet                           *
5 *                                                                         *
6 *  Copyright (c) 2001-2006                                                *
7 *  Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James  *
8 *                                                                         *
9 *  Ce programme est un logiciel libre distribue sous licence GNU/GPL.     *
10 *  Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne.   *
11\***************************************************************************/
12
13if (!defined("_ECRIRE_INC_VERSION")) return;
14
15//
16// Recalculer l'ensemble des donnees associees a l'arborescence des rubriques
17// (cette fonction est a appeler a chaque modification sur les rubriques)
18//
19// http://doc.spip.org/@calculer_rubriques
20function calculer_rubriques() {
21        if (!spip_get_lock("calcul_rubriques")) return;
22
23        // Mettre les compteurs a zero
24        // Attention, faute de SQL transactionnel on travaille sur
25        // des champs temporaires afin de ne pas  casser la base
26        // pendant la demi seconde de recalculs
27        spip_query("UPDATE spip_rubriques
28        SET date_tmp='0000-00-00 00:00:00', statut_tmp='prive'");
29
30
31        //
32        // Publier et dater les rubriques qui ont un article publie
33        //
34
35        // Afficher les articles post-dates ?
36        include_spip('inc/meta');
37        $postdates = ($GLOBALS['meta']["post_dates"] == "non") ?
38                "AND fille.date <= NOW()" : '';
39
40        $r = spip_query("SELECT rub.id_rubrique AS id, max(fille.date) AS date_h
41        FROM spip_rubriques AS rub, spip_articles AS fille
42        WHERE rub.id_rubrique = fille.id_rubrique AND fille.statut='publie'
43        $postdates GROUP BY rub.id_rubrique");
44        while ($row = spip_fetch_array($r))
45                spip_query("UPDATE spip_rubriques
46                SET statut_tmp='publie', date_tmp='".$row['date_h']."'
47                WHERE id_rubrique=".$row['id']);
48       
49        // Publier et dater les rubriques qui ont une breve publie
50        $r = spip_query("SELECT rub.id_rubrique AS id,
51        max(fille.date_heure) AS date_h
52        FROM spip_rubriques AS rub, spip_breves AS fille
53        WHERE rub.id_rubrique = fille.id_rubrique
54        AND rub.date_tmp <= fille.date_heure AND fille.statut='publie'
55        GROUP BY rub.id_rubrique");
56        while ($row = spip_fetch_array($r))
57                spip_query("UPDATE spip_rubriques
58                SET statut_tmp='publie', date_tmp='".$row['date_h']."'
59                WHERE id_rubrique=".$row['id']);
60       
61        // Publier et dater les rubriques qui ont un site publie
62        $r = spip_query("SELECT rub.id_rubrique AS id, max(fille.date) AS date_h
63        FROM spip_rubriques AS rub, spip_syndic AS fille
64        WHERE rub.id_rubrique = fille.id_rubrique AND rub.date_tmp <= fille.date
65        AND fille.statut='publie'
66        GROUP BY rub.id_rubrique");
67        while ($row = spip_fetch_array($r))
68                spip_query("UPDATE spip_rubriques
69                SET statut_tmp='publie', date_tmp='".$row['date_h']."'
70                WHERE id_rubrique=".$row['id']);
71       
72        // Publier et dater les rubriques qui ont un document publie
73        $r = spip_query("SELECT rub.id_rubrique AS id, max(fille.date) AS date_h
74        FROM spip_rubriques AS rub, spip_documents AS fille,
75        spip_documents_rubriques AS lien
76        WHERE rub.id_rubrique = lien.id_rubrique
77        AND lien.id_document=fille.id_document AND rub.date_tmp <= fille.date
78        GROUP BY rub.id_rubrique");
79        while ($row = spip_fetch_array($r))
80                spip_query("UPDATE spip_rubriques
81                SET statut_tmp='publie', date_tmp='".$row['date_h']."'
82                WHERE id_rubrique=".$row['id']);
83       
84       
85        // Les rubriques qui ont une rubrique fille plus recente
86        // on tourne tant que les donnees remontent vers la racine.
87        do {
88                $continuer = false;
89                $r = spip_query("SELECT rub.id_rubrique AS id,
90                max(fille.date_tmp) AS date_h
91                FROM spip_rubriques AS rub, spip_rubriques AS fille
92                WHERE rub.id_rubrique = fille.id_parent
93                AND (rub.date_tmp < fille.date_tmp OR rub.statut_tmp<>'publie')
94                AND fille.statut_tmp='publie'
95                GROUP BY rub.id_rubrique");
96                while ($row = spip_fetch_array($r)) {
97                        spip_query("UPDATE spip_rubriques
98                        SET statut_tmp='publie', date_tmp='".$row['date_h']."'
99                        WHERE id_rubrique=".$row['id']);
100                        $continuer = true;
101                }
102        } while ($continuer);
103
104        // "Commit" des modifs
105        spip_query("UPDATE spip_rubriques SET date=date_tmp, statut=statut_tmp");
106        // Sauver la date de la derniere mise a jour (pour menu_rubriques)
107        ecrire_meta("date_calcul_rubriques", date("U"));
108        ecrire_metas();
109
110        // Comme ce calcul est fait apres chaque publication on en profite
111        // pour recalculer les langues utilisees sur le site
112        include_spip('inc/lang');
113        calculer_langues_utilisees();
114}
115
116// http://doc.spip.org/@propager_les_secteurs
117function propager_les_secteurs()
118{
119        // fixer les id_secteur des rubriques racines
120        spip_query("UPDATE spip_rubriques SET id_secteur=id_rubrique
121        WHERE id_parent=0");
122
123        // reparer les rubriques qui n'ont pas l'id_secteur de leur parent
124        do {
125                $continuer = false;
126                $r = spip_query("SELECT fille.id_rubrique AS id,
127                maman.id_secteur AS secteur
128                FROM spip_rubriques AS fille, spip_rubriques AS maman
129                WHERE fille.id_parent = maman.id_rubrique
130                AND fille.id_secteur <> maman.id_secteur");
131                while ($row = spip_fetch_array($r)) {
132                        spip_query("UPDATE spip_rubriques
133                        SET id_secteur=".$row['secteur']." WHERE id_rubrique=".$row['id']);
134                        $continuer = true;
135                }
136        } while ($continuer);
137       
138        // reparer les articles
139        $r = spip_query("SELECT fille.id_article AS id, maman.id_secteur AS secteur
140        FROM spip_articles AS fille, spip_rubriques AS maman
141        WHERE fille.id_rubrique = maman.id_rubrique
142        AND fille.id_secteur <> maman.id_secteur");
143        while ($row = spip_fetch_array($r)) {
144#         spip_log("change " . $row['id'] . " secteur " . $row['secteur']);
145                spip_query("UPDATE spip_articles
146                SET id_secteur=".$row['secteur']." WHERE id_article=".$row['id']);
147        }
148        // reparer les sites
149        $r = spip_query("SELECT fille.id_syndic AS id, maman.id_secteur AS secteur
150        FROM spip_syndic AS fille, spip_rubriques AS maman
151        WHERE fille.id_rubrique = maman.id_rubrique
152        AND fille.id_secteur <> maman.id_secteur");
153        while ($row = spip_fetch_array($r))
154                spip_query("UPDATE spip_syndic SET id_secteur=".$row['secteur']."
155                WHERE id_syndic=".$row['id']);
156       
157}
158
159//
160// Calculer la langue des sous-rubriques et des articles
161//
162// http://doc.spip.org/@calculer_langues_rubriques_etape
163function calculer_langues_rubriques_etape() {
164        $s = spip_query("SELECT fille.id_rubrique AS id_rubrique, mere.lang AS lang
165                FROM spip_rubriques AS fille, spip_rubriques AS mere
166                WHERE fille.id_parent = mere.id_rubrique
167                AND fille.langue_choisie != 'oui' AND mere.lang<>''
168                AND mere.lang<>fille.lang");
169
170        while ($row = spip_fetch_array($s)) {
171                $id_rubrique = $row['id_rubrique'];
172                $t = spip_query("UPDATE spip_rubriques  SET lang=" . spip_abstract_quote($row['lang']) . ", langue_choisie='non' WHERE id_rubrique=$id_rubrique");
173        }
174
175        return $t;
176}
177
178// http://doc.spip.org/@calculer_langues_rubriques
179function calculer_langues_rubriques() {
180
181        // rubriques (recursivite)
182        spip_query("UPDATE spip_rubriques SET lang=" . spip_abstract_quote($GLOBALS['meta']['langue_site']) . ", langue_choisie='non'   WHERE id_parent=0 AND langue_choisie != 'oui'");
183        while (calculer_langues_rubriques_etape());
184
185        // articles
186        $s = spip_query("SELECT fils.id_article AS id_article, mere.lang AS lang
187                FROM spip_articles AS fils, spip_rubriques AS mere
188                WHERE fils.id_rubrique = mere.id_rubrique
189                AND fils.langue_choisie != 'oui' AND (fils.lang='' OR mere.lang<>'')
190                AND mere.lang<>fils.lang");
191        while ($row = spip_fetch_array($s)) {
192                $id_article = $row['id_article'];
193                spip_query("UPDATE spip_articles SET lang=" . spip_abstract_quote($row['lang']) . ", langue_choisie='non' WHERE id_article=$id_article");
194        }
195
196        // breves
197        $s = spip_query("SELECT fils.id_breve AS id_breve, mere.lang AS lang
198                FROM spip_breves AS fils, spip_rubriques AS mere
199                WHERE fils.id_rubrique = mere.id_rubrique
200                AND fils.langue_choisie != 'oui' AND (fils.lang='' OR mere.lang<>'')
201                AND mere.lang<>fils.lang");
202        while ($row = spip_fetch_array($s)) {
203                $id_breve = $row['id_breve'];
204                spip_query("UPDATE spip_breves SET lang=" . spip_abstract_quote($row['lang']) . ", langue_choisie='non' WHERE id_breve=$id_breve");
205        }
206
207        if ($GLOBALS['meta']['multi_rubriques'] == 'oui') {
208                // Ecrire meta liste langues utilisees dans rubriques
209                include_spip('inc/meta');
210                $s = spip_query("SELECT lang FROM spip_rubriques
211                WHERE lang != '' GROUP BY lang");
212                while ($row = spip_fetch_array($s)) {
213                        $lang_utilisees[] = $row['lang'];
214                }
215                if ($lang_utilisees) {
216                        $lang_utilisees = join (',', $lang_utilisees);
217                        ecrire_meta('langues_utilisees', $lang_utilisees);
218                } else {
219                        ecrire_meta('langues_utilisees', "");
220                }
221        }
222}
223
224// modif pour accesgroupes
225// inclure le fichier de redéfinitions des BOUCLES pour utiliser ses fcts de filtrage des requètes pour l'espace privé
226         include_spip('inc/accesgroupes_fonctions');
227
228// http://doc.spip.org/@enfant_rub
229function enfant_rub($collection){
230        global $couleur_foncee, $lang_dir;
231        global $spip_display, $spip_lang_left, $spip_lang_right, $spip_lang;
232       
233        $voir_logo = ($spip_display != 1 AND $spip_display != 4 AND $GLOBALS['meta']['image_process'] != "non");
234               
235        if ($voir_logo) {
236                $voir_logo = "float: $spip_lang_right; margin-$spip_lang_right: -6px; margin-top: -6px;";
237                $logo_f = charger_fonction('chercher_logo', 'inc');
238        } else $logo ='';
239
240        $les_enfants = "";
241
242// modif pour accesgroupes
243        $sql_rub_restreintes = accesgroupes_rubriques_accessibles_where('id_rubrique ', 'prive');       
244       
245        $res = spip_query("SELECT id_rubrique, id_parent, titre, descriptif, lang
246                                                                                 FROM spip_rubriques
247                                                                                 WHERE id_parent='$collection'
248                                                                                 AND $sql_rub_restreintes
249                                                                                 ORDER BY 0+titre,titre");
250// fin modif
251
252        while($row=spip_fetch_array($res)){
253                $id_rubrique=$row['id_rubrique'];
254                $id_parent=$row['id_parent'];
255                $titre=$row['titre'];
256
257                $les_sous_enfants = sous_enfant_rub($id_rubrique);
258
259                changer_typo($row['lang']);
260
261                $descriptif=propre($row['descriptif']);
262
263                if ($spip_display == 4) $les_enfants .= "<li>";
264
265                if ($voir_logo) {
266                        if ($logo = $logo_f($id_rubrique, $id_rubrique, 'on'))
267                          if ($logo = decrire_logo("id_rubrique", 'on', $id_rubrique, 48, 36, $logo))
268                                $logo =  "<div style='$voir_logo'>$logo</div>";
269                }
270                $les_enfants .= "<div class='enfants'>" .
271                        debut_cadre_sous_rub(($id_parent ? "rubrique-24.gif" : "secteur-24.gif"), true) .
272                  (is_string($logo) ? $logo : '') .
273                  (!$les_sous_enfants ? "" : bouton_block_invisible("enfants$id_rubrique")) .
274                  (!acces_restreint_rubrique($id_rubrique) ? "" :
275                   http_img_pack("admin-12.gif", '', " width='12' height='12'", _T('image_administrer_rubrique'))) .
276                  " <span dir='$lang_dir'><B><A href='" . 
277                  generer_url_ecrire("naviguer","id_rubrique=$id_rubrique") .
278                  "'><font color='$couleur_foncee'>".
279                  typo($titre) .
280                  "</font></A></B></span>" .
281                  (!$descriptif ? '' : "<div class='verdana1'>$descriptif</div>");
282
283                if ($spip_display != 4) $les_enfants .= $les_sous_enfants;
284               
285                $les_enfants .= "<div style='clear:both;'></div>"  .
286                  fin_cadre_sous_rub(true) .
287                  "</div>";
288
289                if ($spip_display == 4) $les_enfants .= "</li>";
290        }
291
292        changer_typo($spip_lang); # remettre la typo de l'interface pour la suite
293        return (($spip_display == 4) ? "<ul> $les_enfants</ul>" :  $les_enfants);
294
295}
296
297// http://doc.spip.org/@sous_enfant_rub
298function sous_enfant_rub($collection2){
299        global $lang_dir, $spip_lang_dir, $spip_lang_left;
300
301// modif pour accesgroupes
302        $sql_rub_restreintes = accesgroupes_rubriques_accessibles_where('id_rubrique ', 'prive');       
303
304        $result3 = spip_query("SELECT * FROM spip_rubriques
305                                                                                                 WHERE id_parent='$collection2'
306                                                                                                 AND $sql_rub_restreintes 
307                                                                                                 ORDER BY 0+titre,titre");
308
309        if (!spip_num_rows($result3)) return '';
310        $retour = debut_block_invisible("enfants$collection2")."\n<ul style='margin: 0px; padding: 0px; padding-top: 3px;'>\n";
311        while($row=spip_fetch_array($result3)){
312                        $id_rubrique2=$row['id_rubrique'];
313                        $id_parent2=$row['id_parent'];
314                        $titre2=$row['titre'];
315                        changer_typo($row['lang']);
316
317                        $retour.="<div class='arial11' " .
318                          http_style_background('rubrique-12.gif', "left center no-repeat; padding: 2px; padding-$spip_lang_left: 18px; margin-$spip_lang_left: 3px") . "><A href='" . generer_url_ecrire("naviguer","id_rubrique=$id_rubrique2") . "'><span dir='$lang_dir'>".typo($titre2)."</span></a></div>\n";
319        }
320        $retour .= "</ul>\n\n".fin_block()."\n\n";
321       
322        return $retour;
323}
324
325// http://doc.spip.org/@afficher_enfant_rub
326function afficher_enfant_rub($id_rubrique, $afficher_bouton_creer=false) {
327        global  $spip_lang_right;
328       
329        $les_enfants = enfant_rub($id_rubrique);
330        $n = strlen($les_enfants);
331
332        $les_enfants2=substr($les_enfants,round($n/2));
333
334        if (strpos($les_enfants2,"<div class='enfants'>")){
335                $les_enfants2=substr($les_enfants2,strpos($les_enfants2,"<div class='enfants'>"));
336                $n2 = strlen($les_enfants2);
337                $les_enfants=substr($les_enfants,0,$n-$n2);
338        }else{
339                $les_enfants2="";
340        }
341       
342        echo "<div>&nbsp;</div>",
343                "\n<table cellpadding='0' cellspacing='0' border='0' width='100%'>",
344                "\n<tr><td valign='top' width=50% rowspan=2>",
345                $les_enfants,
346                "</td>",
347                "\n<td width='20' rowspan='2'>",
348                http_img_pack("rien.gif", ' ', "width='20'"),
349                "</td>\n",
350                "\n<td valign='top' width='50%'>",
351                $les_enfants2,
352                "&nbsp;",
353                "</td></tr>",
354                "\n<tr><td style='text-align: ",
355                $spip_lang_right,
356                ";' valign='bottom'><div align='",
357                $spip_lang_right,
358                "'>";
359
360        if ($afficher_bouton_creer) {
361                if ($id_rubrique == "0")
362                        icone(_T('icone_creer_rubrique'), generer_url_ecrire("rubriques_edit","new=oui&retour=nav"), "secteur-24.gif", "creer.gif");
363                else  icone(_T('icone_creer_sous_rubrique'), generer_url_ecrire("rubriques_edit","new=oui&retour=nav&id_parent=$id_rubrique"), "rubrique-24.gif", "creer.gif");
364        }
365        echo "</div></td></tr></table>";
366}
367
368// http://doc.spip.org/@calcul_generation
369function calcul_generation ($generation) {
370        include_spip('base/abstract_sql');
371        $lesfils = array();
372        $result = spip_abstract_select(array('id_rubrique'),
373                                array('spip_rubriques AS rubriques'),
374                                array(calcul_mysql_in('id_parent', 
375                                        $generation,
376                                                      '')));
377        while ($row = spip_abstract_fetch($result))
378                $lesfils[] = $row['id_rubrique'];
379        return join(",",$lesfils);
380}
381
382// http://doc.spip.org/@calcul_branche
383function calcul_branche ($generation) {
384        if (!$generation) 
385                return '0';
386        else {
387                $branche[] = $generation;
388                while ($generation = calcul_generation ($generation))
389                        $branche[] = $generation;
390                return join(",",$branche);
391        }
392}
393
394// http://doc.spip.org/@cron_rubriques
395function cron_rubriques($t) {
396        calculer_rubriques();
397        return 1;
398}
399
400?>
Note: See TracBrowser for help on using the repository browser.