source: spip-zone/_contribs_/_formulaires_/previsu_live/inc-formulaire_forum.php3 @ 1220

Last change on this file since 1220 was 1220, checked in by pierre.andrews@…, 15 years ago

un peu de doc pour la contrib. A tester chez vous

File size: 18.4 KB
Line 
1<?php
2
3/*
4  Copyright (C) 2005
5
6  addaptation depuis les fichiers fournis par la contrib:
7  http://www.spip-contrib.net/ecrire/articles.php3?id_article=1140
8  et les sources originales de spip:
9  http://www.spip.net
10
11
12  This program is free software; you can redistribute it and/or modify
13  it under the terms of the GNU General Public License as published by
14  the Free Software Foundation; either version 2 of the License, or any later version.
15
16  This program is distributed in the hope that it will be useful,
17  but WITHOUT ANY WARRANTY; without even the implied warranty of
18  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  GNU General Public License for more details.
20
21  You should have received a copy of the GNU General Public License
22  along with this program; if not, write to the Free Software
23  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
24*/
25
26
27if (!defined("_ECRIRE_INC_VERSION")) return;    #securite
28
29include_ecrire('inc_meta.php3');
30include_ecrire('inc_admin.php3');
31include_ecrire('inc_acces.php3');
32include_ecrire('inc_texte.php3');
33include_ecrire('inc_filtres.php3');
34include_ecrire('inc_lang.php3');
35include_ecrire('inc_mail.php3');
36include_ecrire('inc_forum.php3');
37include_ecrire("inc_abstract_sql.php3");
38include_local(_FILE_CONNECT);
39
40// Gestionnaire d'URLs
41if (@file_exists("inc-urls.php3"))
42        include_local("inc-urls.php3");
43else
44        include_local("inc-urls-".$GLOBALS['type_urls'].".php3");
45
46/*******************************/
47/* GESTION DU FORMULAIRE FORUM */
48/*******************************/
49
50// Contexte du formulaire
51global $balise_FORMULAIRE_FORUM_collecte;
52$balise_FORMULAIRE_FORUM_collecte = array('id_rubrique', 'id_forum', 'id_article', 'id_breve', 'id_syndic');
53
54
55// verification des droits a faire du forum
56function balise_FORMULAIRE_FORUM_stat($args, $filtres) {
57
58        // Note : ceci n'est pas documente !!
59        // $filtres[0] peut contenir l'url sur lequel faire tourner le formulaire
60        // exemple dans un squelette article.html : [(#FORMULAIRE_FORUM|forum.php3)]
61
62        // $args[5] peut contenir l'url sur lequel faire le retour
63        // exemple dans un squelette article.html : [(#FORMULAIRE_FORUM{#SELF})]
64
65        // recuperer les donnees du forum auquel on repond, false = forum interdit
66        list ($idr, $idf, $ida, $idb, $ids) = $args;
67        if (!$r = sql_recherche_donnees_forum ($idr, $idf, $ida, $idb, $ids))
68                return '';
69
70        list ($titre, $table, $forums_publics) = $r;
71
72        // Attention id_rubrique est passe pour les articles => on n'en veut pas
73        if ($idr > 0 AND ($ida OR $idb OR $ids))
74                $idr = 0;
75
76        return
77                array($titre, $table, $forums_publics, $idr, $idf, $ida, $idb, $ids,
78                        $filtres[0], $args[5]);
79}
80
81function balise_FORMULAIRE_FORUM_dyn($titre, $table, $forums_publics, $id_rubrique, $id_forum, $id_article, $id_breve, $id_syndic, $url, $url_param_retour) {
82        global $REMOTE_ADDR, $afficher_texte, $_COOKIE, $_POST;
83
84        // Recuperer les donnees postees du formulaire ou, a defaut, du contexte
85        foreach (array('id_article', 'id_breve', 'id_syndic',
86        'id_rubrique', 'id_forum') as $id)
87                if (isset($_POST['forum_'.$id]))
88                        $$id = intval($_POST['forum_'.$id]);
89                else
90                        $$id = intval($$id);
91
92        if ($id_rubrique) $id = 'r'.$id_rubrique;
93        if ($id_forum)   $id = 'f'.$id_forum;
94        if ($id_article)  $id = 'a'.$id_article;
95        if ($id_breve)  $id = 'b'.$id_breve;
96        if ($id_syndic)  $id = 's'.$id_syndic;
97       
98        // url de reference
99        if (!$url) {
100                $url = new Link();
101                $url = $url->getUrl();
102        } else {
103                // identifiants des parents
104                $args = array();
105                if ($id_rubrique) $args[] = "id_rubrique=$id_rubrique";
106                if ($id_forum) $args[] = "id_forum=$id_forum";
107                if ($id_article) $args[] = "id_article=$id_article";
108                if ($id_breve) $args[] = "id_breve=$id_breve";
109                if ($id_syndic) $args[] = "id_syndic=$id_syndic";
110                if (count($args))
111                        $url .= (strpos($url,'?') ? '&' : '?'). join('&',$args);
112        }
113
114        $url = ereg_replace("[?&]var_erreur=[^&]*", '', $url);
115        $url = ereg_replace("[?&]var_login=[^&]*", '', $url);
116        $url = ereg_replace("[?&]url=[^&]*", '', $url);
117
118        // verifier l'identite des posteurs pour les forums sur abo
119        if (($forums_publics == "abo") && (!$GLOBALS["auteur_session"])) {
120                return array('formulaire_login_forum', 0, array());
121        }
122
123        // ne pas mettre '', sinon le squelette n'affichera rien.
124        $previsu = ' ';
125
126        // au premier appel (pas de Post-var nommee "retour_forum")
127        // memoriser evntuellement l'URL de retour pour y revenir apres
128        // envoi du message ; aux appels suivants, reconduire la valeur.
129        // Initialiser aussi l'auteur
130        if (!$retour_forum = rawurldecode(_request('retour_forum'))) {
131                if ($retour_forum = rawurldecode(_request('retour')))
132                        $retour_forum = str_replace('&var_mode=recalcul','',$retour_forum);
133                else {
134                        // par defaut, on veut prendre url_forum(), mais elle ne sera connue
135                        // qu'en sortie, on inscrit donc une valeur absurde ("!")
136                        $retour_forum = "!";
137                       
138                        // sauf si on a passe un parametre en argument (exemple : {#SELF})
139                        if($url_param_retour)
140                                $retour_forum = str_replace("&amp;", "&", $url_param_retour);
141                }
142
143                //On cherche les infos de l'utilisateur dans les cookies
144                if (isset($_COOKIE['spip_forum_user'])
145                        AND is_array($cookie_user = unserialize($_COOKIE['spip_forum_user']))) {
146                        $auteur = $cookie_user['nom'];
147                        $email_auteur = $cookie_user['email'];
148                } else {
149                        $auteur = $GLOBALS['auteur_session']['nom'];
150                        $email_auteur = $GLOBALS['auteur_session']['email'];
151                }
152
153        } else {
154
155                // Recuperer le message a previsualiser
156                $titre = _request('titre');
157                $texte = _request('texte');
158                $auteur = _request('auteur');
159                $email_auteur = _request('email_auteur');
160                $nom_site_forum = _request('nom_site_forum');
161                $url_site = _request('url_site');
162                $ajouter_mot = _request('ajouter_mot'); // array
163
164                // Verifier mots associes au message
165                if (is_array($ajouter_mot))
166                $mots = preg_replace('/[^0-9,]/', '', join(',',$ajouter_mot));
167                else $mots = '0';
168
169                // affichage {par num type, type, num titre,titre}
170                $result_mots = spip_query("SELECT id_mot, titre, type
171                        FROM spip_mots
172                        WHERE id_mot IN ($mots)
173                        ORDER BY 0+type,type,0+titre,titre");
174                if (spip_num_rows($result_mots)>0) {
175                        $mots_forums = "<p>"._T('forum_avez_selectionne')."</p><ul>";
176                        while ($row = spip_fetch_array($result_mots)) {
177                                $les_mots[$row['id_mot']] = "checked='checked'";
178                                $presence_mots = true;
179                                $mots_forums .= "<li style='font-size: 80%;'> "
180                                . typo($row['type']) . "&nbsp;: <b>"
181                                . typo($row['titre']) ."</b></li>";
182                        }
183                        $mots_forums .= '</ul>';
184                }
185
186                //
187                // Preparer la previsualisation
188                //
189                if ($afficher_texte != 'non') {
190                        if (strlen($texte) < 10 AND !$presence_mots)
191                                $erreur = _T('forum_attention_dix_caracteres');
192                        else if (strlen($titre) < 3 AND $afficher_texte <> "non")
193                                $erreur = _T('forum_attention_trois_caracteres');
194                        else
195                                $bouton = _T('forum_message_definitif');
196
197                        $previsu = inclure_balise_dynamique(
198                                array(
199                                        'formulaire_forum_previsu',
200                                        0,
201                                        array(
202                                                'titre' => safehtml(typo($titre)),
203                                                'email_auteur' => safehtml($email_auteur),
204                                                'auteur' => safehtml(typo($auteur)),
205                                                'texte' => safehtml(propre($texte)),
206                                                'url_site' => safehtml($url_site),
207                                                'nom_site_forum' =>
208                                                        safehtml(typo($nom_site_forum)),
209                                                'mots_forum' => $mots_forum,
210                                                'erreur' => $erreur,
211                                                'bouton' => $bouton
212                                        )
213                                ), false);
214
215                        // supprimer les <form> de la previsualisation
216                        // (sinon on ne peut pas faire <cadre>...</cadre> dans les forums)
217                        $previsu = preg_replace("@<(/?)f(orm[>[:space:]])@ism",
218                                "<\\1no-f\\2", $previsu);
219                }
220
221        // Une securite qui nous protege contre :
222        // - les doubles validations de forums (derapages humains ou des brouteurs)
223        // - les abus visant a mettre des forums malgre nous sur un article (??)
224        // On installe un fichier temporaire dans _DIR_SESSIONS (et pas _DIR_CACHE
225        // afin de ne pas bugguer quand on vide le cache)
226        // Le lock est leve au moment de l'insertion en base (inc-messforum.php3)
227        // Ce systeme n'est pas fonctionnel pour les forums sans previsu (notamment
228        // si $afficher_texte = 'non')
229
230                $alea = preg_replace('/[^0-9]/', '', $alea);
231                if(!$alea OR !@file_exists(_DIR_SESSIONS."forum_$alea.lck")) {
232                        while (
233                                # astuce : mt_rand pour autoriser les hits simultanes
234                                $alea = time() + @mt_rand()
235                                AND @file_exists($f = _DIR_SESSIONS."forum_$alea.lck")) {};
236                        spip_touch ($f);
237                }
238
239                # et maintenant on purge les locks de forums ouverts depuis > 4 h
240                if ($dh = @opendir(_DIR_SESSIONS))
241                        while (($file = @readdir($dh)) !== false)
242                                if (preg_match('/^forum_([0-9]+)\.lck$/', $file)
243                                AND (time()-@filemtime(_DIR_SESSIONS.$file) > 4*3600))
244                                        @unlink(_DIR_SESSIONS.$file);
245
246                $hash = calculer_action_auteur("ajout_forum $id_rubrique $id_forum $id_article $id_breve $id_syndic $alea");
247        }
248
249        // Faut-il ajouter des propositions de mots-cles
250        if ($table AND (lire_meta("mots_cles_forums") == "oui"))
251                $table = table_des_mots($table, $les_mots);
252        else
253                $table = '';
254
255        // preparer les parametres du forum en input hidden
256        $parametres_forum = '';
257        foreach (array('alea', 'hash', 'retour_forum') as $var)
258                if ($val = entites_html($$var))
259                        $parametres_forum .=
260                        "<input type='hidden' name='$var' id='$var' value=\"$val\" />\n";
261        foreach (array(
262        'id_article', 'id_breve', 'id_syndic', 'id_rubrique', 'id_forum')
263        as $var)
264          if ($val = $$var) {
265                $parametres_forum .=
266                  "<input type='hidden' name='forum_$var'  id='forum_$var' value='$val' />\n";
267          }
268
269        return array('formulaire_forum', 0,
270        array(
271                'auteur' => $auteur,
272                'disabled' => ($forums_publics == "abo")? " disabled='disabled'" : '',
273                'email_auteur' => $email_auteur,
274                'modere' => (($forums_publics != 'pri') ? '' : _T('forum_info_modere')),
275                'nom_site_forum' => $nom_site_forum,
276                'previsu' => $previsu,
277                'table' => $table,
278                'texte' => $texte,
279                'titre' => extraire_multi($titre),
280                'url' =>  $url,
281                'url_site' => ($url_site ? $url_site : "http://"),
282                'parametres_forum' => $parametres_forum,
283                'id' => $id, //pour avoir un identifiant par formulaire, pour le javascript
284                ## gestion des la variable de personnalisation $afficher_texte
285                # mode normal : afficher le texte en < input text >, cf. squelette
286                'afficher_texte_input' => (($afficher_texte <> 'non') ? '&nbsp;' : ''),
287                # mode 'non' : afficher les elements en < input hidden >
288                'afficher_texte_hidden' => (($afficher_texte <> 'non') ? '' :
289                        (boutonne('hidden', 'titre', htmlspecialchars($titre)) .
290                                $table .
291                                "\n<br /><div align='right'>" .
292                                boutonne('submit', '', _T('forum_valider'),
293                                "class='spip_bouton'") .
294                                "</div>"))
295
296                ));
297}
298
299
300function barre_forum($texte,$num_formulaire,$id_preview='')
301{
302  //    include_ecrire('inc_layer.php3');
303        include("inc_ajax_previsu.php3");
304        include_ecrire('inc_barre.php3');
305        $toreturn = '';
306
307        if($id_preview) $toreturn .= '<script language="javascript" type="text/javascript" src="./squelettes/ajax.js"></script>';
308         $toreturn .= '<script type="text/javascript" src="./ecrire/spip_barre.js"></script>';
309        $toreturn .= afficher_barre("document.getElementById('formulaire_$num_formulaire')",true);      // AJAX
310
311        if($id_preview) {
312
313          //ce qui sera exectue quand on est pret à envoyer la demande de previsu (on sait alors qu'ajax fonctionne)
314          $onCallFunction = "var wait = document.getElementById('attente_$num_formulaire');";
315          $onCallFunction .= "if(wait != null) wait.style.display='block';";
316
317          //Verficication des longueurs
318          $onCallFunction .= "if(document.getElementById('formulaire_$num_formulaire').value.length < 10)";
319          $onCallFunction .= "  if(wait != null) {wait.innerHTML = '".addslashes(_T('forum_attention_dix_caracteres'))."'; envoiValide=false;}";
320          $onCallFunction .= "if(document.getElementById('titre_$num_formulaire').value.length < 3)";
321          $onCallFunction .= "  if(wait != null) {wait.innerHTML = '".addslashes(_T('forum_attention_trois_caracteres'))."}'; envoiValide=false;}";
322
323
324
325          //ce qui sera execute une fois qu'on a mise à jour le contenu de la previs
326          $onUpdateFunction .= "var area = document.getElementById('formulaire_$num_formulaire'); ";
327          $onUpdateFunction .= "var previewText = document.getElementById('$id_preview'); ";
328          $onUpdateFunction .= "if(!area.newHeight){ ";
329          $onUpdateFunction .= "  area.oldHeight = area.style.height; ";
330          $onUpdateFunction .= "  area.newHeight = Math.floor(parseInt(area.style.height)/2)+'px'; ";
331          $onUpdateFunction .= "  area.style.height = area.newHeight; ";
332          $onUpdateFunction .= "} ";
333          $onUpdateFunction .= "previewText.style.height = area.newHeight; ";
334          $onUpdateFunction .= "previewText.scrollTop = parseInt(previewText.scrollHeight*area.scrollTop/area.scrollHeight); ";
335          $onUpdateFunction .= "var wait = document.getElementById('attente_$num_formulaire');";
336          $onUpdateFunction .= "if(wait != null) {";
337          $onUpdateFunction .= "  wait.style.display='none';";
338          $onUpdateFunction .= "}";
339         
340        }
341       
342        $toreturn .=  "<TEXTAREA name='texte' rows='12' class='forml' cols='40'
343id='formulaire_$num_formulaire'
344onselect='storeCaret(this);'
345onclick='storeCaret(this);'
346onkeyup='storeCaret(this);'
347ondbclick='storeCaret(this);'";
348        if($id_preview) {
349          $toreturn .=  ' onchange="'.formUpdateAjaxDelay('forum_preview.php3',
350                                                                                                          Array("formulaire_$num_formulaire"),
351                                                                                                          $id_preview, 2, $onCallFunction, null, $onUpdateFunction).'"';
352          $toreturn .=  ' onkeypress="'.formUpdateAjaxDelay('forum_preview.php3',
353                                                                                                                Array("formulaire_$num_formulaire"),
354                                                                                                                $id_preview, 2, $onCallFunction, null, $onUpdateFunction).'"';
355        }
356        $toreturn .=  ">$texte</TEXTAREA>\n";
357
358        if($id_preview) {
359                          //script à l'initialisation, on va appeler en ajax la creation du lock pour valider la previsu
360          $toreturn .= "<script type='text/javascript'>\n";
361          //on crée un container pour placer ce que ca va nous retourner.
362          $toreturn .= "var field, fieldset;\n";
363          $toreturn .= "if(field = document.getElementById('formulaire_$num_formulaire')) {\n";
364          $toreturn .= "  fieldset = document.createElement('FIELDSET');\n";
365          $toreturn .= "  fieldset.style.display = 'none';\n";
366          $toreturn .= "  fieldset.id = 'hiddenset_$num_formulaire';\n";
367          $toreturn .= "  field.form.appendChild(fieldset);\n";
368         
369          $fieldset = Array("'formulaire_$num_formulaire'");
370          foreach (array(
371                                         "id_article", "id_breve", "id_syndic", "id_rubrique", "id_forum")
372                           as $var) {
373                $fieldset[] = "'forum_$var'";
374          }
375         
376
377          //si ce qui est retourné est juste, alors on peut avoir le bouton validation directe
378          $changeBouton = "if(request.responseText.length > 0) {";
379          $changeBouton .= "  var bouton = document.getElementById('bouton_valide_$num_formulaire');";
380          $changeBouton .= "  if(bouton != null) {";
381          $changeBouton .= "    bouton.value='"._T('forum_message_definitif')."';";
382          $changeBouton .= "    bouton.name='confirmer_forum';";
383          $changeBouton .= "  }";
384          $changeBouton .= "}";
385         
386          $changeBouton = addslashes($changeBouton);
387
388          $toreturn .= "  formUpdateField('valide_previsu.php3', 'Array(".
389                                                                           addslashes(join(',',$fieldset)).")', 
390                                                                           fieldset.id, null, null, '$changeBouton');\n";
391          $toreturn .= "}\n";     
392          $toreturn .= "</script>\n";
393
394        }
395        // AJAX
396        return $toreturn;
397}
398
399// Mots-cles dans les forums :
400// Si la variable de personnalisation $afficher_groupe[] est definie
401// dans le fichier d'appel, et si la table de reference est OK, proposer
402// la liste des mots-cles
403function table_des_mots($table, $les_mots) {
404        global $afficher_groupe;
405
406        if (!is_array($afficher_groupe)) return;
407
408        $in_group = " AND id_groupe IN (" . join($afficher_groupe, ", ") .")";
409
410        $result_groupe = spip_query("SELECT * FROM spip_groupes_mots
411        WHERE forum = 'oui' AND $table = 'oui'". $in_group);
412
413        $ret = '';
414        while ($row_groupe = spip_fetch_array($result_groupe)) {
415                $id_groupe = $row_groupe['id_groupe'];
416                $titre_groupe = propre($row_groupe['titre']);
417                $unseul = ($row_groupe['unseul']== 'oui') ? 'radio' : 'checkbox';
418                $result =spip_query("SELECT * FROM spip_mots
419                WHERE id_groupe='$id_groupe'");
420                $total_rows = spip_num_rows($result);
421
422                if ($total_rows > 0) {
423                        $ret .= "\n<p />"
424                          . "<div class='spip_encadrer' style='font-size: 80%;'>"
425                          . "<b>$titre_groupe&nbsp;:</b>"
426                          . "<table cellpadding='0' cellspacing='0' border='0' width='100%'>\n"
427                          ."<tr><td width='47%' valign='top'>";
428                        $i = 0;
429
430                while ($row = spip_fetch_array($result)) {
431                        $id_mot = $row['id_mot'];
432                        $titre_mot = propre($row['titre']);
433                        $descriptif_mot = propre($row['descriptif']);
434
435                        if ($i >= ($total_rows/2) AND $i < $total_rows) {
436                                $i = $total_rows + 1;
437                                $ret .= "</td><td width='6%'>&nbsp;</td>
438                                <td width='47%' valign='top'>";
439                        }
440
441                        $ret .= boutonne($unseul, "ajouter_mot[]", $id_mot, "id='mot$id_mot' " . $les_mots[$id_mot]) .
442                          afficher_petits_logos_mots($id_mot)
443                        . "<b><label for='mot$id_mot'>$titre_mot</label></b><br />";
444
445                        if ($descriptif_mot)
446                                $ret .= "$descriptif_mot<br />";
447                        $i++;
448                }
449
450                $ret .= "</td></tr></table>";
451                $ret .= "</div>";
452                }
453        }
454
455        return $ret;
456}
457
458
459function afficher_petits_logos_mots($id_mot) {
460        include_ecrire('inc_logos.php3');
461        $on = cherche_image_nommee("moton$id_mot");
462        if ($on) {
463          $image = ("$on[0]$on[1].$on[2]");
464                $taille = @getimagesize($image);
465                $largeur = $taille[0];
466                $hauteur = $taille[1];
467                if ($largeur < 100 AND $hauteur < 100)
468                        return "<img src='$image' align='middle' width='$largeur'
469                        height='$hauteur' hspace='1' vspace='1' alt=' ' border='0'
470                        class='spip_image' /> ";
471        }
472}
473
474
475
476/*******************************************************/
477/* FONCTIONS DE CALCUL DES DONNEES DU FORMULAIRE FORUM */
478/*******************************************************/
479
480//
481// Chercher le titre et la configuration du forum de l'element auquel on repond
482//
483
484function sql_recherche_donnees_forum ($idr, $idf, $ida, $idb, $ids) {
485
486        // changer la table de reference s'il y a lieu (pour afficher_groupes[] !!)
487        if ($ida) {
488                $r = "SELECT titre FROM spip_articles WHERE id_article = $ida";
489                $table = "articles";
490        } else if ($idb) {
491                $r = "SELECT titre FROM spip_breves WHERE id_breve = $idb";
492                $table = "breves";
493        } else if ($ids) {
494                $r = "SELECT nom_site AS titre FROM spip_syndic WHERE id_syndic = $ids";
495                $table = "syndic";
496        } else if ($idr) {
497                $r = "SELECT titre FROM spip_rubriques WHERE id_rubrique = $idr";
498                $table = "rubriques";
499        }
500
501        if ($idf)
502                $r = "SELECT titre FROM spip_forum WHERE id_forum = $idf";
503
504        if ($r) {
505                list($titre) = spip_fetch_array(spip_query($r));
506                $titre = supprimer_numero($titre);
507        } else
508                return;
509
510        // quelle est la configuration du forum ?
511        if ($ida)
512                list($accepter_forum) = spip_fetch_array(spip_query(
513                "SELECT accepter_forum FROM spip_articles WHERE id_article=$ida"));
514        if (!$accepter_forum)
515                $accepter_forum = substr(lire_meta("forums_publics"),0,3);
516        // valeurs possibles : 'pos'teriori, 'pri'ori, 'abo'nnement
517        if ($accepter_forum == "non")
518                return false;
519
520        return array ($titre, $table, $accepter_forum);
521}
522
523?>
Note: See TracBrowser for help on using the repository browser.