web2.0的站点和博客很多都开始启用星级评价,可以达到和读者互动的目的,增加用户体验,这个教程主要是讲解如何使用php+jquery实现ajax星级评价。

demo:http://demo.tutorialzine.com/2009/11/fancy-quotes/demo.php
这个demo实现的功能如下:
- 右侧文章列表,随鼠标而滚动。
- 点击文章列表中的文章,切换左侧内容。
- 鼠标滑过左侧内容出现投票框。
- ajax提交评级。
- 提交过不允许重复评级。
1、数据库配置
在demo包里面有个tables.sql,导入数据库中。
有二张表:
quotes为文章表
quotes_votes评级表
修改connect.php中的数据库连接配置:
- $db_host = 'localhost';
- $db_user = 'root';
- $db_pass = '123';
- $db_database = 'rate';
根据你机子的情况而修改。
如果一切顺利的话,运行demo.php即可正常看到demo了。
2、用到的jquery以及jquery的UI、插件
- jquery1.3.2
- jquery-ui1.7
- ui.stars 星级评价UI插件
- jquery.qtip-1.0.0 提示层插件
3、生成文章列表
连接文章表和投票表进行查询:
- $result = mysql_query("SELECT q.*, IF(v.id,1,0) AS voted
- FROM quotes AS q
- LEFT JOIN quotes_votes AS v
- ON q.id = v.qid
- AND v.ip =".$ip."
- AND v.date_submit = '".$today."'
- ");
生成投票列表字符串变量$str
- while($row=mysql_fetch_assoc($result))
- {
- // Looping through all the quotes and generating the list on the right of the page:
- $str.= '<div id="q-'.$i.'">'.substr($row['txt'],0,20).
- '<span>...</span><div id="rating-'.$i.'">';
- $row['rating'] = round($row['rating']);
- for($z=0;$z<5;$z++)
- {
- $str.='<input type="radio" name="rate-'.$i.'" value="'.($z+1).'" '.($z+1==$row['rating']?'checked="checked"':'').' disabled="disabled" />';
- }
- $str.='</div></div>';
- // Each quote calls the fillData JS function
- $script.="fillData(".formatJSON($row).");".PHP_EOL;
- $i++;
- }
![]()
这种星级样式是jquery的ui.stars转换的,php只要生成5个单选框即可,单选框的值从1-5,当然要读下数据库中的rating字段的值,然后判定该选中哪个单选框。
留意
- $script.="fillData(".formatJSON($row).");".PHP_EOL;
formatJSON()这个php函数在function.php中,将结果集转成json。
fillData()是javascript函数,在script.js中,将json数据保存到数组。(这些数据在进行ajax提交评级数据的时候要用到)
4、将单选框转成评级UI
代码在script.js中:
- $(".star-rating").stars();
关于ui.stars的配置请详见我以前写的教程:

到此如图部分创建结束
5、给列表的文章添加单击事件,切换左侧内容
- $('.thumb').click(function(e){
- /* 点击文章 */
- var obj = quotes[parseInt(e.target.id.replace('q-',''))-1];
- /* 获取该文章的在数据库中的数据,这里要把id过滤下,因为层的id有个'q-'前缀 */
- $('#quote-content').fadeOut('fast',function(){
- /* 动画隐藏内容层后触发的回调函数 */
- if(!obj) return false;
- /* 替换标题和作者信息 */
- $(this).find('h1').html(obj.txt);
- $(this).find('span').html(obj.author);
- /* 改变页面背景颜色 */
- if(obj.bgc) $('body').stop().animate({backgroundColor:obj.bgc},'slow');
- /* 产生一个自动提示层和用于评级的5个单选框 */
- var tmpstr='';
- for(var z=0;z<5;z++)
- {
- tmpstr+='<input type="radio" name="voteQ" value="'+(z+1)+'" ';
- if(z+1==obj.rating) tmpstr+='checked=checked ';
- if(parseInt(obj.voted)) tmpstr+='disabled="disabled" ';
- tmpstr+='/>';
- }
- tmpstr='<div id="voteRating">'+tmpstr+'</div>';
- /* 更新提示层的内容 */
- $('#box').qtip("api").updateContent(tmpstr);
- /* 将单选框转成评级UI */
- $('#voteRating').stars({
- cancelShow: false,
- oneVoteOnly: true,
- callback:function(ui, type, value){vote(obj,value);}
- });
- Cufon.refresh();
- /* 显示内容层 */
- $(this).fadeIn('fast');
- });
- });
加了中文注释,就不再一一解释了,要留意的有二处地方:
1、
- $('#box').qtip("api").updateContent(tmpstr)
updateContent是$.qtip()的方法用于更新提示层的内容
2、
- $('#voteRating').stars({
- cancelShow: false,
- oneVoteOnly: true,
- callback:function(ui, type, value){vote(obj,value);}
- });
这里的的评级UI多了几个参数:
oneVoteOnly: true,允许投票
callback:function(){},投票后的回调函数。(ajax提交评级)
6、创建提示层
关于qtip的配置问题,不在这里讨论,有机会会专门发篇教程。
- $('#box').qtip({
- content: {
- text:'This is an active list element',
- title: { text: 'Vote for this quote'},
- prerender:true
- },
- show: 'mouseover',
- hide: {
- delay:1000,
- fixed:true,
- when:'mouseout'
- },
- position: {
- corner: {
- target: 'bottomMiddle',
- tooltip: 'topMiddle'
- },
- adjust:{
- y:20
- }
- },
- style: {
- border: {
- width: 2,
- radius: 6
- },
- name:'light',
- tip: 'topMiddle'
- }
- });
7、ajax评级方法vote()
- function vote(ob,value)
- {
- /*ajax将投票数据发给vote.php*/
- $.post('vote.php',{qid:ob.id,vote:value},function(data){
- if(data=="1")
- {
- /* 更新json数据 */
- ob.voted=1;
- ob.votes=ob.votes+1;
- ob.vsum=ob.vsum+parseInt(value);
- ob.rating = Math.round(ob.vsum/ob.votes);
- /* 更新评级UI */
- $('#rating-'+ob.id).stars("select", ob.rating);
- quotes[ob.id-1]=ob;
- }
- });
- }
8、保存投票数据vote.php
- /* 将用户ip转成长整型 */
- $ip = ip2long($_SERVER['REMOTE_ADDR']);
- /* 将文章id和评级值转成整形 */
- $qid = (int)$_POST['qid'];
- $v = (int)$_POST['vote'];
- /* 向数据库插入数据 */
- mysql_query(' INSERT INTO quotes_votes (qid,ip,vote,date_submit)
- VALUES ('.$qid.','.$ip.','.$v.',CURDATE())');
- /* 更新文章表的评级统计数据 */
- if(mysql_affected_rows($link)==1)
- {
- mysql_query("UPDATE quotes SET votes=votes+1, vsum=vsum+".$v.", rating=vsum/votes WHERE id=".$qid);
- echo'1';
- }
- else echo '0';
原文:http://tutorialzine.com/2009/11/fancy-quotes/
非常长的一篇教程,我敲了三个小时,有不明白的地方可以给偶留言,谢谢

