Page 1 sur 1

Nuage de tag

Posté : 27 janv. 2009, 19:13
par Stef
Hi there,

je cherche à créer un nuage de tags mais je ne sais pas trop par quel bout prendre ça...

mon idée de départ c'est de créer un champ "tags" dans le formulaire par lequel les utilisateurs soumettent des données qui sont enregistrées dans un table:

donc imaginons qu'un utilisateur tape plusieurs mots séparés par une virgule, comment ensuite je traite le contenu de ce champ?

il faudrait ensuite je pense pouvoir enregistrer chacun des mots dans une table (une ligne par mot) tags qui contiendrait essentiellement un champ tag, et un champ id_poster (pour savoir à qui se réfère le tag)...

Posté : 27 janv. 2009, 19:28
par thehawk
Bonjour,

voici un élément de réponse : http://www.links-design.net/wp/06/08/20 ... php-mysql/

Cordialement Hawk

Posté : 27 janv. 2009, 19:50
par Stef
yeehouuuu, c'est bien ça que je cherchais à faire... bonne piste thehawk, thaaanks! :wink:

Posté : 27 janv. 2009, 20:18
par albat
Modération :
Stef, si ta question est résolue, pense à ajouter le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.
Tu peux réaliser cette opération en cliquant sur le bouton Image en haut à gauche de ce sujet.

Posté : 29 janv. 2009, 16:22
par Stef
Oui oui Albat, je vais pas tarder à mettre résolu, je touche presque au but... ;)

Donc en suivant le lien proposé par thehawk, j'ai pu coder la fonction que je voulais, à un détail près... c'est que dans l'article sur le site en question, l'auteur fais ceci pour l'affichage des tags:
// 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';
Mais ça me plait pas trop, je vois pas vraiment l'intérêt d'avoir aléatoirement une taille de police différente sur un tag quelconque... du point de vue de la recherche par le visiteur ça n'apporte rien à mon avis!
Je souhaiterais plutôt modifier l'affichage des tags en fonctions de leur fréquence d'apparition dans la table où ils sont enregistrés; je ne sais pas très bien comment m'y prendre, donc si vous avez une suggestions à me faire je suis preneur! Merci beaucoup!!


Et voici le code complet de ma fonction tag:
<?php
				   function tags() {
				   function NoAccent ( $chaine ) {

$accents = "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ";
$noaccents = "AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn";
$chaine = strtr($chaine, $accents, $noaccents);

return $chaine;

}
				   $gt = mysql_query('SELECT tag FROM tags');

while ($arr = mysql_fetch_array($gt)) {
$chaine_tags = $arr['tag'];
				   

$chaine_tags = NoAccent($chaine_tags);

$remplace = array(' de ', ' le ', ' la ', ' pour ', ' un ', ' une ', ' avec ', ' à ', ' et ', ' ou ', ' où ', ' pour ',
 ' mais ', ' donc ', ' or ', ' ni ', 'ne', ' car ', ' les ', ' quand ', ' qui ', ' quoi ', ' en ', ' on ', ' dans ', 
' du ', ' des ');
$par = ' '; 
$chaine_tags = str_replace($remplace, $par, $chaine_tags);

// Supprime les espace en debut et fin de chaine
$chaine_tags = trim($chaine_tags, ' ');

// 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);

// 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 = 18;

// Puis on affiche le nuage avec la boucle for
$nuage_tags = '';
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 .=
$ftag = $mots[$i];
$nuage_tags .='<a style="font-size:'.$fontsize.';" href="tags.php?ltag='.$ftag.'" title="">'.$mots[$i].'</a> ';;

endfor; // Fin de boucle

// Affichage final

echo $nuage_tags; }} 
?>

Posté : 29 janv. 2009, 16:56
par jojolapine
Il faut changer ta requête de slection en rajoutant un count, genre:

Code : Tout sélectionner

SELECT count(tag), tag FROM tags
(faut peut-être rajotuer un group by, j'ai pas testé...)
Puis après tu choisis ta taille de police en fonction nu count (genre un pourcentage?)

Posté : 29 janv. 2009, 17:00
par Stef
hum voui, effectivement je me suis dit que je devais passer par count... merci jojo!

Albat, désolé c'est pas encore résolu tout à fait, j'attends d'éventuels autres conseils, merci pour ta compréhension.

Posté : 29 janv. 2009, 17:03
par albat
Albat, désolé c'est pas encore résolu tout à fait, j'attends d'éventuels autres conseils, merci pour ta compréhension.
Y a pas de mal. ;)
C'est moi qui ai été un peu rapide, pensant que ton problème était résolu. :oops:

Posté : 30 janv. 2009, 00:46
par Stef
hihi, f'est pas grave! j'me suis juste senti incompris sur l'coup... |(X
Ceci dit je comprends tout à fait les raisons pour lesquelles tu post ce genre de réponses! :)

Sinon j'ai un blem avec mon code, si plusieurs utilisateurs entrent des tags identiques j'ai des doublons à l'affichage...
Pourtant j'ai spécifié:
// On traite la chaine pr supprimer les doublons
$mots = array_unique($mots);
Quelqu'un à une idée comment corriger ça? siouplait!


Edit

On m'a donné cette correction de code, et l'astuce est toute simple, elle consiste bien évidement à sortir le array_unique de la boucle afin de l'appliquer à tout le tableau et non uniquement à la ligne en cours dans la boucle...
Le voici si ça peut servir à quelqu'un:
<?php
                   function tags() {
                   function NoAccent ( $chaine ) {

$accents = "ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ";
$noaccents = "AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn";
$chaine = strtr($chaine, $accents, $noaccents);

return $chaine;

}

$mots = array();

$gt = mysql_query('SELECT tag FROM tags');

while ($arr = mysql_fetch_array($gt)) {
    $chaine_tags = $arr['tag'];


    $chaine_tags = NoAccent($chaine_tags);

    $remplace = array(' de ', ' le ', ' la ', ' pour ', ' un ', ' une ', ' avec ', ' à ', ' et ', ' ou ', ' où ', ' pour ',
 ' mais ', ' donc ', ' or ', ' ni ', 'ne', ' car ', ' les ', ' quand ', ' qui ', ' quoi ', ' en ', ' on ', ' dans ', 
' du ', ' des ');
$par = ' '; 
$chaine_tags = str_replace($remplace, $par, $chaine_tags);

// Supprime les espace en debut et fin de chaine
$chaine_tags = trim($chaine_tags, ' ');

// On decoupe la chaine avec explode, grace au pipe  et on rajoute les données dans le tableau global
$mots = array_merge($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);

// 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 = 18;

// Puis on affiche le nuage avec la boucle for
$nuage_tags = '';
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 .=
$ftag = $mots[$i];
$nuage_tags .='<a style="font-size:'.$fontsize.';" href="tags.php?ltag='.$ftag.'" title="">'.$mots[$i].'</a> ';;

endfor; // Fin de boucle

// Affichage final

echo $nuage_tags; }
?>