Notation avec étoiles et possibilité de modification de la note

Soyez le premier à donner votre avis sur cette source.

Vue 6 760 fois - Téléchargée 599 fois

Description

Tout d'abord, je tiens à préciser que ce n'est pas moi qui ai créé cette source.
Mais je me suis permit de modifier la source, de la traduire et de l'améliorer.

La grosse amélioration est qu'il est possible au membre votant, de modifier son vote par la suite.

J'en viens à la description.
Les enregistrements se font par une table SQL.
_drawrating.php affiche la barre.
_config-rating.php contient quelques notes à lire et des configurations.
rpc.php modifie ou ajoute dans la table en passant pas AJAX.
db.php modifie ou ajoute dans la table sans passer par AJAX (si JS désactivé).
index.php sert uniquement d'exemple.
rating.js et behavior.js sert pour l'AJAX.
structure.sql contient la structure de la table SQL.

Source / Exemple :


<?php
//Affichage de la barre de notation
function rating_bar($id_serie, $units = '', $static = '')
{
//enregistrement de la page de notation
$_SESSION['referer'] = $_SERVER['SCRIPT_URL'];

//info
require('_config-rating.php');
	
//config variable
if (!$units) {$units = ETOILE_MAX;} //par défaut, affichage de 10 étoiles
if (!$static) {$static = FALSE;} // par défaut, activation des votes.

//on prend les infos propre à la série
$query = mysql_query('SELECT count(note) as count, sum(note) as total_value FROM '.$rating_tableName.' WHERE id_serie="'.$id_serie.'" ') or die('Error (1): '.mysql_error());
$numbers = mysql_fetch_assoc($query);

//calcul du nombre de votes
$count = $numbers['count'];

//somme des votes
$current_rating = $numbers['total_value'];

//singulier / pluriel
$tense = ($count <= 1) ? "vote" : "votes";

//On regarde si le membre à déja voté.
//si MOD = false on désactive les modification de vote
if (MOD == false) {
	$voted = mysql_fetch_array(mysql_query('SELECT id FROM '.$rating_tableName.' WHERE id_user="'.$id_user.'" AND id_serie="'.$id_serie.'" ')); 
}

//On calcul la taille de la barre de notation
$rating_width = @number_format($current_rating/$count,2)*$rating_unitwidth;
$rating1 = @number_format($current_rating/$count,1);
$rating2 = @number_format($current_rating/$count,2);

//Si on a choisi de désactiver les votes
if ($static == 'static')
{
	$static_rater = array();
	$static_rater[] .= "\n".'<div class="ratingblock">';
	$static_rater[] .= '<div id="unit_long'.$id_serie.'">';
	$static_rater[] .= '<ul id="unit_ul'.$id_serie.'" class="unit-rating" style="width:'.$rating_unitwidth*$units.'px;" style="text-align:center;">';
	$static_rater[] .= '<li class="current-rating" style="width:'.$rating_width.'px;">Actuellement '.$rating2.'/'.$units.'</li>';
	$static_rater[] .= '</ul>';
	$static_rater[] .= '<p class="static" style="text-align:center;">Note : <strong> '.$rating1.'</strong>/'.$units.' ('.$count.' '.$tense.')</p>';
	$static_rater[] .= '</div>';
	$static_rater[] .= '</div>'."\n\n";
	
	return join("\n", $static_rater);
}
else
{
	$rater ='';
	$rater.='<div class="ratingblock">';
	
	$rater.='<div id="unit_long'.$id_serie.'">';
	$rater.='  <ul id="unit_ul'.$id_serie.'" class="unit-rating" style="width:'.$rating_unitwidth*$units.'px;" style="text-align:center;">';
	$rater.='     <li class="current-rating" style="width:'.$rating_width.'px;">Actuellement '.$rating2.'/'.$units.'</li>';
	
	//boucle pour afficher le nombre d'étoiles voulues
	for ($ncount = 1; $ncount <= $units; $ncount++)
	{
		//si le membre n'a pas encore voté, on affiche la possibilité de voter
		if(!$voted or MOD == true)
		{
			$rater .= '<li><a href="db.php?j='.$ncount.'&amp;q='.$id_serie.'&amp;t='.$id_user.'&amp;c='.$units.'" title="'.$ncount.' sur '.$units.'" class="r'.$ncount.'-unit rater" rel="nofollow">'.$ncount.'</a></li>';
		}
	}
	
	$rater.='  </ul>';
	$rater.='  <p style="text-align:center;"';
	if($voted) //si membre a voté
	{ $rater.=' class="voted"';}
	$rater.='>Note : <strong> '.$rating1.'</strong>/'.$units.' ('.$count.' '.$tense.')';
	if($voted) //si membre a voté
	{ $rater.='<br/>Ma note : <strong> '.$voted['note'].'</strong>/'.$units.'';}
	$rater.='  </p>';
	$rater.='</div>';
	$rater.='</div>';
	return $rater;
}
}
?>

Conclusion :


Étant donné que c'est ma première source ici je suis ouvert à toutes les critiques pour pouvoir m'améliorer.

N'oubliez pas de configurer et lire le fichier _config-rating.php.

Codes Sources

A voir également

Ajouter un commentaire

Commentaires

Messages postés
24
Date d'inscription
dimanche 9 décembre 2007
Statut
Membre
Dernière intervention
7 avril 2013

Bonjour,
Si tu ne veux pas tenir compte de l'id du membre mais seulement de son ip, c'est le cas le plus simple :
Il faut remplacer la valeur de la variable $id_user qui normalement est égal à l'id du membre par l'adresse ip. (il faudra alors peut-être modifié le type de champ dans la table sql car je ne pense pas si le point (.) peut être enregistré comme INT.

Par contre pour rajouter la variables contenant l'ip, il faut alors rajouter un champ dans la table, dans les différents liens et aussi dans le fichier JS.
le lien sera quelque chose dans ce genre :
["db.php?j='.$ncount.'&q='.$id_serie.'&t='.$id_user.'&c='.$units.'&i='.$ip.'" title="'.$ncount.' sur '.$units.'" class="r'.$ncount.'-unit rater" rel="nofollow '.$ncount.']
Messages postés
13
Date d'inscription
mercredi 26 novembre 2008
Statut
Membre
Dernière intervention
31 août 2010

Bonjour,tout d'abord merci de faire partager votre source,j'aurais une question,est ce qu'il est possible de rajouter dans le code php une variable qui enregistrerais l'ip du visiteur qui voterait en plus de l'id user,de cette façon lors de l'installation une table en plus serait créer et qui servirait donc à enregistrer les ip ayant déjà voter..
Car j'aimerais inclure votre code sur mon annuaire mais j'aimerais que les visiteurs simples sans qu'ils soient membres puissent aussi voter...
Vu que c'est un code où l'ont doit lancer l'installation et qui créer la BDD et bien j'aimerais savoir si c'est possible ( je pense que oui ) et surtout quel variable et où doit on la mettre dans votre code pour que la table soit créer en même temps et qui après empêcherais une 2èmes vote de la même ip du visiteur (pas du membre)...?
Merci d'avance.
Cordialement

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.