".$temp.""; return $ret_string; } # Classe Pretextes # =============================================== class Pretextes{ function style_css($bgcolor, $table_bgcolor, $nlink, $vlink, $alink, $txt_color, $filinfobgcolor, $titresbgcolor, $filtxtbgcolor, $extension){ include("pretextes.style.".$extension); } /*======================================================================================= * Contruit le début de la page * @param string $bgcolor Couleur de fond de la page * @param string $nomforum L'adresse email à encoder * @param string $nlink Couleur liens * @param string $alink Couleur liens visités * @param string $vlink Couleur liens actifs * @param string $table_bgcolor Couleur de fond des tables de navigation * @return string Le code html d'en-tête =======================================================================================*/ function debut_html($nomforum, $nlink, $alink, $vlink, $bgcolor, $table_bgcolor, $txt_color, $filinfobgcolor, $titresbgcolor, $filtxtbgcolor, $extension){ echo "\n\n"; echo "\n"; echo "\n".$nomforum."\n"; // echo ""; echo "\n"; echo "\n"; $this->style_css($bgcolor, $table_bgcolor, $nlink, $vlink, $alink, $txt_color, $filinfobgcolor, $titresbgcolor, $filtxtbgcolor, $extension); echo "\n"; # NE PAS MODIFIER LA LIGNE SUIVANTE, ELLE DONNE LES COULEURS DE VOTRE PAGE. echo "\n"; } /*======================================================================================= * Affiche un message d'erreur si le sujet et/ou le corps du message sont vides * @param string $message Le code du message d'erreur * @return string Le message d'erreur =======================================================================================*/ function retour_message($message, $_retour_message){ if (isset($message)){ echo "".$_retour_message[$message].""; } } # Fin de la fonction retour_message() /*======================================================================================= * Encode les adresses email pour tromper les méchants robots spammeurs * @param string $email L'adresse email à encoder * @return string $ret_string L'adresse email encodée =======================================================================================*/ function email_encode($email){ $ret_string=""; $len=strlen($email); for($x=0;$x<$len;$x++){ $ord=ord(substr($email,$x,1)); $ret_string.="&#$ord;"; } return $ret_string; } # Fin de la fonction email_encode() /*======================================================================================= * Construit les boutons de navigation "suivants" et "précédents" =======================================================================================*/ function boutons_nav($env_php_self, $debut, $parpage, $b_type, $recherche, $_barre_nav, $rt, $page){ if(isset($recherche)){ $fin_url = "&recherche=".$recherche."&rt=".$rt; } switch ($b_type){ case "suivant": $r_bouton_nav .= " | ".$_barre_nav[3]." >>"; break; case "pre": $r_bouton_nav .= "<< ".$_barre_nav[2]." | "; break; } return $r_bouton_nav; } # Fin de la fonction boutons_nav() /*======================================================================================= * Affiche une cellule qui contient les liens de navigation * @param string $colspan Paramètre d'etendue de la cellule * @param string $env_php_self Adresse relative du forum * @param string $barre_nav La barre qui permet de naviguer entres les résultats * @return string La liste des pages de résultats. =======================================================================================*/ function barre_nav($debut, $nb_resultats, $parpage, $total_resultats, $env_php_self, $_barre_nav, $recherche, $rt, $page){ $nb_page = $total_resultats / $parpage; for($buffer=0; $buffer < ceil($nb_page); $buffer++){} if($debut != "0" AND ($nb_resultats < $parpage OR ($debut + $parpage) == $total_resultats)){ $barre_nav = $_barre_nav[1]; $barre_nav .= $this->boutons_nav($env_php_self, $debut, $parpage, "pre", $recherche, $_barre_nav, $rt, $page); $barre_nav .= $this->liste_page($total_resultats, $debut, $nb_page, $env_php_self, $parpage, $recherche, $rt, $page); } elseif($nb_resultats == "$parpage" AND $debut != "0"){ $barre_nav = $_barre_nav[1].$this->boutons_nav($env_php_self, $debut, $parpage, "pre", $recherche, $_barre_nav, $rt, $page); $barre_nav .= $this->liste_page($total_resultats, $debut, $nb_page, $env_php_self, $parpage, $recherche, $rt, $page); $barre_nav .= $this->boutons_nav($env_php_self, $debut, $parpage, "suivant", $recherche, $_barre_nav, $rt, $page); } elseif($total_resultats != $nb_resultats AND ($debut == "0" OR ($debut + $parpage) != $total_resultats)){ $barre_nav = $_barre_nav[1]; $barre_nav .= $this->liste_page($total_resultats, $debut, $nb_page, $env_php_self, $parpage, $recherche, $rt, $page); $barre_nav .= $this->boutons_nav($env_php_self, $debut, $parpage, "suivant", $recherche, $_barre_nav, $rt, $page); } return $barre_nav; } # Fin de la fonction barre_nav /*======================================================================================= * Construit les liens qui listent les pages de résultats et affiche par nb page + 10 =======================================================================================*/ function liste_page($total_resultats, $debut, $nb_page, $env_php_self, $parpage, $recherche, $rt, $page){ $x = 0; $max_i = 10 + $page; if($total_resultats > 0){ if(isset($recherche)){ $fin_url = "&recherche=".$recherche."&rt=".$rt; } for($i=0; $i($max_i-12) OR $i>(ceil($nb_page)-10))){ if(($i+1) == $page){ $liste .= " ".($i+1)." "; } else{ $liste .= " ".($i + 1)." "; } } $x = $x + $parpage; } } return $liste; } # Fin de la fonction liste_page() function cellule_retour($colspan, $table_bgcolor, $env_php_self, $_cellule_retour, $debut, $recherche, $page){ echo " \n ".$_cellule_retour[1]."\n \n"; } # Fin de la fonction cellule_retour() function cellule_navigation($colspan, $table_bgcolor, $env_php_self, $barre_nav){ echo " \n ".$barre_nav."\n \n"; } # Fin de la fonction cellule_navigation() /*======================================================================================= * Formate le résultats des requètes d'affichage * @param array $res Résultat du mysql_fetch_array * @return array Tableau des résultats formatés =======================================================================================*/ function formatage_res($res, $recherche_html, $recherche, $lecture){ $temp_resultat[nom] = stripslashes($res[nom]); if($temp_resultat[nom] == ""){$temp_resultat[nom] = "(anonyme)";} $temp_resultat[email] = stripslashes($res[email]); $temp_resultat[sujet] = stripslashes($res[sujet]); if($temp_resultat[sujet] == ""){$temp_resultat[sujet] = "(sans titre)";} $temp_resultat[email] = $this->email_encode($temp_resultat[email]); if(isset($lecture)){ $temp_resultat[texte] = htmlentities($res[texte]); $temp_resultat[texte] = stripslashes($temp_resultat[texte]); # Transforme les urls et les adresses email en liens "cliquables" $texte = $temp_resultat[texte]; $texte = eregi_replace("(http|ftp+)://([^[:space:]]*)([[:alnum:]|[:punct:]])", "\\1://\\2\\3", $texte); $texte = eregi_replace("\[\[\(([0-9]+)\)\]\]","> Message \\1",$texte); $texte = eregi_replace("\[\(\[([[:alnum:]|[:punct:]]+)\]\)\]([^[:space:]]*)([[:alnum:]|[:punct:]])", "\\1", $texte); $texte = eregi_replace("\[\(f\[([[:alnum:]|[:punct:]]+)\]f\)\]([^[:space:]]*)([[:alnum:]|[:punct:]])", "\\1", $texte); $texte = eregi_replace("\[\(i\[([[:alnum:]|[:punct:]]+)\]i\)\]([^[:space:]]*)([[:alnum:]|[:punct:]])", "\\1", $texte); $texte = eregi_replace("\[\(u\[([[:alnum:]|[:punct:]]+)\]u\)\]([^[:space:]]*)([[:alnum:]|[:punct:]])", "\\1", $texte); //$texte = preg_replace("[\n|\n\r]", "
", $texte); $temp_resultat[texte] = $texte; $temp_resultat[texte] = nl2br($temp_resultat[texte]); preg_match("#PHP/([0-9])#", $_SERVER['SERVER_SOFTWARE'], $env_php_ver); # Récupère le numéro de version de php if($env_php_ver[1]>3){ # Si la version de php est supérieur à la 3, on peut utiliser les fonction email_encode_preg() et wordwrap() $temp_resultat[texte] = @wordwrap($temp_resultat[texte], 72 , "\n", 1); $temp_resultat[texte] = @preg_replace("/([_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)+)/ei", "email_encode_preg('\\1')", $temp_resultat[texte]); } else{ # Si php est en version 3, on doit se passer de la susdite fonction $temp_resultat[texte] = preg_replace("/([_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)+)/i", "\\1", $temp_resultat[texte]); } } if(isset($recherche)){ # Si on est en mode recherche on lance le traitement des résultats $temp_resultat[sujet] = $res[sujet]; $temp_resultat[texte] = $res[texte]; $temp_resultat[nom] = $res[nom]; $pos = strpos("$temp_resultat[texte]", "$recherche"); $longueur_recherche = strlen($recherche); $longueur_texte = strlen($temp_resultat[texte]); $debut_texte = $pos - 50; $fin = $longueur_recherche + 80; if($debut_texte<0){$debut_texte = O;} if($fin>$longueur_texte){$fin = $longueur_texte;} $temp_resultat[texte] = substr("$temp_resultat[texte]", $debut_texte, $fin); $temp_resultat[texte] = htmlentities($temp_resultat[texte]); $temp_resultat[texte] = preg_replace("#($recherche_html)#i", "\\1", $temp_resultat[texte]); $temp_resultat[nom] = preg_replace("#($recherche_html)#i", "\\1", $temp_resultat[nom]); $temp_resultat[sujet] = preg_replace("#($recherche_html)#i", "\\1", $temp_resultat[sujet]); $temp_resultat[texte] = stripslashes($temp_resultat[texte]); $temp_resultat[nom] = stripslashes($temp_resultat[nom]); $temp_resultat[sujet] = stripslashes($temp_resultat[sujet]); } # Fin du traitement pour la recherche if(!isset($lecture)){ # Formatte la date $temp_resultat[annee] = substr($res[tempo],0,4); $temp_resultat[mois] = substr($res[tempo],4,2); $temp_resultat[jour] = substr($res[tempo],6,2); $temp_resultat[heure] = substr($res[tempo],8,2); $temp_resultat[minute] = substr($res[tempo],10,2); } else{ $temp_resultat[annee] = substr($res[dat],0,4); $temp_resultat[mois] = substr($res[dat],5,2); $temp_resultat[jour] = substr($res[dat],8,2); $temp_resultat[heure] = substr($res[dat],11,2); $temp_resultat[minute] = substr($res[dat],14,2); } if($res[premier] == 0){} # si le message n'a pas de parent on prend l'heure dans le champ "dat" else{} # pour les message avec un parent, on utilise l'ancienne méthode, ça permet d'avoir un effet rétroactif sur les anciens messages return $temp_resultat; } # Fin de la fonction formatage_res() /*======================================================================================= * Affiche les messages d'un fil de discussion, * s'intègre dans une boucle ou non si il s'agit d'afficher uniquement le premier message. * @param string[table] $res Tableau, résultat du mysql_fetch_array * @param string $passforum Valeur du cookie d'administration * @param string $forumpassword Mot de passe d'administration * @param string $col1 Couleur du fond #1 * @param string $col2 Couleur du fond #2 * @return string Les deux cellules qui affichent un message dans un fil =======================================================================================*/ function affichage_fil($res, $passforum, $forumpassword, $col1, $col2, $env_php_ver, $table_bgcolor, $lecture, $filinfobgcolor, $titresbgcolor, $filtxtbgcolor){ # Les lignes qui suivent permette de formatter convenablement la sortie, en éliminant les slashes, # en convertissant les sauts de ligne \n en
(html) et en transformant les caractères spéciaux # en entités HTML $_resultat = $this->formatage_res($res, $recherche, $recherche_html, $lecture); $ip = $res[ip]; $id = $res[id]; echo " \n "; if(!empty($_resultat[email])){ # Si l'adresse email n'est pas vide, on l'entoure du lien adéquat echo "".$_resultat[nom].""; } else{ echo $_resultat[nom]; } echo "

".$_resultat[jour]."/".$_resultat[mois]."/".$_resultat[annee]."
".$_resultat[heure].":".$_resultat[minute]; echo $this->admin_checkbox($lecture, $passforum, $forumpassword, $id, $ip); echo "\n"; echo " ".$_resultat[sujet]."\n \n \n
".$_resultat[texte]."
 \n \n"; } # Fin de la fonction affichage_fil() /*======================================================================================= * Vérifie le mot de passe d'administration, envoie un cookie et recharge la page ou * renvoi un message d'erreur si celui-ci est incorrect. * @param string $passit Mot de passe envoyé par le formulaire * @param string $forumpassword Mot de passe défini pour l'administration * @param string $env_php_self Nom de la page * @return special Le cookie d'administration * @return string Un message d'erreur éventuel =======================================================================================*/ function pass_or_die($passit, $forumpassword, $env_php_self){ if(isset($passit)){ # Si le formulaire de saisie du mot de passe pour l'administration a renvoyé un mot de passe, on lance la vérification de celui-ci. if($passit == $forumpassword){ # Si le mot de passe est correct, on envoie le cookie avec le mot de passe crypté. $motdepasse = md5($passit); # crypte le mot de passe setcookie( "passforum", "$motdepasse",time()+7200); # Envoi le cookie header("location:$env_php_self?debut=0"); # Recharge la page } else{ # Si le mot de passe est incorrect, renvoi d'un message d'erreur. header("location:$env_php_self?message=4"); # Recharge la page avec le message d'erreur } } } # Fin de la fonction pass_or_die() /*======================================================================================= * Affiche une cellule qui contient le formulaire de recherche * @param string $env_php_self Le non de la page en cours * @param string $table_bgcolor La couleur du fond des cellules de navigation * @param string $colspan Paramètre d'étendue de la cellule * @return string La cellule et son formulaire =======================================================================================*/ function cellules_recherche($env_php_self, $table_bgcolor, $_cellules_recherche, $lecture, $colspan="0", $recherche, $col_head){ echo "
\n"; echo " \n"; echo " \n \n \n"; echo " \n \n \n"; echo " \n \n"; echo " \n \n"; if(isset($lecture)){ # Si l'on est dans un fil, on affiche le bouton qui permet de restreindre la recherche au fil en cours echo " \n \n \n"; } echo "
 ".$_cellules_recherche[1]."
 ".$_cellules_recherche[7]."
\n
"; } /*======================================================================================= * Affiche le formulaire d'envoi de message * @param string $fige Détermine l'affichage ou nom du formulaire * @param string $passforum Valeur du cookie d'aministration * @param string $forumpassword Mot de passe défini pour l'administration * @param string $env_php_self Nom de la page * @param string $premier Id du message en cours * @param string $tail_msg Largeur table "Envoyer un message" * @param string $align2 Al. hor. de la table "Envoyer un message" * @param string $col_head Couleur fond table en-tête (Sujet, exp., date, rép) * @param string $col_msg Couleur fond du formulaire Envoyer un message * @param string $lecture Id du message en cours * @param string $followsubject Reprend le titre du message en cours si l'on est dans un fil * @return string Le formulaire d'envoi de message =======================================================================================*/ function form_message($fige, $passforum, $forumpassword, $env_php_self, $tail_msg, $align2, $col_head, $col_msg, $lecture, $followsubject, $_form_message, $coo_nom, $coo_mail, $coo_sign){ if($fige == "non" || $passforum == md5($forumpassword)){ # Si le forum n'est pas en mode figé ou que l'on est en mode administration, on affiche le formulaire ?>



"; echo ""; } else{ ?>

".$_form_message[6]." "; } ?>
\n"; echo " ".$_header_table[1]."\n"; echo " ".$_header_table[2]."\n"; if(!isset($recherche) OR empty($recherche)){ echo " ".$_header_table[3]."\n"; } echo " ".$_header_table[4]."\n"; echo " \n"; } function affichage_liste($result, $table, $col1, $col2, $env_php_self, $af_heure, $debut, $recherche, $recherche_html, $lecture, $passforum, $forumpassword, $page){ while($res = mysql_fetch_array($result)){ $_resultat = $this->formatage_res($res, $recherche_html, $recherche, $lecture); // $_resultat = $this->format_resultats_recherche($recherche, $res, $recherche_html); if($fonds == 1){ $fonds = 0; $cfond = $col1; } else{ $fonds = 1; $cfond = $col2; } $ip = $res[ip]; $id = $res[id]; $req_nb_reps = mysql_query("SELECT premier FROM $table where premier='$res[id]'"); $nb_reps = mysql_num_rows($req_nb_reps); echo " \n "; echo $this->admin_checkbox($lecture, $passforum, $forumpassword, $id, $ip); echo "".$_resultat[sujet].""; if(isset($recherche)){ echo "
".$_resultat[texte]; if ($res[premier] == 0){ echo " | lire le fil |"; } else{ echo " | lire le fil |"; } //"; } echo "\n"; echo " "; if(!empty($_resultat[email])){ # Si l'adresse email n'est pas vide, on l'entoure du lien adéquat echo "".$_resultat[nom].""; } else{ echo $_resultat[nom]; } if(!isset($recherche)){ echo "\n $nb_reps\n"; } echo " ".$_resultat[jour]."/".$_resultat[mois]."/".$_resultat[annee]; if($af_heure == "oui" OR isset($recherche)){ echo " - ".$_resultat[heure].":".$_resultat[minute]; } echo "\n \n"; } } # Fin de la fonction affichage_liste() /*======================================================================================= * Crée la table SQL qui contient les messages ou met à jour celle existante =======================================================================================*/ function admin_table($table, $env_query_string, $env_php_self){ if(ereg("creation",$env_query_string)){ # Création de la table $requete="CREATE TABLE ".$table." (id int auto_increment primary key, nom varchar(20), email varchar(40), sujet varchar(60),texte text, dat VARCHAR (16), premier int,hits int, tempo timestamp,ip varchar(16), INDEX (`premier`, `tempo`) )"; $res_requete = mysql_query($requete); header("location:$env_php_self?message=6"); } if(ereg("maj",$env_query_string)){ # Mise à jour pour les anciennes versions $requete="CREATE INDEX indx1 ON ".$table." (premier, tempo)"; $res_requete = mysql_query($requete); header("location:$env_php_self?message=7"); } } # Fin de la fonction admin_table() /*======================================================================================= * Insert un nouveau message dans la table SQL ou retourne un message d'erreur =======================================================================================*/ function postage($table, $postage, $cdsujet, $cdmail, $cdtxt, $cdnom, $premier, $lecture, $refresh, $env_php_self, $ip, $decalage){ $req1 = mysql_query("SELECT texte from $table order by id desc LIMIT 0,1"); $resp1 = mysql_fetch_array($req1); $double = $resp1[texte]; if(isset($postage)){ # lance l'insertion et la vérification des nouveaux message if(empty($cdsujet) || empty($cdtxt) || $cdtxt == $double){ # Si il n'y a rien dans le sujet et/ou dans le texte, alors on affiche un msg d'erreur. if(empty($cdsujet)){$message = 1;} if(empty($cdtxt)){$message = 2;} if(empty($cdtxt) && empty($cdsujet)){$message = 3;} if($cdtxt == $double){$message = 9;} if(!empty($premier)){ # Si on est dans un fil, on retourne sur celui-ci header("location:$env_php_self?lecture=$premier&message=$message"); } else{ # Sinon on retourne sur la première page header("location:$env_php_self?message=$message"); } } else{ # On lance l'insertion dans la base de données $date = date("Y-m-d H:i", time()+($decalage*3600)); if(! $premier){ # Vérifie l'existence d'un parent éventuel $premier = 0; } else{ # Incrémente le compteur de réponse si le message fait partie d'un fil $query = "UPDATE $table set hits = hits + 1 where id = $premier"; $result = mysql_query($query); } $cdsujet = addslashes($cdsujet); $cdsujet = htmlentities($cdsujet); $cdsujet = strip_tags($cdsujet); $ch_texte = addslashes($cdtxt); $ch_nom = addslashes($cdnom); $ch_nom = htmlentities($ch_nom); $ch_nom = strip_tags($ch_nom); $query = "INSERT INTO $table (id,nom,email,sujet,texte,dat,premier,hits,ip) VALUES (0,'$ch_nom','$cdmail','$cdsujet','$ch_texte','$date','$premier',0,'$ip')"; $result = mysql_query($query); header("location:$env_php_self?debut=0"); // empêche l'envoi en double avec netscape3 ?? if($envoimail == "oui" && !empty($sendmailto)){ # Si envoimail est égal à "oui", alors on envoie un e-mail pour chaque message posté. $sendsubj = "[".substr($nomforum,0,10)."] ".$ch_sujet; $corpsmail = "Message posté sur le forum ".$nom_forum.".\nDe: ".$ch_nom." (".$cdmail.")\nIP de l'auteur: ".$ip."\nLe: ".$date."\nSujet: ".$ch_sujet."\n\n-----\n".stripslashes($ch_texte)."\n-----"; $headers = "From: Forum <".$sendmailto.">"; mail($sendmailto,$sendsubj,$corps_mail,$headers); } if($refresh == "yes" && !empty($premier)){ # On retourne sur le fil de reférence si la case idoine est cochée header("location:$env_php_self?lecture=$premier"); } else{ header("location:$env_php_self?debut=0"); // redirige vers le forum, ça évite le "bug" d'Opera } } } } # Fin de la fonction postage() /*======================================================================================= * Compte les résultats de la recherche et affiche une cellule =======================================================================================*/ function comptage_nb_reps($nb, $_comptage_nb_reps, $total_resultats, $table_bgcolor){ echo " \n "; if($nb == 1){echo $_comptage_nb_reps[1];} elseif($nb > 1){echo $total_resultats." ".$_comptage_nb_reps[2];} elseif($nb == 0){echo $_comptage_nb_reps[3];} echo "\n \n"; } #
>


fin_html(); exit; } } # Fin de la fonction form_admin() /*======================================================================================= * Affiche le bouton pour détruire les messages =======================================================================================*/ function cellule_admin($passforum, $forumpassword, $colspan, $col_head, $env_php_self, $_cellule_admin){ if($passforum == md5($forumpassword)){ echo " \n \n
\n"; echo " \n \n"; } } # Fin de la fonction cellule_admin() /*======================================================================================= * Affiche les checkboxes pour sélectionner les messages à détruire =======================================================================================*/ function admin_checkbox($lecture, $passforum, $forumpassword, $id, $ip){ if ($passforum == md5($forumpassword)){ # Si le mode d'administration est activé, on affiche le bouton qui permet de sélectionner # les messages à effacer. On affiche également l'id du message et l'adresse ip de son auteur if(isset($lecture)){ $sortie = "
IP : ".$ip."
ID : $id "; } $sortie .= ""; return $sortie; } } # Fin de la fonction admin_checkbox() /*======================================================================================= * Cette fonction efface un ou plusieurs messages =======================================================================================*/ function efface_msg($effacer, $passforum, $forumpassword, $env_php_self, $delete, $table){ if(isset($effacer) AND $passforum == md5($forumpassword)){ # Vérifie le mot de passe for($i=0; $i\n
\n\n"; } } # Fin de la classe Pretextes ?>