$pas) { if ($date) { preg_match('/^\w+/', $query['ORDER BY'], $m); $debut = navigation_trouve_date($date, $m[0], $pas, $query); } if ($total <= $debut) $debut = $total-$pas; $max = min($total, $debut+$enplus); $tranche = $debut; while (($tranche + $enplus) >= $max) $tranche -= $pas; if ($tranche <0) $tranche = 0; $h = generer_url_ecrire($script, $args); $nav = (!$tranche ? '' : "0| ... |\n"); $e = (_SPIP_AJAX === 1 ); for (;$tranche<$max;$tranche+=$pas){ if ($tranche == $debut) $nav .= "$tranche |\n"; else { $h = "$args&debut=$tranche"; $h = generer_url_ecrire($script, $h); if ($e) $e = "\nonclick=" . ajax_action_declencheur($h,$script); $nav .= "$tranche |\n"; } } if ($tranche < $total) { $h = generer_url_ecrire($script, $args . "&debut=" . $total); if ($e) { $e = "\nonclick=" . ajax_action_declencheur($h,$script); } $nav .= "... | $total"; } } $query['LIMIT'] = "$debut, $pas"; return $nav; } // http://doc.spip.org/@navigation_trouve_date function navigation_trouve_date($date, $nom_date, $pas, $query) { $debut = 0; if (!is_numeric($date)) { include_spip('inc/filtres'); list($a,$m,$j,$h,$n,$s) = recup_date($date); $date = mktime($h,$n,$s,$m ? $m : 1,$j ? $j : 1,$a); } $q = sql_select($query['SELECT'], $query['FROM'], $query['WHERE'], $query['GROUP BY'], $query['ORDER BY']); while ($r = sql_fetch($q)) { if ($r[$nom_date] <= $date) break; $debut++; } $debut -= ($debut%$pas); return $debut; } // tous les boutons de controle d'un forum // nb : les forums prives (privrac ou prive), une fois effaces // (privoff), ne sont pas revalidables ; le forum d'admin (privadm) // n'est pas effacable // http://doc.spip.org/@boutons_controle_forum function boutons_controle_forum($id_forum, $forum_stat, $forum_id_auteur=0, $ref, $forum_ip, $script, $args) { $controle = $original = $spam = ''; // selection du logo et des boutons correspondant a l'etat du forum switch ($forum_stat) { # forum sous un article dans l'espace prive case "prive": $logo = "forum-interne-24.gif"; $valider = false; $valider_repondre = false; $suppression = 'privoff'; break; # forum des administrateurs case "privadmin": $logo = "forum-admin-24.gif"; $valider = false; $valider_repondre = false; $suppression = false; break; # forum de l'espace prive, supprime (non revalidable, # d'ailleurs on ne sait plus a quel type de forum il appartenait) case "privoff": $logo = "forum-interne-24.gif"; $valider = false; $valider_repondre = false; $suppression = false; break; # forum general de l'espace prive case "privrac": $logo = "forum-interne-24.gif"; $valider = false; $valider_repondre = false; $suppression = 'privoff'; break; # forum publie sur le site public case "publie": $logo = "forum-public-24.gif"; $valider = false; $valider_repondre = false; $suppression = 'off'; break; # forum supprime sur le site public case "off": $logo = "forum-public-24.gif"; $valider = 'publie'; $valider_repondre = false; $suppression = false; $controle = "
"._T('info_message_supprime')." $forum_ip"; if($forum_id_auteur) $controle .= " - " ._T('lien_voir_auteur'). ""; break; # forum propose (a moderer) sur le site public case "prop": $logo = "forum-public-24.gif"; $valider = 'publie'; $valider_repondre = true; $suppression = 'off'; break; # forum signale comme spam sur le site public case "spam": $logo = "forum-public-24.gif"; $valider = 'publie'; $valider_repondre = false; $suppression = false; $spam = true; break; # forum original (reponse a un forum modifie) sur le site public case "original": $logo = "forum-public-24.gif"; $original = true; break; default: return; } $lien = generer_url_ecrire($script, $args, true, true) . "#forum$id_forum"; $boutons =''; if ($suppression) $boutons .= icone_inline(_T('icone_supprimer_message'), generer_action_auteur('instituer_forum',"$id_forum-$suppression", $lien), $logo, "supprimer.gif", 'right', 'non'); if ($valider) $boutons .= icone_inline(_T('icone_valider_message'), generer_action_auteur('instituer_forum',"$id_forum-$valider", $lien), $logo, "creer.gif", 'right', 'non'); if ($valider_repondre) { $dblret = rawurlencode(_DIR_RESTREINT_ABS . $lien); $boutons .= icone_inline(_T('icone_valider_message') . " & " . _T('lien_repondre_message'), generer_action_auteur('instituer_forum',"$id_forum-$valider", generer_url_public('forum', "$ref&id_forum=$id_forum&retour=$dblret", true, true)), $logo, "creer.gif", 'right', 'non'); } if ($boutons) $controle .= "
". $boutons . "
"; // TODO: un bouton retablir l'original ? if ($original) { $controle .= "
" ."(" ._T('forum_info_original') .")
"; } if ($spam) { $controle .= "
" ."(" ._T('spam') // Marque' comme spam ? .")
"; } return $controle; } // recuperer le critere SQL qui selectionne nos forums // http://doc.spip.org/@critere_statut_controle_forum function critere_statut_controle_forum($type, $id_rubrique=0, $recherche='') { if (is_array($id_rubrique)) $id_rubrique = join(',',$id_rubrique); if (!$id_rubrique) { $from = 'spip_forum AS F'; $where = ""; $and = ""; } else { if (strpos($id_rubrique,',')) $eq = " IN ($id_rubrique)"; else $eq = "=$id_rubrique"; $from = 'spip_forum AS F, spip_articles AS A'; $where = "A.id_secteur$eq AND F.id_article=A.id_article"; $and = ' AND '; } switch ($type) { case 'public': $and .= "F.statut IN ('publie', 'off', 'prop', 'spam') AND F.texte!=''"; break; case 'prop': $and .= "F.statut='prop'"; break; case 'spam': $and .= "F.statut='spam'"; break; case 'interne': $and .= "F.statut IN ('prive', 'privrac', 'privoff', 'privadm') AND F.texte!=''"; break; case 'vide': $and .= "F.statut IN ('publie', 'off', 'prive', 'privrac', 'privoff', 'privadm') AND F.texte=''"; break; default: $where = '0=1'; $and =''; break; } if ($recherche) { # recherche par IP if (preg_match(',^\d+\.\d+\.(\*|\d+\.(\*|\d+))$,', $recherche)) { $and .= " AND ip LIKE ".sql_quote(str_replace('*', '%', $recherche)); } else { include_spip('inc/rechercher'); if ($a = recherche_en_base($recherche, 'forum')) $and .= " AND ".sql_in('id_forum', array_keys(array_pop($a))); else $and .= " AND 0=1"; } } return array($from, "$where$and"); } // Index d'invalidation des forums // http://doc.spip.org/@calcul_index_forum function calcul_index_forum($id_article, $id_breve, $id_rubrique, $id_syndic) { if ($id_article) return 'a'.$id_article; if ($id_breve) return 'b'.$id_breve; if ($id_rubrique) return 'r'.$id_rubrique; if ($id_syndic) return 's'.$id_syndic; } // // Recalculer tous les threads // // http://doc.spip.org/@calculer_threads function calculer_threads() { // fixer les id_thread des debuts de discussion sql_update('spip_forum', array('id_thread'=>'id_forum'), "id_parent=0"); // reparer les messages qui n'ont pas l'id_secteur de leur parent do { $discussion = "0"; $precedent = 0; $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"); while ($row = sql_fetch($r)) { if ($row['thread'] == $precedent) $discussion .= "," . $row['id']; else { if ($precedent) sql_updateq("spip_forum", array("id_thread" => $precedent), "id_forum IN ($discussion)"); $precedent = $row['thread']; $discussion = $row['id']; } } sql_updateq("spip_forum", array("id_thread" => $precedent), "id_forum IN ($discussion)"); } while ($discussion != "0"); } // Calculs des URLs des forums (pour l'espace public) // http://doc.spip.org/@racine_forum function racine_forum($id_forum){ if (!$id_forum = intval($id_forum)) return false; $row = sql_fetsel("id_parent, id_rubrique, id_article, id_breve, id_syndic, id_message, id_thread", "spip_forum", "id_forum=".$id_forum); if (!$row) return false; if ($row['id_parent'] AND $row['id_thread'] != $id_forum) // eviter boucle infinie return racine_forum($row['id_thread']); if ($row['id_message']) return array('message', $row['id_message'], $id_forum); if ($row['id_rubrique']) return array('rubrique', $row['id_rubrique'], $id_forum); if ($row['id_article']) return array('article', $row['id_article'], $id_forum); if ($row['id_breve']) return array('breve', $row['id_breve'], $id_forum); if ($row['id_syndic']) return array('site', $row['id_syndic'], $id_forum); // On ne devrait jamais arriver ici, mais prevoir des cas de forums // poses sur autre chose que les objets prevus... spip_log("erreur racine_forum $id_forum"); return array(); } // http://doc.spip.org/@parent_forum function parent_forum($id_forum) { if (!$id_forum = intval($id_forum)) return; $row = sql_fetsel("id_parent, id_rubrique, id_article, id_breve, id_syndic", "spip_forum", "id_forum=".$id_forum); if(!$row) return array(); if($row['id_parent']) return array('forum', $row['id_parent']); if($row['id_article']) return array('article', $row['id_article']); if($row['id_breve']) return array('breve', $row['id_breve']); if($row['id_rubrique']) return array('rubrique', $row['id_rubrique']); if($row['id_syndic']) return array('site', $row['id_syndic']); } // obsolete, maintenu poru compat // http://doc.spip.org/@generer_url_forum_dist function generer_url_forum_dist($id_forum, $args='', $ancre='') { $generer_url_externe = charger_fonction("generer_url_forum",'urls'); return $generer_url_externe($id_forum, $args, $ancre); } // http://doc.spip.org/@generer_url_forum_parent function generer_url_forum_parent($id_forum) { if ($id_forum = intval($id_forum)) { list($type, $id) = parent_forum($id_forum); if ($type) return generer_url_entite($id, $type); } return ''; } // Quand on edite un forum, on tient a conserver l'original // sous forme d'un forum en reponse, de statut 'original' // http://doc.spip.org/@conserver_original function conserver_original($id_forum) { $s = sql_fetsel("id_forum", "spip_forum", "id_parent=".sql_quote($id_forum)." AND statut='original'"); if ($s) return ''; // pas d'erreur // recopier le forum $t = sql_fetsel("*", "spip_forum", "id_forum=".sql_quote($id_forum)); if ($t) { unset($t['id_forum']); $id_copie = sql_insertq('spip_forum', $t); if ($id_copie) { sql_updateq('spip_forum', array('id_parent'=> $id_forum, 'statut'=>'original'), "id_forum=$id_copie"); return ''; // pas d'erreur } } return '&erreur'; } // appelle conserver_original(), puis modifie le contenu via l'API inc/modifier // http://doc.spip.org/@enregistre_et_modifie_forum function enregistre_et_modifie_forum($id_forum, $c=false) { if ($err = conserver_original($id_forum)) { spip_log("erreur de sauvegarde de l'original, $err"); return; } include_spip('inc/modifier'); return revision_forum($id_forum, $c); } // // Afficher les forums // // http://doc.spip.org/@afficher_forum function afficher_forum($query, $retour, $arg, $controle_id_article = false, $script='', $argscript='') { global $spip_display; static $compteur_forum = 0; static $nb_forum = array(); static $thread = array(); $request = sql_allfetsel($query['SELECT'], $query['FROM'], $query['WHERE'], $query['GROUP BY'], $query['ORDER BY'], $query['LIMIT']); $compteur_forum++; $nb_forum[$compteur_forum] = count($request); $thread[$compteur_forum] = 1; $res = ''; foreach($request as $row) { $statut=$row['statut']; $id_parent=$row['id_parent']; if (($controle_id_article) ? ($statut!="perso") : (($statut=="prive" OR $statut=="privrac" OR $statut=="privadm" OR $statut=="perso") OR ($statut=="publie" AND $id_parent > 0))) { $query = array('SELECT' => "*", 'FROM' => "spip_forum", 'WHERE' => "id_parent='" . $row['id_forum'] . "'" . ($controle_id_article ? '':" AND statut<>'off'"), 'ORDER BY' => "date_heure"); $bloc = afficher_forum_thread($row, $controle_id_article, $compteur_forum, $nb_forum, $thread, $retour, $arg, $script, $argscript) . afficher_forum($query, $retour, $arg, $controle_id_article, $script, $argscript); $res .= ajax_action_greffe('poster_forum_prive', $row['id_forum'], $bloc); } $thread[$compteur_forum]++; } $compteur_forum--; if ($spip_display == 4 AND $res) $res = ""; return $res; } // Construit une Div comportant un unique message, // plus les lignes verticales de conduite // http://doc.spip.org/@afficher_forum_thread function afficher_forum_thread($row, $controle_id_article, $compteur_forum, $nb_forum, $i, $retour, $arg, $script, $argscript) { global $spip_lang_right, $spip_display; static $voir_logo = array(); // pour ne calculer qu'une fois if (is_array($voir_logo)) { $voir_logo = (($spip_display != 1 AND $spip_display != 4 AND $GLOBALS['meta']['image_process'] != "non") ? "position: absolute; $spip_lang_right: 0px; margin: 0px; margin-top: -3px; margin-$spip_lang_right: 0px;" : ''); } $id_forum=$row['id_forum']; $id_parent=$row['id_parent']; $id_rubrique=$row['id_rubrique']; $id_article=$row['id_article']; $id_breve=$row['id_breve']; $id_message=$row['id_message']; $id_syndic=$row['id_syndic']; $id_auteur=$row["id_auteur"]; $titre=$row['titre']; $texte=$row['texte']; $nom_site=$row['nom_site']; $url_site=$row['url_site']; $statut=$row['statut']; $ip=$row["ip"]; $h = (!$id_article ? '' : generer_url_entite($id_article, 'article')) . "#forum$id_forum"; $titre_boite = "" . typo($titre) . ''; if ($spip_display == 4) { $res = $titre_boite ."
"; } else { if ($id_auteur AND $voir_logo) { $chercher_logo = charger_fonction('chercher_logo', 'inc'); if ($logo = $chercher_logo($id_auteur, 'id_auteur', 'on')) { list($fid, $dir, $nom, $format) = $logo; include_spip('inc/filtres_images_mini'); $logo = image_reduire("", 48, 48); if ($logo) $titre_boite = "\n
$logo
$titre_boite" ; } } $res = "" . afficher_forum_4($compteur_forum, $nb_forum, $i) . "\n" . (($compteur_forum == 1) ? debut_cadre_forum(forum_logo($statut), true, "", $titre_boite) : debut_cadre_thread_forum("", true, "", $titre_boite)); } // Si refuse, cadre rouge if ($statut=="off") { $style =" style='border: 2px dashed red; padding: 5px;'"; } // Si propose, cadre jaune else if ($statut=="prop") { $style = " style='border: 1px solid yellow; padding: 5px;'"; } // Si original, cadre vert else if ($statut=="original") { $style = " style='border: 1px solid green; padding: 5px;'"; } else $style = ''; $mots = afficher_forum_mots($id_forum); $res .= "\n" . afficher_forum_auteur($row) . (!$controle_id_article ? '' : boutons_controle_forum($id_forum, $statut, $id_auteur, "id_article=$id_article", $ip, $script, $argscript)) . "
" . safehtml(justifier(propre($texte))) . "
\n" . (!$nom_site ? '' : ((strlen($url_site) > 10) ? "\n
$nom_site
" : "$nom_site")) . ($controle_id_article ? '' : repondre_forum($row, $titre, $statut, "$retour?$arg", _T('lien_repondre_message'))) . $mots . ""; if ($spip_display == 4) return "\n
  • $res
  • \n"; if ($compteur_forum == 1) $res .= fin_cadre_forum(true); else $res .= fin_cadre_thread_forum(true); $res .= ""; return "$res
    \n"; } // http://doc.spip.org/@repondre_forum function repondre_forum($row, $titre, $statut, $retour, $clic) { $id_forum = $row['id_forum']; $id_thread = $row['id_thread']; $ancre = "poster_forum_prive-$id_thread"; $lien = generer_url_ecrire("poster_forum_prive", "statut=$statut&id_parent=$id_forum&titre_message=" . rawurlencode($titre) . "&script=" . urlencode($retour)) . '#formulaire'; return "
    " . $clic . "
    \n"; } // http://doc.spip.org/@afficher_forum_auteur function afficher_forum_auteur($row) { $titre=$row['titre']; $id_auteur=$row["id_auteur"]; $date_heure=$row['date_heure']; $email_auteur=$row['email_auteur']; $auteur= extraire_multi($row['auteur']); if ($id_auteur) { $formater_auteur = charger_fonction('formater_auteur', 'inc'); $res = join(' ',$formater_auteur($id_auteur)); } else { if ($email_auteur) { if (email_valide($email_auteur)) $email_auteur = "".$email_auteur .""; $auteur .= " — $email_auteur"; } $res = safehtml(" / $auteur"); } return "
    " . date_interface($date_heure) . "  $res
    "; } // http://doc.spip.org/@afficher_forum_mots function afficher_forum_mots($id_forum) { if ($GLOBALS['meta']["mots_cles_forums"] <> "oui") return ''; $mots = sql_allfetsel("titre, type", "spip_mots AS M LEFT JOIN spip_mots_forum AS L ON L.id_mot=M.id_mot", "L.id_forum=" . intval($id_forum)); foreach ($mots as $k => $r) { $mots[$k] = propre('' . $r['type'] . ' :') . ' ' . propre($r['titre']); } if (!$mots) return ''; return ("\n\n"); } // affiche les traits de liaisons entre les reponses // http://doc.spip.org/@afficher_forum_4 function afficher_forum_4($compteur_forum, $nb_forum, $thread) { global $spip_lang_rtl; $fleche2="forum-droite$spip_lang_rtl.gif"; $fleche='rien.gif'; $vertical = chemin_image('forum-vert.gif'); $rien = chemin_image('rien.gif'); $res = ''; for ($j=2;$j<=$compteur_forum AND $j<20;$j++){ $res .= "" . http_img_pack(($j==$compteur_forum) ? $fleche2 : $fleche, "", "width='10' height='13'") . "\n"; } return $res; } ?>