Ben voila, c'est une shoutbox. Elle n'utilise pas Mysql, et est relativement bien modifiable.
Pour le moment :
- modification du design grace au fichier CSS externe (tout est la).
- possibilite de l'appeler avec ou sans gestion des smileys (on clique sur le smiley voulu, il apparait)
- possibilite de definir une taille maximale pour le fichier contenant les messages
- possibilite de definir le nom du fichier contenant les messages
- possibilite de modifier les styles de texte avec menu cliquable
teste sur IE6 et Firefox
Ces choix se font lors de l'instantiation de l'objet. Si des parametres ne sont pas fournis, ce sont ceux par defaut qui prevalent.
Je joins quand meme le code, meme si il faut le zip.
Demo ici :
http://membres.lycos.fr/pat665/index.php
(Merci Darkdje :-)
Source / Exemple :
FICHIER shoutbox.cls.php
<?php
require_once ("smallform.cls.php");
class shoutBox {
var $fichier; // nom du fichier
var $smiley; // gestion des smileys
var $taille; // taille du fichier
var $style; // gestion du style des textes
var $arrSmiley;
var $arrSmileyTrans;
var $arrStyle;
var $arrStyleTrans;
//constructeur, je changerai plus tard le _construct. Les parametres optionnels sont fixes par defaut.
function shoutBox($smiley=true, $style=true, $taille=10, $fichier="shoutbox.txt") {
$this -> smiley = $smiley;
$this -> style = $style;
$this -> fichier = $fichier;
$this -> taille = $taille*1024;
// tableau des smileys, avec le chemin.
$this -> arrSmiley = array ('<img src="smileys/rire.gif" />', '<img src="smileys/sourire.gif" />', '<img src="smileys/triste.gif" />', '<img src="smileys/clin.gif" />');
// tableau des codes correspondants. Ajoutez ce que vous voulez, mais les 2 tableaux DOIVENT comporter le meme nombre d'entrees, evidemment!
$this -> arrSmileyTrans = array (':-o', ':-)', ':-(', ';-)');
// tableau des styles de texte. Memes remarques que pour les smileys.
$this -> arrStyle = array ('<span style="font-weight:bold">','<span style="font-style:italic">', '<span style="text-decoration:underline">', '<span style="text-decoration:overline">', '<span style="text-decoration:underline overline">', '<span style="color:aqua">', '<span style="color:black">', '<span style="color:blue">', '<span style="color:fuchsia">', '<span style="color:gray">', '<span style="color:green">', '<span style="color:lime">', '<span style="color:maroon">', '<span style="color:navy">', '<span style="color:olive">', '<span style="color:purple">', '<span style="color:red">', '<span style="color:silver">', '<span style="color:teal">', '<span style="color:white">', '<span style="color:yellow">', '<span style="border:1pt solid aqua">','<span style="border:1pt solid black">', '<span style="border:1pt solid blue">', '<span style="border:1pt solid fuchsia">','<span style="border:1pt solid gray">', '<span style="border:1pt solid green">', '<span style="border:1pt solid lime">', '<span style="border:1pt solid maroon">', '<span style="border:1pt solid mavy">', '<span style="border:1pt solid olive">', '<span style="border:1pt solid purple">', '<span style="border:1pt solid red">', '<span style="border:1pt solid silver">', '<span style="border:1pt solid teal">', '<span style="border:1pt solid white">', '<span style="border:1pt solid yellow">', '</span>');
$this -> arrStyleTrans = array ('[b]', '[i]','[u]', '[o]', '[a]', '[aqua]', '[black]', '[blue]', '[fuchsia]', '[gray]', '[green]', '[lime]', '[maroon]', '[navy]', '[olive]', '[purple]', '[red]', '[silver]', '[teal]', '[white]', '[yellow]', '[aqua_b]', '[black_b]', '[blue_b]', '[fuchsia_b]', '[gray_b]', '[green_b]', '[lime_b]', '[maroon_b]', '[navy_b]', '[olive_b]', '[purple_b]', '[red_b]', '[silver_b]', '[teal_b]', '[white_b]', '[yellow_b]', '/end');
// validation du formulaire
if (isset($_POST['submit']) && $_POST['submit']=="Shout")
$this -> valider(!empty($_POST['texte'])?$_POST['texte']:"Oouups, oubli texte", !empty($_POST['pseudo'])?$_POST['pseudo']:"Anonyme");
echo '<div class="shoutbox">';
// instantiation d'un objet formulaire
$form = new smallForm($this -> smiley, $this -> style);
// appel de la methode affichant les messages
$this -> affiche();
echo '</div>';
}
// methode enregistrant le message poste dans le fichier
function valider($texte, $pseudo) {
$texte = $this -> valideCode($texte);
if(get_magic_quotes_gpc()===0)
$entree = addslashes($pseudo.'||'.$texte.'||');
$entree=htmlentities($pseudo.'||'.$texte.'||').date("dmy").'||';
// different systeme d'ouverture selon si le fichier existe ou doit etre efface, ou n'existe pas encore
if (file_exists($this -> fichier) && filesize($this -> fichier) >= $this -> taille)
$fp = fopen($this -> fichier, 'w') or die("Echec d'ouverture du fichier");
else
$fp = fopen($this -> fichier, 'a') or die("Echec d'ouverture du fichier");
$ecriture=fwrite($fp, $entree) or die ("Echec d'ecriture dans le fichier");
fclose ($fp);
}
// fonction recuperant les valeurs du tableau en fonction d'un calcul modulo (cree pour recuperer chaque pseudo, message et date dans un tavbleau specifique
function getValeursTab($tab, $div, $reste) {
while ($dmp=current($tab)) {
if (key($tab)%$div==$reste)
$tabT[] = $tab[key($tab)];
next($tab);
}
return $tabT;
}
// methode pour afficher les messages.
function affiche () {
if(file_exists($this -> fichier)) {
fopen($this -> fichier, 'r') or die ("Echec d'ouverture du fichier");
// on parse une 1ere fois pour recuperer dans un tableau chaque pseudo suivi de chaque message
if(get_magic_quotes_runtime()===1)
$tabtmp = explode('||', stripslashes(file_get_contents($this -> fichier)));
else
$tabtmp = explode('||', file_get_contents($this -> fichier));
// si smiley, on va chercher la methode les gerant
if ($this -> smiley)
$tabtmp = $this -> parseCode($tabtmp, $this -> arrSmiley, $this -> arrSmileyTrans);
// si style, on va chercher la methode les gerant...
if ($this -> style)
$tabtmp = $this -> parseCode($tabtmp, $this -> arrStyle, $this -> arrStyleTrans);
// recuperation dans un tableau associatif de chaque pseudo, message, date
$tabshout = array ('pseudo' => $this -> getValeursTab($tabtmp, 3, 0), 'texte' => $this -> getValeursTab($tabtmp, 3, 1), 'date' => $this -> getValeursTab($tabtmp, 3, 2));
// affichage proprement dit
$i=count($tabshout['pseudo'])-1;
for ($i; $i>=0; $i--)
echo '<span class="pseudo">',$tabshout['pseudo'][$i],'</span>','<span class="date"> ','[',$tabshout['date'][$i],']','</span>',' :: ','<span class="texte">',$tabshout['texte'][$i],'</span><br />';
}
}
// On parse les codes speciaux
function parseCode ($tab, $output, $input) {
return $tab = str_replace($input, $output, $tab);
}
// methode pour equilibrer le nombre de tags fermants, afin d'avoir un html correct en sortie
function valideCode($texte) {
$ouvertures = 0;
$tab = $this -> arrStyleTrans;
array_pop($tab);
foreach ($tab as $txt)
$ouvertures += substr_count($texte, $txt);
$fermetures = substr_count($texte, '/end');
if ($fermetures < $ouvertures)
$texte .= str_repeat('/end', $ouvertures - $fermetures);
if ($ouvertures < $fermetures) {
$oter = $fermetures - $ouvertures;
$tab = explode(' ', $texte);
$i = 0;
foreach ($tab as $k => $v) {
if ($i == $oter)
break;
if ($v == '/end') {
$tab[$k] ='';
$i++;
}
}
$texte = implode(' ', $tab);
}
return $texte;
}
}
?>
FICHIER smallform.cls.php
<?php
class smallForm {
// constructeur (oui oui, je sais...), avec les parametres optionnels
function smallForm($smiley=true, $style=true) {
echo '<div class="divform"><form method="POST" action="',$_SERVER['PHP_SELF'],'">';
echo '<input type="text" class="smallformField" name="pseudo" value="',isset($_POST['pseudo'])?$_POST['pseudo']:"Pseudo",'" size="8" maxlength="20"/>';
echo '<input type="text" id="t" class="smallformField" name="texte" value="',isset($_POST['texte'])?$_POST['texte']:"Message",'" size="18" maxlength="200"/>';
echo '<input type="submit" title="Poster le message" class="smallformSubmit" name="submit" value="Shout" /><br /><br />';
if ($smiley || $style)
$this -> affBoiteEdition($smiley, $style);
echo '<hr class="separateur" />';
echo'</form></div>';
}
// simple remarque : je ne fais qu'ajouter le code du smiley a la valeur de l'input, sur un onclick. Je n'y suis pas encore arrive sur un submit...ca ne l'affichait pas, meme si ca le rajoutait effectivement.
function smileys() {
echo '<input type ="image" src="smileys/rire.gif" onclick="document.getElementById(\'t\').value+=\' :-o \'"/>';
echo '<input type ="image" src="smileys/sourire.gif" onclick="document.getElementById(\'t\').value+=\' :-) \'"/>';
echo '<input type ="image" src="smileys/triste.gif" onclick="document.getElementById(\'t\').value+=\' :-( \'"/>';
echo '<input type ="image" src="smileys/clin.gif" onclick="document.getElementById(\'t\').value+=\' ;-) \'"/>';
}
// comme pour les smileys
function style() {
echo '<select title="couleur du texte" class="smallformSelect" name ="couleur" onchange="document.getElementById(\'t\').value+=this.value">';
$couleurs = array ('aqua', 'black', 'blue', 'fuchsia', 'gray', 'green', 'lime', 'maroon', 'navy', 'olive', 'purple', 'red', 'silver', 'teal', 'white', 'yellow');
foreach ($couleurs as $v)
echo '<option value="['.$v.']" style="background-color:'.$v.'"> </option>';
echo '</select>';
echo '<select title="couleur de la bordure" class="smallformSelect" name ="couleurbordure" onchange="document.getElementById(\'t\').value+=this.value">';
foreach ($couleurs as $v)
echo '<option value="['.$v.'_b]" style="color:'.$v.'">[]</option>';
echo '</select>';
echo '<input type="submit" title="gras start tag" class="bold" value="b" onclick="document.getElementById(\'t\').value+=\' [b] \'" />';
echo '<input type="submit" title="italique start tag" class="italic" value="i" onclick="document.getElementById(\'t\').value+=\' [i] \'" />';
echo '<input type="submit" title="souligne start tag" class="underline" value="u" onclick="document.getElementById(\'t\').value+=\' [u] \'" />';
echo '<input type="submit" title="surligne start tag" class="overline" value="o" onclick="document.getElementById(\'t\').value+=\' [o] \'" />';
echo '<input type="submit" title="souligne et surligne start tag" class="underlineoverline" value="a" onclick="document.getElementById(\'t\').value+=\' [a] \'" />';
echo ' <input type="submit" title="end tag pensez a le mettre pour fermer chaque style" class="endtag" value="end" onclick="document.getElementById(\'t\').value+=\' /end \'" />';
}
// permet de controler l'affichage/masquage de la boite d'edition
function affBoiteEdition ($smiley, $style) {
echo '<input class ="controle" title ="Afficher ou masquer le champ edition" type="button" name="controle" value="-" onclick="this.value=(this.value==\'-\')?\'+\':\'-\'; document.getElementById(\'boite\').style.visibility=(document.getElementById(\'boite\').style.visibility==\'hidden\')?\'visible\':\'hidden\';document.getElementById(\'boite\').style.display=(document.getElementById(\'boite\').style.display==\'none\')?\'block\':\'none\' " />';
echo '<div id="boite" class="edit">';
if ($smiley) {
$this -> smileys();
if ($style)
echo '<br /><br />';
}
if ($style)
$this -> style();
echo '</div>';
}
}
?>
FICHIER index.php exemple
<html>
<head>
<title>
</title>
<link rel=stylesheet type="text/css" href="shoutbox.css">
</head>
<body style="background-color : #cccccc">
<?php
// Include de la classe
require_once ("shoutbox.cls.php");
// appel par defaut
// $shout (false, false, 20, "monfichier.txt"); est un autre exemple d'appel : pas de smiley, pas de style, 20ko pour la taille max du fichier, et le fichier s'appelle monfichier.txt
$shout = new shoutBox ();
?>
</body></html>
Conclusion :
Je travaille encore dessus...notamment, j'essaye d'ajouter facilement des styles de texte (comme pour les smileys, par clic sur un bouton, et pas seulement en ajoutant du bbcode (par exemple) a la main.
Tout commentaire est le bienvenue!
--------------------------------------------------------------------------------
UPDATE 26-01-05: Je viens d'ajouter la possibilite de jouer sur le style des textes, tout est cliquable.
UPDATE 28-01-05 : Ajout de la date, et modifications du code (optimisation de certaines fonctions).
UPDATE 28 01 05 : oui encore un...j'ai ajoute la possibilite d'afficher / masquer la boite d'edition (avec les smileys, ou le style de texte), car je compte encore ajouter des controles sur le texte, et ca commence a prendre de la place ;-)
UPDATE 04 01 05 : ajout de couleurs pour le texte. Quelques changement au niveau du code.
UPDATE 04 01 05 : ajout de bordures colorees au texte