source: spip-zone/_core_/branches/spip-3.0/plugins/forum/public/forum.php @ 104360

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

code.spip est maintenant en https, donc j'ajoute le "s" à http

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