Discuz功能改进:个人空间里的评论页
在美中网玩了那么久,发现那里有一些网友不爱自己写博文,只喜欢评论别人的博文。俗话说红花还要绿叶配,与那些博主一样,这些网友对网站的兴隆也起了重要的作用。我就不时想要看一下某位用户近来写了哪些新评论或者以往说过哪些话,但苦于没有有效的方法因为这些评论分散在各处不易寻找(除动态页给了一定帮助)。我们知道Discuz提供很方便的办法让读者找到某个作者的所有博文:进入该作者的个人空间,点击导航栏里的日志项,就看到了该作者的日志列表。但是它没提供找到某位评论作者写的所有评论的办法。本文就探讨一下如何添加这个功能。
下面是效果图,它不仅是一个评论列表,还是让用户管理自己的评论的地方,可以在那里修改和删除评论。其它用户也可以在那里的某条评论下跟评。 它还给管理员管制言论带来一定便利。
首先我们建立进入这个新的评论页的通道。
1。将评论项加入个人空间的导航栏
在template/default/home/space_header_personalnv.htm中的下面的代码:
< a href="home.php?mod=space&uid=$space[uid]&do=blog&view=me&from=space" >$personalnv['items']['blog']{lang blog}
后面添加
< a href="home.php?mod=space&uid=$space[uid]&do=comment&view=me&from=space" >$personalnv['items']['comment']{lang comment}
注意一个用户的日志列表页能否为他人所见,取决于1)该网站是否开启了日志功能,2)该用户设置的日志列表页的阅读权限,3)该用户是否将日志加在了个人空间的导航栏里。为简化起见我们把评论功能视做是日志功能的一部分,而不是一个单独的功能。这样我们就不用修改管理前两项的网页了,这就是上面代码里check_module用的参数值是blog的原因。下面我们来修改管理第三项的网页。
2。将评论项加入装饰个人空间页的导航栏里的编辑导航菜单名称对话框并确保能够保存用户的选择:
2a) 在template/default/home/spacecp_index.htm中的下面的代码:
{lang blog} |
|
后面添加
{lang comment} |
|
2b) 在source/include/spacecp/spacecp_index.php中的下面的代码中在blog的后面加入了comment一词:
if (submitcheck('editnvsubmit')) {
$hidden = intval($_POST['nvhidden']);
$nv = array('index', 'feed', 'doing', 'blog', 'comment', 'album', 'topic', 'share', 'friends', 'wall', 'profile', 'follow');
接下来我们来建造这个评论页本身。
3。在source/module/home/home_space.php里添加对评论页的支持,基本上就是在有blog和album连着的地方插入comment一词,有下面三个地方要加:
3a)
$dos = array('index', 'doing', 'blog', 'comment', 'album', 'friend', 'wall', 'notice', 'share', 'home', 'pm', 'videophoto', 'favorite', 'thread', 'trade', 'poll', 'activity', 'debate', 'reward', 'profile', 'plugin', 'follow');
3b)
if(!in_array($do, array('home', 'doing', 'blog', 'comment', 'album', 'share', 'wall'))) {
$_G['mnid'] = 'mn_common';
}
3c)
if(empty($space)) {
if(in_array($do, array('doing', 'blog', 'comment', 'album', 'share', 'home', 'trade', 'poll', 'activity', 'debate', 'reward', 'group'))) {
$_GET['view'] = 'all';
$space['uid'] = 0;
4。按惯例加一个新的脚本文件source/include/space/space_comment.php:
fetch_all_search(3, null, $authorids, null, null, null, 'blogid', null, null, null, null, null);
$multi = multi($count, $perpage, $page, "home.php?mod=space&uid=$space[uid]&do=$do");
if($count) {
$query = C::t('home_comment')->fetch_all_search(1, null, $authorids, null, null, null, 'blogid', null, null, $start, $perpage, null, null, null);
$blogs = array();
foreach($query as $value) {
$blogs[] = $value['id'];
}
$data_blog = C::t('home_blog')->fetch_all($blogs);
$data_blogfield = C::t('home_blogfield')->fetch_all($blogs);
foreach($query as $value) {
$blogvalue = $data_blog[$value['id']];
$blogvalue = array_merge($blogvalue, (array)$data_blogfield[$value['id']]);
if(ckfriend($blogvalue['uid'], $blogvalue['friend'], $blogvalue['target_ids']) && ( ($blogvalue['status'] == 0 && $blogvalue['friend'] != 4) || $blogvalue['uid'] == $_G['uid'] || $_G['adminid'] == 1)) {
$value['username'] = $blogvalue['username'];
$value['subject'] = $blogvalue['subject'];
$list[] = $value;
} else {
$pricount++;
}
}
}
dsetcookie('home_diymode', $diymode);
if($space['username']) {
$navtitle = lang('space', 'sb_comment', array('who' => $space['username']));
}
$navtitle = helper_seo::get_title_page($navtitle, $_G['page']);
space_merge($space, 'field_home');
$_GET['pagedo'] = $_GET['do'];
include_once template("diy:home/space_comment_list");
?>
5。按惯例加一个新的模板文件template/default/home/space_comment_list.htm:
6。按惯例要在页面上显示的中文词语集中定义在专门的脚本文件里。
6a) 在source/language/lang_space.php里加:
'sb_comment' => '{who}的评论',
6b) 在source/language/home/lang_template.php里加:
'hide_comment' => '本页有 $pricount 篇评论因日志作者的隐私设置或未通过审核而隐藏',
7。每个评论行是在现有的模板文件template/default/home/space_comment_li.htm里定义的,这是用于日志页里显示评论的,现在我们将它用于评论页,这样评论页上的评论行也能利用现有的编辑,删除,回复等功能。但就需要对该文件做些修改,使之能同时用于这两个网页。注意从下图可见,有关日志标题和作者名及其链接仅出现在评论页里。
< a href="home.php?mod=space&uid=$value[uid]&do=blog&id=$value[id]" target="_blank">$value[subject]
(< a href="home.php?mod=space&uid=$value[uid]" c="1">$value[username])
为此我们需要一个标记在区分两者,我们引进变量pagedo来区分两者。在日志页里它的值为blog,而在评论页里它的值为comment。
< a href="home.php?mod=spacecp&ac=comment&op=edit&cid=$value[cid]&handlekey=editcommenthk_{$value[cid]}&pagedo=$_GET[pagedo]" id="c_$value[cid]_edit" onclick="showWindow(this.id, this.href, 'get', 0);">{lang edit}
上面一行代码里的
&pagedo=$_GET[pagedo]是新加的。
下面四个文件的修改也是为了来支持这个变量:
8。template/default/home/spacecp_comment.htm:
1/30/15补充:
和HQ讨论后感觉可以从三个方面修改来支持评论者拥有评论的权利
1)当博主删掉评论时,在数据库里仍保留该评论,只断掉评论和日志的联系
在文件source/function/function_delete中的函数deletecomments里将下面一段代码
foreach($query as $value) {
if($allowmanage || $value['authorid'] == $_G['uid'] || $value['uid'] == $_G['uid']) {
$dels[] = $value;
$newcids[] = $value['cid'];
$deltypes[] = $value['idtype'].'_cid';
if($value['authorid'] != $_G['uid'] && $value['uid'] != $_G['uid']) {
$counts[$value['authorid']]['coef'] -= 1;
}
if($value['idtype'] == 'blogid') {
$blognums[$value['id']]++;
}
}
}
if(empty($dels)) return array();
C::t('home_comment')->delete($newcids);
改为
foreach($query as $value) {
if($allowmanage || $value['authorid'] == $_G['uid'] || $value['uid'] == $_G['uid']) {
$dels[] = $value;
$newcids[] = $value['cid'];
$deltypes[] = $value['idtype'].'_cid';
if($value['authorid'] != $_G['uid'] && $value['uid'] != $_G['uid']) {
$counts[$value['authorid']]['coef'] -= 1;
}
if($value['idtype'] == 'blogid') {
$blognums[$value['id']]++;
}
if($allowmanage || $value['authorid'] == $_G['uid']) {
$newcids1[] = $value['cid'];
}
else {
$newcids2[] = $value['cid'];
}
}
}
if(empty($dels)) return array();
C::t('home_comment')->delete($newcids1);
if(!empty($newcids2)) DB::update("home_comment", array('id' => 0), DB::field('cid', $newcids2));
2)当日志在页面上被删除(在日志回收站没被启用时)或在日志回收站被清除(如果日志回收站已经启用)时,在数据库里仍保留所有评论,只断掉评论和日志的联系
在文件source/function/function_delete中的函数deleteblogs里将下面一行代码
C::t('home_comment')->delete('', $newblogids, 'blogid');
改为
DB::update("home_comment", array('id' => 0), DB::field('id', $newblogids));
3)在评论页上向评论作者本人显示所有他写的评论
在文件source/include/space/space_comment.php里将下面一段代码
foreach($query as $value) {
$blogvalue = $data_blog[$value['id']];
$blogvalue = array_merge($blogvalue, (array)$data_blogfield[$value['id']]);
if(ckfriend($blogvalue['uid'], $blogvalue['friend'], $blogvalue['target_ids']) && ( ($blogvalue['status'] == 0 && $blogvalue['friend'] != 4) || $blogvalue['uid'] == $_G['uid'] || $_G['adminid'] == 1)) {
$value['username'] = $blogvalue['username'];
$value['subject'] = $blogvalue['subject'];
$list[] = $value;
}
else {
$pricount++;
}
}
改为
foreach($query as $value) {
if ($value['id']) {
$blogvalue = $data_blog[$value['id']];
$blogvalue = array_merge($blogvalue, (array)$data_blogfield[$value['id']]);
if(ckfriend($blogvalue['uid'], $blogvalue['friend'], $blogvalue['target_ids']) && ( ($blogvalue['status'] == 0 && $blogvalue['friend'] != 4) || $blogvalue['uid'] == $_G['uid'] || $_G['adminid'] == 1)) {
$value['username'] = $blogvalue['username'];
$value['subject'] = $blogvalue['subject'];
$list[] = $value;
}
elseif ($value['authorid'] == $_G['uid']) {
$list[] = $value;
}
else {
$pricount++;
}
}
else {
if ($value['authorid'] == $_G['uid'] || $_G['adminid'] == 1) {
$list[] = $value;
}
else {
$pricount++;
}
}
}
注:本文中的代码里的<符号如果后面的字符是a的话,在它们中间加了一个不应该有的空格,以避免Discuz在保存日志时自动改变日志内容。