Shoutbox parametrable sans mysql

Description

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.'">&nbsp;</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 '&nbsp;<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

Codes Sources

A voir également