PHP & MySQL

Réaliser un nuage de tags en Php MySql

Le 19 octobre 2007 à 9:58 par spylberg

J’ai dû réaliser récemment un module de recherche avancée pour ma boite, et j’ai voulu intégrer une recherche par tag.

Avant de me lancer je recherche souvent sur le web la meilleur manière de faire (souvent en dev, rien ne sert de réinventer ce qui a été maintes fois fait !), mais j’avoue que ce que je trouvais ne me satisfaisait pas.

Donc, en glanant et en regroupant toutes les infos récoltées, j’ai réaliser mon script. Alors voici pour vous un tutoriel pour réaliser votre propre nuage de tags…

tagcloudPour réaliser mon nuage, je me base donc sur un script php et une base de données MySql.

Je passerais sur l’enregistrement préalable des données dans la table, vous trouverez suffisamment de tutoriels bien fait à ce sujet.

La seule chose importante à retenir étant le format dans lequel vous allez demander à l’utilisateur d’indiquer ces différents tags dans le champ adéquat : En les séparant tout simplement par une virgule (les tags peuvent être des mots seuls ou bien une expression complète).

Exemple : “nuage,tags,comment faire,tutoriel,php” …etc…

On va ensuite traiter la chaine renvoyer pour :

Supprimer tous les accents

Supprimer certains mots inutiles (de, le , la, avec, pour…)

Supprimer les espaces en début et fin de chaine.

Donc considérons notre chaine de tags récupérer dans le champ de formulaire, $chaine_tags :

<?php// Fonct° Retire les accents dans une chaine
function NoAccent ( $chaine ) {
$accents = "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ";
$noaccents = "AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn";
$chaine = strtr($chaine, $accents, $noaccents);
return $chaine;
}
$chaine_tags = NoAccent($chaine_tags);
// Dans la chaine, on va retirer certains mots inutiles (de, pour, le, la...etc)
$remplace = array(' de ', ' le ', ' la ', ' pour ', ' un ', ' une ', 'd'', 'l'', 'avec');
$par = ' '; // Par un simple espace
$chaine_tags = str_replace($remplace, $par, $chaine_tags);
// Supprime les espace en debut et fin de chaine
$chaine_tags = trim($chaine_tags, ' ');
?>

Puis on enregistre cette chaine dans la BDD…

Maintenant passons au traitement de la chaine avant affichage

Nous avons donc dans la base pour chaque enregistrements, une chaine de tags propre.

On va chercher avec un SELECT en SQL toutes ces chaines.

$chaine_tags doit ensuite ressembler à ça : ” tags,affiche,mots-cles,donnees,expressions ” …

Ce que nous devons faire maintenant c’est tout simplement séparer chaque chaine de caractères séparés par des virgules.

<?php
// On decoupe la chaine avec explode, grace au pipe |
$mots = explode('|', $chaine_tags);
// On traite la chaine pr supprimer les doublons
$mots = array_unique($mots);
// On mélange le tableau avec shuffle
shuffle($mots);
?>

Explication du code ci-dessus :

explode va servir à obtenir un tableau associatif en concaténant la chaine $chaine_tags avec un pipe |.

array_unique va servir à supprimer les doublons de la chaine, c’est-à-dire à ne pas afficher deux fois le même mots ou la même expression.

shuffle est optionnel mais vous permet d’obtenir un nuage de tags aléatoires à chaque chargement de la page.

A partir de là, on obtient donc un tableau associatif ($mots), contenant nos tags, sans doublons et au hasard.

Affichage du nuage de tags

Pour cela on va utiliser un boucle For, qui va afficher :

Soit l’ensemble du contenu du tableau.

Soit un nombre limité de tags en spécifiant une variable $max qui sera le nombre max de tags à afficher.

Nous allons également spécifier une taile de police mini et maxi, $font_mini et $font_maxi

<?php
// Soit $max est = à l'ensemble du contenu du tableau
$max = count($mots); // count renvoi le nombre total d'éléments
// Soit on spécifie un nombre max d'éléments à afficher
$max = 25; // par exemple
// pensez bien à choisir l'une ou l'autre variable ci-dessus
// Taille de police en pixel
$font_mini = 10;
$font_maxi = 22;
// Puis on affiche le nuage avec la boucle for
for ( $i=0; $i< $max ; $i++ ) : // Début de boucle
// Avec rand, à chaque tour de boucle on choisi
// une taille de police comprise entre $font_mini et $font_maxi
$fontsize = rand($font_mini,$font_maxi).'px';
// plutôt qu'un echo, je préfere créé une variable $nuage_tags, que j'affiche par la suite
// A chaque tour, la variable est complétée avec le .=
$nuage_tags .='<a style="font-size:'.$fontsize.';" href="?tag='.urlencode($mots[$i]).'" title="Rechercher le tag '.$mots[$i].'">'.$mots[$i].'</a> ';;
endfor; // Fin de boucle
// Affichage final
echo $nuage_tags;
?>

Voilà, c’est fini !

Biensûr vous pouvez allez plus loin en insérant des classes CSS afin de donner un style au tag lui-même et à son div le contenant.

Merci de m’avoir lu. N’hésitez pas à laisser vos commentaires et suggestions (ou éventuelles erreurs commises!)

Ce tutoriel avait déjà été publié sur mon blog. @ bientôt !

7 commentaires »

Gravatar

Commentaire de DONT CLICK HERE

le 19 octobre 2007 à 18:19

ouai mais la tu nos montre un nuage de tag aléatoire il aurait etait interressant de voir comment faire differente taille en fonction du nombre de fois que le mot aparait !

Gravatar

Commentaire de Tiagut

le 19 octobre 2007 à 23:05

Belle explication qui décrit très bien la démarche à suivre.

Cependant, Dans ton exemple la taille des tags est défini aléatoirement et non en fonction du nombre d’occurrences du tag. Un peu dommage!

A part ce détail, j’étais arrivé à la même solution que toi qui, je pense, est la plus simple.

Gravatar

Commentaire de chris

le 20 octobre 2007 à 14:48

@DONT CLICK HERE:

En effet, j’avais pas remarqué. Moi pour réaliser un nuage je fait une requête mysql “select key …” et j’utilise un tableau où j’ajoute 1 à chaque fois que le mot apparais genre:
$numkey[$data[’cle’]]++;

ainsi je peux adapter la taille du mot clé de cette fàçon.

font-size:’.(8+$numkey[$key]/2).’;”

J’essayerai de publier un tuto

Gravatar

Commentaire de spylberg

le 21 octobre 2007 à 10:11

@ Tiagut : En effet nul tutoriel n’est exhaustif, et ici je laisse une chance à chaque tags d’apparaître au moins une fois en + gros.
Je ne suis pas un grand expert en SQL et la solution de Chris peut être intéressante. @+

Gravatar

Trackback de pligg.com

le 31 octobre 2007 à 1:19

Raliser un nuage de tags en Php MySql…

Tutoriel rcupr sur SmashingCoding pour crer son propre nuage de mot cls et l’afficher sur son site….

Gravatar

Commentaire de Pti-seb

le 2 décembre 2007 à 20:40

Quelque remarque importante, il vaut mieux mettre les mot en minuscule avec strlower avant le traitement.

Sinon, il y a un soucis avec le retrait des mot de liaisons :
$remplace = array(’ de ‘, ‘ le ‘, ‘ la ‘, ‘ pour ‘, ‘ un ‘, ‘ une ‘, ‘d”, ‘l”, ‘avec’);

Vaut mieux utiliser ceci (double quote pour le liaison avec simple quote) :
$remplace = array(’ de ‘, ‘ le ‘, ‘ la ‘, ‘ pour ‘, ‘ un ‘, ‘ une ‘, “d’”, “l’”, ‘avec’);

Gravatar

Pingback de On the Web again » Blog Archive » Taggle.org, digg-like pour Webmaster

le 3 décembre 2007 à 15:56

[…] qui vont probablement vous aider dans votre quotidien professionnel.( Et je dis pas ça parce que mon tutoriel sur comment faire un nuage de tags en php mysql apparaît en 1ère page :P […]

Laisser un commentaire

Votre Nom

Votre E-mail (obligatoire mais ne sera pas publié)

Votre Site ou blog

Votre commentaire

Valid XHTML 1.0 Transitional