thinkPHP实现基于ajax的评论回复功能
本文实例讲述了thinkPHP实现基于ajax的评论回复功能。分享给大家供大家参考,具体如下:
控制器代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
<?php namespace Home\Controller; use Think\Controller; class IndexController extends Controller { public function index(){ $num = M( 'comment' )-> count (); //获取评论总数 $this ->assign( 'num' , $num ); $data = array (); $data = $this ->getCommlist(); //获取评论列表 $this ->assign( "commlist" , $data ); $this ->display( 'index' ); } /** *添加评论 */ public function addComment(){ $data = array (); if ((isset( $_POST [ "comment" ]))&&(! empty ( $_POST [ "comment" ]))){ $cm = json_decode( $_POST [ "comment" ],true); //通过第二个参数true,将json字符串转化为键值对数组 $cm [ 'create_time' ]= date ( 'Y-m-d H:i:s' ,time()); $newcm = M( 'comment' ); $id = $newcm ->add( $cm ); $cm [ "id" ] = $id ; $data = $cm ; $num = M( 'comment' )-> count (); //统计评论总数 $data [ 'num' ]= $num ; } else { $data [ "error" ] = "0" ; } echo json_encode( $data ); } /** *递归获取评论列表 */ protected function getCommlist( $parent_id = 0,& $result = array ()){ $arr = M( 'comment' )->where( "parent_id = '" . $parent_id . "'" )->order( "create_time desc" )->select(); if ( empty ( $arr )){ return array (); } foreach ( $arr as $cm ) { $thisArr =& $result []; $cm [ "children" ] = $this ->getCommlist( $cm [ "id" ], $thisArr ); $thisArr = $cm ; } return $result ; } } |
JavaScript代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
|
$( function (){ //点击提交评论内容 $( 'body' ).delegate( '.comment-submit' , 'click' , function (){ var content = $.trim($( this ).parent().prev().children( "textarea" ).val()); //根据布局结构获取当前评论内容 $( this ).parent().prev().children( "textarea" ).val( "" ); //获取完内容后清空输入框 if ( "" ==content){ alert( "评论内容不能为空!" ); } else { var cmdata = new Object(); cmdata.parent_id = $( this ).attr( "parent_id" ); //上级评论id cmdata.content = content; cmdata.nickname = "游客" ; //测试用数据 cmdata.head_pic = "/Public/images/default.jpg" ; //测试用数据 var replyswitch = $( this ).attr( "replyswitch" ); //获取回复开关锁属性 $.ajax({ type: "POST" , url: "/index.php/home/index/addComment" , data:{ comment:JSON.stringify(cmdata) }, dataType: "json" , success: function (data){ if ( typeof (data.error)== "undefined" ){ $( ".comment-reply" ).next().remove(); //删除已存在的所有回复div //更新评论总数 $( ".comment-num" ).children( "span" ).html(data.num+ "条评论" ); //显示新增评论 var newli = "" ; if (cmdata.parent_id == "0" ){ //发表的是一级评论时,添加到一级ul列表中 newli = "<li comment_id='" +data.id+ "'><div ><div><img class='head-pic' src='" +data.head_pic+ "' alt=''></div><div class='cm'><div class='cm-header'><span>" +data.nickname+ "</span><span>" +data.create_time+ "</span></div><div class='cm-content'><p>" +data.content+ "</p></div><div class='cm-footer'><a class='comment-reply' comment_id='" +data.id+ "' href='javascript:void(0);'>回复</a></div></div></div><ul class='children'></ul></li>" ; $( ".comment-ul" ).prepend(newli); } else { //否则添加到对应的孩子ul列表中 if ( 'off' ==replyswitch){ //检验出回复关闭锁存在,即三级评论不再提供回复功能 newli = "<li comment_id='" +data.id+ "'><div ><div><img class='head-pic' src='" +data.head_pic+ "' alt=''></div><div class='children-cm'><div class='cm-header'><span>" +data.nickname+ "</span><span>" +data.create_time+ "</span></div><div class='cm-content'><p>" +data.content+ "</p></div><div class='cm-footer'></div></div></div><ul class='children'></ul></li>" ; } else { //二级评论的回复按钮要添加回复关闭锁属性 newli = "<li comment_id='" +data.id+ "'><div ><div><img class='head-pic' src='" +data.head_pic+ "' alt=''></div><div class='children-cm'><div class='cm-header'><span>" +data.nickname+ "</span><span>" +data.create_time+ "</span></div><div class='cm-content'><p>" +data.content+ "</p></div><div class='cm-footer'><a class='comment-reply' comment_id='" +data.id+ "' href='javascript:void(0);' replyswitch='off' >回复</a></div></div></div><ul class='children'></ul></li>" ; } $( "li[comment_id='" +data.parent_id+ "']" ).children( "ul" ).prepend(newli); } } else { //有错误信息 alert(data.error); } } }); } }); //点击"回复"按钮显示或隐藏回复输入框 $( "body" ).delegate( ".comment-reply" , "click" , function (){ if ($( this ).next().length>0){ //判断出回复div已经存在,去除掉 $( this ).next().remove(); } else { //添加回复div $( ".comment-reply" ).next().remove(); //删除已存在的所有回复div //添加当前回复div var parent_id = $( this ).attr( "comment_id" ); //要回复的评论id var divhtml = "" ; if ( 'off' ==$( this ).attr( "replyswitch" )){ //二级评论回复后三级评论不再提供回复功能,将关闭属性附加到"提交回复"按钮" divhtml = "<div class= 'div-reply-txt' style= 'width:98%;padding:3px;' replyid= '2' ><div><textarea class= 'txt-reply' replyid= '2' style= 'width: 100%; height: 60px;' ></textarea></div><div style= 'margin-top:5px;text-align:right;' ><a class= 'comment-submit' parent_id= '"+parent_id+"' style= 'font-size:14px;text-decoration:none;' href= 'javascript:void(0);' replyswitch= 'off' >提交回复</a></div></div> "; }else{ divhtml = " <div class= 'div-reply-txt' style= 'width:98%;padding:3px;' replyid= '2' ><div><textarea class= 'txt-reply' replyid= '2' style= 'width: 100%; height: 60px;' ></textarea></div><div style= 'margin-top:5px;text-align:right;' ><a class= 'comment-submit' parent_id= '"+parent_id+"' style= 'font-size:14px;text-decoration:none;' href= 'javascript:void(0);' >提交回复</a></div></div>"; } $( this ).after(divhtml); } }); }) |
页面样式代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
.comment-filed{ width : 640px ; margin : 0 auto ; } .comment-num{ text-align : right ; font-size : 14px ; } .div-txt-submit{ text-align : right ; margin-top : 8px ; } .comment-submit{ background-color : #63B8FF ; margin-top : 15px ; text-decoration : none ; color : #fff ; padding : 5px ; font-size : 14px ; } .txt-commit{ border : 1px solid blue ; width : 620px ; height : 60px ; padding : 10px ; } .txt-reply{ width : 100% ; height : 60px ; } .comment-filed-list{ margin-top : 20px ; } .comment-list{ margin-top : 2px ; width :herit; height : 50px ; border-top : 1px solid gray ; } .comment-ul{ list-style : none ; padding-left : 0 ; } .head-pic{ width : 40px ; height : 40px ; } .cm{ position : relative ; top : 0px ; left : 40px ; top : -40px ; width : 600px ; } .cm-header{ padding-left : 5px ; } .cm-content{ padding-left : 5px ; } .cm-footer{ padding-bottom : 15px ; text-align : right ; border-bottom : 1px dotted #CCC ; } .comment-reply{ text-decoration : none ; color : gray ; font-size : 14px ; } .children{ list-style : none ; background-color : #FAFAFA ; padding-left : 0 ; margin-left : 40px ; } .children-cm{ position : relative ; left : 40px ; top : -40px ; width : 90% ; } |
页面布局代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> < html lang = "en" > < head > < meta http-equiv = "Content-Type" content = "text/html;charset=UTF-8" > < title >php评论及回复功能</ title > < link rel = "stylesheet" type = "text/css" href = "/Public/css/comment.css" rel = "external nofollow" > < script type = "text/javascript" src = "/Public/js/jquery-1.11.3.min.js" ></ script > < script type = "text/javascript" src = "/Public/js/comment.js" ></ script > </ head > < body > < div class = "comment-filed" > <!--发表评论区begin--> < div > < div class = "comment-num" > < span >{$num}条评论</ span > </ div > < div > < div > < textarea class = "txt-commit" replyid = "0" ></ textarea > </ div > < div class = "div-txt-submit" > < a class = "comment-submit" parent_id = "0" style = "" href = "javascript:void(0);" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" >< span style = '' >发表评论</ span ></ a > </ div > </ div > </ div > <!--发表评论区end--> <!--评论列表显示区begin--> <!-- {$commentlist} --> < div class = "comment-filed-list" > < div >< span >全部评论</ span ></ div > < div class = "comment-list" > <!--一级评论列表begin--> < ul class = "comment-ul" > < volist name = "commlist" id = "data" > < li comment_id = "{$data.id}" > < div > < div > < img class = "head-pic" src = "{$data.head_pic}" alt = "" > </ div > < div class = "cm" > < div class = "cm-header" > < span >{$data.nickname}</ span > < span >{$data.create_time}</ span > </ div > < div class = "cm-content" > < p > {$data.content} </ p > </ div > < div class = "cm-footer" > < a class = "comment-reply" comment_id = "{$data.id}" href = "javascript:void(0);" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" >回复</ a > </ div > </ div > </ div > <!--二级评论begin--> < ul class = "children" > < volist name = "data.children" id = "child" > < li comment_id = "{$child.id}" > < div > < div > < img class = "head-pic" src = "{$child.head_pic}" alt = "" > </ div > < div class = "children-cm" > < div class = "cm-header" > < span >{$child.nickname}</ span > < span >{$child.create_time}</ span > </ div > < div class = "cm-content" > < p > {$child.content} </ p > </ div > < div class = "cm-footer" > < a class = "comment-reply" replyswitch = "off" comment_id = "{$child.id}" href = "javascript:void(0);" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" rel = "external nofollow" >回复</ a > </ div > </ div > </ div > <!--三级评论begin--> < ul class = "children" > < volist name = "child.children" id = "grandson" > < li comment_id = "{$grandson.id}" > < div > < div > < img class = "head-pic" src = "{$grandson.head_pic}" alt = "" > </ div > < div class = "children-cm" > < div class = "cm-header" > < span >{$grandson.nickname}</ span > < span >{$grandson.create_time}</ span > </ div > < div class = "cm-content" > < p > {$grandson.content} </ p > </ div > < div class = "cm-footer" > <!-- <a class="comment-reply" comment_id="1" href="javascript:void(0);" rel="external nofollow" rel="external nofollow" rel="external nofollow" rel="external nofollow" >回复</a> --> </ div > </ div > </ div > </ li > </ volist > </ ul > <!--三级评论end--> </ li > </ volist > </ ul > <!--二级评论end--> </ li > </ volist > </ ul > <!--一级评论列表end--> </ div > </ div > <!--评论列表显示区end--> </ div > </ body > </ html > |
sql语句:
1
2
3
4
5
6
7
8
9
10
|
DROP TABLE IF EXISTS `t_comment`; CREATE TABLE `t_comment` ( `id` int (11) NOT NULL AUTO_INCREMENT COMMENT '主键id' , `parent_id` int (11) NOT NULL COMMENT '上级评论id,若是一级评论则为0' , `nickname` varchar (100) DEFAULT NULL COMMENT '评论人昵称' , `head_pic` varchar (400) DEFAULT NULL COMMENT '评论人头像' , `content` text COMMENT '评论内容' , `create_time` datetime DEFAULT NULL COMMENT '评论或回复发表时间' , PRIMARY KEY (`id`) ) ENGINE=MyISAM AUTO_INCREMENT=148 DEFAULT CHARSET=utf8; |
页面布局少一个jquery.js请自行加上。
分类:
前端技术
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!