source: spip-zone/_core_/plugins/forum/public/forum.php @ 93612

Last change on this file since 93612 was 93612, checked in by cedric@…, 5 years ago

Indentation et regles de codage selon http://www.spip.net/fr_article3497.html#regles_codage

File size: 8.3 KB
Line 
1<?php
2
3/***************************************************************************\
4 *  SPIP, Systeme de publication pour l'internet                           *
5 *                                                                         *
6 *  Copyright (c) 2001-2014                                                *
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")) {
14        return;
15}
16
17//
18// <BOUCLE(FORUMS)>
19//
20// http://code.spip.net/@boucle_FORUMS_dist
21function boucle_FORUMS_dist($id_boucle, &$boucles) {
22        $boucle = &$boucles[$id_boucle];
23        $id_table = $boucle->id_table;
24
25        // Par defaut, selectionner uniquement les forums sans mere
26        // Les criteres {tout} et {plat} inversent ce choix
27        // de meme qu'un critere sur {id_forum} ou {id_parent}
28        if (!isset($boucle->modificateur['tout'])
29                AND !isset($boucle->modificateur['plat'])
30                AND !isset($boucle->modificateur['criteres']['id_forum'])
31                AND !isset($boucle->modificateur['criteres']['id_parent'])
32        ) {
33                array_unshift($boucle->where, array("'='", "'$id_table." . "id_parent'", 0));
34        }
35
36        return calculer_boucle($id_boucle, $boucles);
37}
38
39// {meme_parent}
40// http://www.spip.net/@meme_parent
41// http://code.spip.net/@critere_meme_parent_dist
42function critere_FORUMS_meme_parent_dist($idb, &$boucles, $crit) {
43        global $exceptions_des_tables;
44        $boucle = &$boucles[$idb];
45        $arg = kwote(calculer_argument_precedent($idb, 'id_parent', $boucles));
46        $id_parent = isset($exceptions_des_tables[$boucle->id_table]['id_parent']) ?
47                $exceptions_des_tables[$boucle->id_table]['id_parent'] :
48                'id_parent';
49        $mparent = $boucle->id_table . '.' . $id_parent;
50
51        $boucle->where[] = array("'='", "'$mparent'", $arg);
52        $boucle->where[] = array("'>'", "'$mparent'", 0);
53        $boucle->modificateur['plat'] = true;
54}
55
56/**
57 * Faute de copie du champ id_secteur dans la table des forums,
58 * faut le retrouver par jointure
59 * Pour chaque Row il faudrait tester si le forum est
60 * d'article, de breve, de rubrique, ou de syndication.
61 * Pour le moment on ne traite que les articles,
62 * les 3 autres cas ne marcheront donc pas: ca ferait 4 jointures
63 * qu'il faut traiter optimalement ou alors pas du tout.
64 *
65 * @param string $idb
66 * @param object $boucles
67 * @param  $val
68 * @param  $crit
69 * @return mixed|string
70 */
71function public_critere_secteur_forums_dist($idb, &$boucles, $val, $crit) {
72        return calculer_critere_externe_init($boucles[$idb], array('spip_articles'), 'id_secteur', $boucles[$idb]->show,
73                $crit->cond, true);
74}
75
76
77//
78// Parametres de reponse a un forum
79//
80// Cette balise peut etre executee en dehors de toute boucle,
81// par exemple en tete de inc-forums.html ; impossible donc de
82// savoir a quel objet elle va s'appliquer, ca dependra du contexte
83//
84// http://code.spip.net/@balise_PARAMETRES_FORUM_dist
85function balise_PARAMETRES_FORUM_dist($p) {
86
87        // s'il y a un id_article dans le contexte, regarder le statut
88        // accepter_forum de cet article
89        $_id_article = champ_sql('id_article', $p);
90        $p->code = '
91                // refus des forums ?
92                (quete_accepter_forum(' . $_id_article . ')=="non" OR
93                ($GLOBALS["meta"]["forums_publics"] == "non"
94                AND quete_accepter_forum(' . $_id_article . ') == ""))
95                ? "" : // sinon:
96                ';
97
98        // pas de calculs superflus si le site est monolingue
99        $lang = strpos($GLOBALS['meta']['langues_utilisees'], ',');
100
101        // si on est dans une boucle de forums, c'est une reponse
102        if ($p->type_requete == 'forums') {
103                $_id_reponse = champ_sql('id_forum', $p);
104        } else {
105                $_id_reponse = "null";
106        }
107
108        // objet et id_objet principaux sont a determiner
109        // dans le contexte ; on demande en tout etat de cause
110        // a la boucle mere de reserver son id_primary
111        if ($p->id_boucle
112                AND isset($p->boucles[$p->id_boucle])
113                AND $primary = $p->boucles[$p->id_boucle]->primary
114        ) {
115                $_type = _q($p->boucles[$p->id_boucle]->type_requete);
116                $_primary = champ_sql($primary, $p);
117        } else {
118                $_type = "null";
119                $_primary = "null";
120        }
121
122        // le code de base des parametres
123        $c = 'calcul_parametres_forum($Pile[0],'
124                . $_id_reponse . ',' . $_type . ',' . $_primary . ')';
125
126        // ajouter la lang, eventuellement donnee par le contexte
127        if ($lang) {
128                $_lang = champ_sql('lang', $p);
129                $c = "lang_parametres_forum($c,$_lang)";
130        }
131
132        // Syntaxe [(#PARAMETRES_FORUM{#SELF})] pour fixer le retour du forum
133        # note : ce bloc qui sert a recuperer des arguments calcules pourrait
134        # porter un nom et faire partie de l'API.
135        $retour = interprete_argument_balise(1, $p);
136        if ($retour === null) {
137                $retour = "''";
138        }
139
140        // Attention un eventuel &retour=xxx dans l'URL est prioritaire
141        $c .= '.
142        (($lien = (_request("retour") ? _request("retour") : str_replace("&amp;", "&", ' . $retour . '))) ? "&retour=".rawurlencode($lien) : "")';
143
144        $c = '(' . $c . ')';
145        // Ajouter le code d'invalideur specifique a cette balise
146        include_spip('inc/invalideur');
147        if ($i = charger_fonction('code_invalideur_forums', '', true)) {
148                $p->code .= $i($p, $c);
149        } else {
150                $p->code .= $c;
151        }
152
153        $p->interdire_scripts = false;
154
155        return $p;
156}
157
158// Cette fonction est appellee avec le contexte + trois parametres optionnels :
159// 1. $reponse = l'id_forum auquel on repond
160// 2. $type = le type de boucle dans lequel on se trouve, le cas echeant
161// 3. $primary = l'id_objet de la boucle dans laquelle on se trouve
162// elle doit renvoyer '', 'id_article=5' ou 'id_article=5&id_forum=12'
163// selon les cas
164function calcul_parametres_forum(&$env, $reponse, $type, $primary) {
165
166        // si c'est une reponse, on peut esperer que (objet,id_objet) sont dans
167        // la boucle mere, mais il est possible que non (forums imbriques etc)
168        // dans ce cas on va chercher dans la base.
169        if ($id_parent = intval($reponse)) {
170                if ($type
171                        AND $type != 'forums'
172                        AND $primary
173                ) {
174                        $forum = array('objet' => $type, 'id_objet' => $primary);
175                } else {
176                        $forum = sql_fetsel('objet, id_objet', 'spip_forum', 'id_forum=' . $id_parent);
177                }
178
179                if ($forum) {
180                        return id_table_objet($forum['objet']) . '=' . $forum['id_objet']
181                        . '&id_forum=' . $id_parent;
182                } else {
183                        return '';
184                }
185        }
186
187        // Ce n'est pas une reponse, on prend la boucle mere
188        if ($type AND $primary) {
189                return id_table_objet($type) . '=' . intval($primary);
190        }
191
192        // dernier recours, on regarde pour chacun des objets forumables
193        // ce que nous propose le contexte #ENV
194        foreach ($env as $k => $v) {
195                if (preg_match(',^id_([a-z_]+)$,S', $k)
196                        AND $id = intval($v)
197                ) {
198                        return id_table_objet($k) . '=' . $v;
199                }
200        }
201
202        return '';
203}
204
205# retourne le champ 'accepter_forum' d'un article
206function quete_accepter_forum($id_article) {
207        // si la fonction est appelee en dehors d'une boucle
208        // article (forum de breves), $id_article est nul
209        // mais il faut neanmoins accepter l'affichage du forum
210        // d'ou le 0=>'' (et pas 0=>'non').
211        static $cache = array(0 => '');
212
213        $id_article = intval($id_article);
214
215        if (isset($cache[$id_article])) {
216                return $cache[$id_article];
217        }
218
219        return $cache[$id_article] = sql_getfetsel('accepter_forum', 'spip_articles', "id_article=$id_article");
220}
221
222// Ajouter "&lang=..." si la langue du forum n'est pas celle du site.
223// Si le 2e parametre n'est pas une chaine, c'est qu'on n'a pas pu
224// determiner la table a la compil, on le fait maintenant.
225// Il faudrait encore completer: on ne connait pas la langue
226// pour une boucle forum sans id_article ou id_rubrique donne par le contexte
227// et c'est signale par un message d'erreur abscons: "table inconnue forum".
228//
229// http://code.spip.net/@lang_parametres_forum
230function lang_parametres_forum($qs, $lang) {
231        if (is_array($lang) AND preg_match(',id_([a-z_]+)=([0-9]+),', $qs, $r)) {
232                $id = 'id_' . $r[1];
233                if ($t = $lang[$id]) {
234                        $lang = sql_getfetsel('lang', $t, "$id=" . $r[2]);
235                }
236        }
237        // Si ce n'est pas la meme que celle du site, l'ajouter aux parametres
238
239        if ($lang AND $lang <> $GLOBALS['meta']['langue_site']) {
240                return $qs . "&lang=" . $lang;
241        }
242
243        return $qs;
244}
245
246// Pour que le compilo ajoute un invalideur a la balise #PARAMETRES_FORUM
247// Noter l'invalideur de la page contenant ces parametres,
248// en cas de premier post sur le forum
249// http://code.spip.net/@code_invalideur_forums
250function code_invalideur_forums_dist($p, $code) {
251        return $code;
252}
253
254?>
Note: See TracBrowser for help on using the repository browser.