source: spip-zone/_core_/branches/spip-2.1/plugins/forum/inc/forum.php @ 94398

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

bonne année.

File size: 6.0 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;
14include_spip('inc/actions');
15
16// recuperer le critere SQL qui selectionne nos forums
17// http://code.spip.net/@critere_statut_controle_forum
18function critere_statut_controle_forum($type, $id_rubrique=0, $recherche='') {
19
20        if (is_array($id_rubrique))   $id_rubrique = join(',',$id_rubrique);
21        if (!$id_rubrique) {
22                $from = 'spip_forum AS F';
23                $where = "";
24                $and = "";
25        } else {
26                if (strpos($id_rubrique,','))
27                  $eq = " IN ($id_rubrique)";
28                else $eq = "=$id_rubrique";
29             
30                $from = 'spip_forum AS F, spip_articles AS A';
31                $where = "A.id_secteur$eq AND F.objet='article' AND F.id_objet=A.id_article";
32                $and = ' AND ';
33        }
34   
35        switch ($type) {
36        case 'public':
37                $and .= "F.statut IN ('publie', 'off', 'prop', 'spam') AND F.texte!=''";
38                break;
39        case 'prop':
40                $and .= "F.statut='prop'";
41                break;
42        case 'spam':
43                $and .= "F.statut='spam'";
44                break;
45        case 'interne':
46                $and .= "F.statut IN ('prive', 'privrac', 'privoff', 'privadm') AND F.texte!=''";
47                break;
48        case 'vide':
49                $and .= "F.statut IN ('publie', 'off', 'prive', 'privrac', 'privoff', 'privadm') AND F.texte=''";
50                break;
51        default:
52                $where = '0=1';
53                $and ='';
54                break;
55        }
56
57        if ($recherche) {
58                # recherche par IP
59                if (preg_match(',^\d+\.\d+\.(\*|\d+\.(\*|\d+))$,', $recherche)) {
60                        $and .= " AND ip LIKE ".sql_quote(str_replace('*', '%', $recherche));
61                } else {
62                        include_spip('inc/rechercher');
63                        if ($a = recherche_en_base($recherche, 'forum'))
64                                $and .= " AND ".sql_in('id_forum',
65                                        array_keys(array_pop($a)));
66                        else
67                                $and .= " AND 0=1";
68                }
69        }
70
71        return array($from, "$where$and");
72}
73
74// Index d'invalidation des forums
75// obsolete, remplace par l'appel systematique a 2 invalideurs :
76// - forum/id_forum
77// - objet/id_objet
78// http://code.spip.net/@calcul_index_forum
79function calcul_index_forum($objet,$id_objet) {
80        return substr($objet,0,1).$id_objet;
81}
82
83//
84// Recalculer tous les threads
85//
86// http://code.spip.net/@calculer_threads
87function calculer_threads() {
88        // fixer les id_thread des debuts de discussion
89        sql_update('spip_forum', array('id_thread'=>'id_forum'), "id_parent=0");
90        // reparer les messages qui n'ont pas l'id_secteur de leur parent
91        do {
92                $discussion = "0";
93                $precedent = 0;
94                $r = sql_select("fille.id_forum AS id,  maman.id_thread AS thread", 'spip_forum AS fille, spip_forum AS maman', "fille.id_parent = maman.id_forum AND fille.id_thread <> maman.id_thread",'', "thread");
95                while ($row = sql_fetch($r)) {
96                        if ($row['thread'] == $precedent)
97                                $discussion .= "," . $row['id'];
98                        else {
99                                if ($precedent)
100                                        sql_updateq("spip_forum", array("id_thread" => $precedent), "id_forum IN ($discussion)");
101                                $precedent = $row['thread'];
102                                $discussion = $row['id'];
103                        }
104                }
105                sql_updateq("spip_forum", array("id_thread" => $precedent), "id_forum IN ($discussion)");
106        } while ($discussion != "0");
107}
108
109// Calculs des URLs des forums (pour l'espace public)
110// http://code.spip.net/@racine_forum
111function racine_forum($id_forum){
112        if (!$id_forum = intval($id_forum)) return false;
113
114        $row = sql_fetsel("id_parent, objet, id_objet, id_thread", "spip_forum", "id_forum=".$id_forum);
115
116        if (!$row) return false;
117
118        if ($row['id_parent']
119        AND $row['id_thread'] != $id_forum) // eviter boucle infinie
120                return racine_forum($row['id_thread']);
121
122        return array($row['objet'], $row['id_objet'], $id_forum);
123} 
124
125
126// http://code.spip.net/@parent_forum
127function parent_forum($id_forum) {
128        if (!$id_forum = intval($id_forum)) return;
129        $row = sql_fetsel("id_parent, objet, id_objet", "spip_forum", "id_forum=".$id_forum);
130        if(!$row) return array();
131        if ($row['id_parent'])
132                return array('forum', $row['id_parent']);
133        else
134                return array($row['objet'], $row['id_objet']);
135} 
136
137
138/**
139 * Pour compatibilite : remplacer les appels par son contenu
140 *
141 * @param unknown_type $id_forum
142 * @param unknown_type $args
143 * @param unknown_type $ancre
144 * @return unknown
145 */
146function generer_url_forum_dist($id_forum, $args='', $ancre='') {
147        $generer_url_forum = charger_fonction('generer_url_forum','urls');
148        return $generer_url_forum($id_forum, $args, $ancre);
149}
150
151
152// http://code.spip.net/@generer_url_forum_parent
153function generer_url_forum_parent($id_forum) {
154        if ($id_forum = intval($id_forum)) {
155                list($type, $id) = parent_forum($id_forum);
156                if ($type)
157                        return generer_url_entite($id, $type);
158        }
159        return '';
160} 
161
162
163// Quand on edite un forum, on tient a conserver l'original
164// sous forme d'un forum en reponse, de statut 'original'
165// http://code.spip.net/@conserver_original
166function conserver_original($id_forum) {
167        $s = sql_fetsel("id_forum", "spip_forum", "id_parent=".sql_quote($id_forum)." AND statut='original'");
168
169        if ($s) return ''; // pas d'erreur
170
171        // recopier le forum
172        $t = sql_fetsel("*", "spip_forum", "id_forum=".sql_quote($id_forum));
173
174        if ($t) {
175                unset($t['id_forum']);
176                $id_copie = sql_insertq('spip_forum', $t);
177                if ($id_copie) {
178                        sql_updateq('spip_forum', array('id_parent'=> $id_forum, 'statut'=>'original'), "id_forum=$id_copie");
179                        return ''; // pas d'erreur
180                }
181        }
182
183        return '&erreur';
184}
185
186// appelle conserver_original(), puis modifie le contenu via l'API inc/modifier
187// http://code.spip.net/@enregistre_et_modifie_forum
188function enregistre_et_modifie_forum($id_forum, $c=false) {
189        if ($err = conserver_original($id_forum)) {
190                spip_log("erreur de sauvegarde de l'original, $err");
191                return;
192        }
193
194        include_spip('action/editer_forum');
195        return revision_forum($id_forum, $c);
196}
197
198
199?>
Note: See TracBrowser for help on using the repository browser.