Comment créer un nuage de tags php/mysql

123 posts in this topic

Posted · Report post

je le poste demain, et comme ça on pourras sans doute amélioré la chose.

A+

Share this post


: post
Share on other sites

Posted · Report post

Bravo, ca rend super bien comme ca !

Vous avez fait avec le count ou en enregistrant directement le nombre de demande dans la base ?

Perso, je pense qu'il faut aussi compter les affichages produits, si on affiche le produit on incrémente aussi le compteur de 1, non ?

Ou alors ca ferait un autre nuage ? :)

Willy

Share this post


: post
Share on other sites

Posted · Report post

Je suis passé sur ton site et les accents ne passent pas - voir tag

il faut changer l'encodage.

Share this post


: post
Share on other sites

Posted · Report post

Oui apres une nuit de fonctionnement c'est un peu tous est n'importe quoi, tout le site ce vois décallé a cause de mot trop long etc.

il vas me falloir encore améliorer la chose, et trouvé un moyen de gerer correctement les accent.

Share this post


: post
Share on other sites

Posted · Report post

Eventuellement si tu pouvais mettre le code, on pourrait l'ameliorer ensemble

merci

Share this post


: post
Share on other sites

Posted · Report post

http://www.3dvf.fr/tag.php voila mon test, normalement le tableau est limité a 180 pixel de large, mais si des mots trop long apparaissent, le tableau s'éllargi!!! Comment faire?

Merci

Le code :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Document sans titre</title>
<style> .nuage {line-height:25px;font: normal small verdana, arial, helvetica, sans-serif; text-align: justify; border:1px solid #B6CDE1; padding:10px; position:relative} .nuage a {text-decoration:none} .nuage a:hover {color: white; background-color: #668AA8;} .nuage a.level0 {font-size:6px;color:#DFDFDF;} .nuage a.level1 {font-size:8px;color:#B8C9D6;} .nuage a.level2 {font-size:10px;color:#668AA8;} .nuage a.level3 {font-size:12px;color:#47657B;} .nuage a.level4 {font-size:14px;color:#E76300;} .nuage a.level5 {font-size:16px;color:#E76300;} .nuage a.level6 {font-size:18px;color:#E76300;} .nuage a.level7 {font-size:20px;color:#E76300;} .nuage a.level8 {font-size:22px;color:#E76300;} .nuage a.level9 {font-size:24px;color:#E76300;font-weight: bold} .nuage a.level10 {font-size:26px;color:#FF3300;font-weight: bold} </style></head><body topmargin="0" leftmargin="0" alink="#ff9900" bgcolor="#ffffff" link="#e86519" marginheight="0" marginwidth="0" text="#000000" vlink="#6e003a">
<?php
include("configuration.inc.php");
// N'oubliez pas de vous connectez à votre base de données
// Afin d'adapter le code à votre site internet, il vous suffit de modifier 3 choses :
// col est le nom du champs représentant le Tag Cloud
// ID est la clé primaire
// MA_TABLE est le nom de ma base de données
$query = "SELECT tag_name AS tag, nbsearch AS quantity FROM tag_cloud GROUP BY tag_name ORDER BY tag_name ASC";
$result = mysql_query($query);

// Boucle à travers les résultats afin de les mettres dans un simple tableau:
// $tag['col1'] = 12;
// $tag['col2'] = 25;
// etc. Ceci nous permetteras de calculer la taille de chacun d'entre eux.
while ($row = mysql_fetch_array($result)) {
$tags[$row['tag']] = $row['quantity'];
}

// Taille maximal - Taille minimal
$max_size = 250; // max font size en %
$min_size = 100; // min font size en %


// Obtenir la plus petit valeur et la plus grande du tableau
$max_qty = max(array_values($tags));
$min_qty = min(array_values($tags));


// Déterminer l'étendu des valeurs
$spread = $max_qty - $min_qty;
if (0 == $spread) { // we don't want to divide by zero
$spread = 1;
}


// Détermine l'incrémentation du font-size
$step = ($max_size - $min_size)/($spread);

?>
<table width="180" border="0" cellspacing="0" cellpadding="0">
<tr>
<td>
<div class="nuage" style="margin: 0pt auto; line-height: 25px;"><font face="arial,helvetica,sans-serif" size="3">
<?
// Boucle à travers le tableau
foreach ($tags as $key => $value) {

// Calcul du font-size CSS
// trouvez les valeur supérieurs au $min_qty
// multiplier par la valeur de l'incrémentatiion ($size)
// et ajouter la valeur du minimum ($min_size)
$size = $min_size + (($value - $min_qty) * $step);

// Afin de terminer le script, il vous suffit de modifier les caractères
// '####' par le lien de destination voulu.

echo '<a href="http://www.3dvf.fr/achat/recherche.php?motclef='.$key.'" style="font-size: '.$size.'%"';
echo ' title="'.$value.' recherche(s) sur le mot '.$key.'"';
echo '>'.$key.'</a> ';
}


?>
</font></div>
</td>
</tr>
</table>
</body>
</html>[/codebox]

La table SQL :

[codebox]CREATE TABLE `tag_cloud` (
`id` int(11) NOT NULL auto_increment,
`tag_name` varchar(100) NOT NULL default '',
`nbsearch` int(11) NOT NULL default '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=55 ;

Share this post


: post
Share on other sites

Posted · Report post

En recopiant ton code j'ai cela

Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at c:\program files\easyphp1-8\www\1_gisserot\tag.php:6) in c:\program files\easyphp1-8\www\1_gisserot\configuration.inc.php on line 81

Notice: Undefined variable: tags in c:\program files\easyphp1-8\www\1_gisserot\tag.php on line 33

Warning: array_values(): The argument should be an array in c:\program files\easyphp1-8\www\1_gisserot\tag.php on line 33

Warning: Wrong parameter count for max() in c:\program files\easyphp1-8\www\1_gisserot\tag.php on line 33

Notice: Undefined variable: tags in c:\program files\easyphp1-8\www\1_gisserot\tag.php on line 34

Warning: array_values(): The argument should be an array in c:\program files\easyphp1-8\www\1_gisserot\tag.php on line 34

Warning: Wrong parameter count for min() in c:\program files\easyphp1-8\www\1_gisserot\tag.php on line 34

Warning: Invalid argument supplied for foreach() in c:\program files\easyphp1-8\www\1_gisserot\tag.php on line 54

Share this post


: post
Share on other sites

Posted · Report post

En recopiant ton code j'ai cela

Je n'affiche pas les warning, donc forcément :)

Il nous reste du pai nsur la planche :)

L'ajout dans recherche.php :

// Insertion Tag de recherche
$query = "SELECT COUNT(*) FROM tag_cloud WHERE tag_name = '$motclef'";
$result = mysql_query($query);
$enr = mysql_fetch_array($result);
//echo "Nb de Lien : ".$enr[0]."";
if($enr[0] != ""){
if($enr[0] == 0 ){
$sql = "INSERT INTO `tag_cloud` (`id`, `tag_name`,`nbsearch`) VALUES ('', '$motclef','1')";
mysql_query($sql) or die(mysql_error());
//echo "Ajout de ".$motclef."";
}else{
$query = "SELECT * FROM tag_cloud WHERE tag_name = '$motclef'";
$result = mysql_query($query);
while ( $champ = mysql_fetch_array($result) )
{
//echo 'Resultat: '.$champ[id].' | '.$champ[tag_name].' - "'.$champ[nbsearch]."\" \n" ;
$id = $champ[id];
$nb_search = $champ[nbsearch];
$nb_search++;
//echo "Increment de ".$motclef." - ".$nbsearch."";
$sql = "UPDATE `tag_cloud` SET `nbsearch` = '$nb_search' WHERE `id` = $id LIMIT 1";
mysql_query($sql) or die(mysql_error());
}
}
}
// Fin Insertion[/codebox]

Share this post


: post
Share on other sites

Posted · Report post

Mince j'ai fait un copier/coller et cela ne marche pas !!!!!! :)

Share this post


: post
Share on other sites

Posted · Report post

Mince j'ai fait un copier/coller et cela ne marche pas !!!!!! :)

Heu étrange là.

Share this post


: post
Share on other sites

Posted · Report post

noya_m, apparement tu tests en local sous easyphp aussi, non ?

Willy

Share this post


: post
Share on other sites

Posted · Report post

oui en local sous easyphp ....

Share this post


: post
Share on other sites

Posted · Report post

Il faut bien penser à le signaler, car tres tres souvent les soucis viennent de là.

Pour ma part, pour les tests, j'ais monté une 2 ieme boutique de test sur le même serveur que ma boutique réelle, comme ca pas de soucis.

Willy

Share this post


: post
Share on other sites

Posted · Report post

Moi je fais tous en LIVE :)

Bon je fait appel au pro des requétes MYSQL pour amélioré les miennes, et surtout celle dans la page recherche, qui insére ou non un mot, j'ai d'ailleur un soucis dans cette partie, car les recherche vide sont inséré dans la base, alors que normalement je ne l'ai teste pas!!!

J'ai remis en ligne, mon nuage, c'est dingue le nombre de recherche effectué sur notre boutique en si peux de temps.

A+

PS: j'ai déja commencé a y apporté quelques amélioration.

Share this post


: post
Share on other sites

Posted · Report post

C'est bon là, la page ,n'est plsu déformée on dirait.

On pourra avoir le code s'il est différent de celui au dessus :)

Ca rend bien comme ça, a intégrer dans PEEL pour les prochaines versions.

Je vais regarder dès que je peux le mettre et rendre l'affichage parametrable.

Willy

Share this post


: post
Share on other sites

Posted · Report post

j'ai des bug au niveau du moteur de recherche maintenant.

Share this post


: post
Share on other sites

Posted · Report post

C'est a dire, je viens de regarder et là je n'ais pas de soucis particulier.

Willy

Share this post


: post
Share on other sites

Posted · Report post

pour ne pas avoir de champs vide de rentré,

remplace

if($enr[0] != ""){

par

if($motclef != ""){

encore que moi j'irai encore plus loin et je ferai

// Insertion Tag de recherche

if($motclef != ""){

$query = "SELECT COUNT(*) FROM tag_cloud WHERE tag_name = '$motclef'";
$result = mysql_query($query);
$enr = mysql_fetch_array($result);
//echo "Nb de Lien : ".$enr[0]."";
if($enr[0] == 0 ){
$sql = "INSERT INTO `tag_cloud` (`id`, `tag_name`,`nbsearch`) VALUES ('', '$motclef','1')";
mysql_query($sql) or die(mysql_error());
//echo "Ajout de ".$motclef."";
}else{
$query = "SELECT * FROM tag_cloud WHERE tag_name = '$motclef'";
$result = mysql_query($query);
while ( $champ = mysql_fetch_array($result) )
{
//echo 'Resultat: '.$champ[id].' | '.$champ[tag_name].' - "'.$champ[nbsearch]."\" \n" ;
$id = $champ[id];
$nb_search = $champ[nbsearch];
$nb_search++;
//echo "Increment de ".$motclef." - ".$nbsearch."";
$sql = "UPDATE `tag_cloud` SET `nbsearch` = '$nb_search' WHERE `id` = $id LIMIT 1";
mysql_query($sql) or die(mysql_error());
}
}
}
// Fin Insertion[/codebox]

ceci afin d'éviter de faire la premiere requete alors que tu sais déjà que la variable recherchée est vide.

Share this post


: post
Share on other sites

Posted · Report post

C'est a dire, je viens de regarder et là je n'ais pas de soucis particulier.

Willy

C'est corrigé depuis :)

Share this post


: post
Share on other sites

Posted · Report post

C'est corrigé depuis :)

as tu pu prendre en compte ma modification pour que les chamsp vides ne soit pas inséré en base?

Share this post


: post
Share on other sites

Posted · Report post

Oui j'ai pris en compte ta modif et ça fonctionne.

Sinon voila ce que je fait comme traitement des mots avant insertion dans la base, mais ce n'est pas convaincant.

$mot_clef= strtr($motclef,
"ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇ
ÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ",
"SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaac
eeeeiiiionoooooouuuuyy");
$mot_clef = eregi_replace("[^a-z0-9]", "", $motclef);[/codebox]

En fait je souhaite supprimé les mots avec plein de caractéres bizzare (accentuation foireuse etc...), autre gros soucis, c'est que en l'etat il n'y a aucun filtre et donc je me retrouve avec les mots de vos test, ainsi que tous est n'importe quoi.

Bref c'est la partie à amélioré.

A+

Share this post


: post
Share on other sites

Posted · Report post

comment se fait il que tu ne puisse pas avoir un résultat plus propre?

Share this post


: post
Share on other sites

Posted · Report post

comment se fait il que tu ne puisse pas avoir un résultat plus propre?

C'est a dire?

Share this post


: post
Share on other sites

Posted · Report post

N'oubliez de mettre les fichiers definitif en copie :)

merci

Share this post


: post
Share on other sites

Posted · Report post

Oui j'ai pris en compte ta modif et ça fonctionne.

Sinon voila ce que je fait comme traitement des mots avant insertion dans la base, mais ce n'est pas convaincant.

$mot_clef= strtr($motclef,
"ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇ
ÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ",
"SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaac
eeeeiiiionoooooouuuuyy");
$mot_clef = eregi_replace("[^a-z0-9]", "", $motclef);[/codebox]

En fait je souhaite supprimé les mots avec plein de caractéres bizzare (accentuation foireuse etc...), autre gros soucis, c'est que en l'etat il n'y a aucun filtre et donc je me retrouve avec les mots de vos test, ainsi que tous est n'importe quoi.

Bref c'est la partie à amélioré.

A+

Regarde dans les fonctions de réécriture, il y a une fonction qui rend clean les libellés.

Pour nos requetes, effaces les directement de ta table :)

Willy

Share this post


: post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now

Twitter Advisto ecommerce

Facebook PEEL Shopping