立即注册 登录
汉山 返回首页

admin的个人空间 http://hanshan.info/?1 [收藏] [复制] [分享] [RSS]

日志

Discuz功能改进:显示最新评论(彼岸网,天香公主)

热度 1已有 214 次阅读2017-12-9 22:11 |系统分类:技术支持 | 宽屏 请点击显示宽屏,再点击恢复窄屏 | 动漫全图 如只见部分动漫,请点击显示全图,再点击恢复窄图

【前注】最近加上 博客最新评论 功能,其技术借鉴于天香公主的工作,特转此文于此。


Discuz功能改进:显示最新评论

热度 2已有 6359 次阅读2013-12-29 05:38 PM|个人分类:Discuz|系统分类:社交网理论与实践

HQ给我出了个题目,如何在首页显示最新评论,类似于下面的式样: http://blog.eastday.com/nba2046

我觉得这是一个很有用的功能,因为我在网站上经常找不到当前的热点,即不知道网友们当前去哪篇博文里讨论问题了。


要加上这个功能,用Discuz系统的用词说就是要建造有这样一个功能的DIY模块。在解释如何建造这个模块前,我们先来了解一下有关的基本概念。


Discuz系统提供的很多网页都支持DIY(Do It Yourself),即由各个网站自己决定安排网页上的内容。 特别是门户页没有默认的内容,网站如果不加内容进去的话就是一片空白。网站在网页上可以加入诸如最新日志栏,用户列表之类的东西,这些叫做DIY模块(block)。还有一个个人空间首页,每个用户可以在那里自行安放模块。


上图模块字样下面一行中里的每一个称为一个模块大分类,如论坛类,群组类等。它们每一个对应了source\class\block文件夹里的一个子夹,如空间类对应着source\class\block\space。在每个这样的子夹里,有一个叫blockclass.php的文件,其中定义了该模块大分类的名字。

这个子文件夹里的每个PHP文件都包含一个模块数据类的定义。在类的定义里指明它所属的模块类的名字。如在空间类里就有相册模块,日志模块,记录模块和图片模块。几个模块数据类组成了一个模块类。如在日志模块类里有热门日志,最新日志,指定日志和高级自定义这些模块数据类。 举例而言,热门日志这个模块数据类来自block_bloghot.php文件。


在建造了模块数据类后,我们还应提供一个或几个模板(template)来显示这样的数据,这可以在管理中心的门户页上的模块模板里设置。注意这样的模是和一个模块类联系来一起的。所以虽然在定义模块数据类时,模块类似乎只是一个名字而已,在这里可以看出同一模块类下的各模块数据类应该提供同样类型的数据。一个模块类下有一个或几个模块数据类,和一个或几个模块模板。

注意在添加或修改了模块文件后,要去管理中心的管理中心的工具页上更新DIY 模块分类缓存。这样在定义模板时才能看到新的字段(field)。


当我们将一个模块类放到页面上去的时候,我们需要选择一个模块数据类作为数据来源和一个模板作为它的显示样式。

注意在添加或修改了模板后,界面上有可能并没立刻发生变化。这是因为模板数据是存在缓存里的。所以要去管理中心的工具页去更新模板缓存。


接下来介绍一下最新评论栏的具体做法。首先添加一个模块数据类的文件: source\class\block\space\block_commentnew.php。这文件里定义的类名应该和文件名相同,而且要扩展模块数据类的基类:

class block_commentnew extends discuz_block {在类的定义里要指明该模块数据类的名字:function name() { return '最新评论'; }和所属模块类的名字。这里第一个参数是该模块类的识别符,在不同的大分类里的模块类中不能有同样的识别符, 第二个参数是模块的名字。注意模块所属的模块大分类是由该文件的位置决定的。function blockclass() { return array('comment', '评论模块'); }
接下来我们要定义该模块数据类输出的数据样式,也就是要输出哪些字段(field)。
function fields() { return array( 'id' => array('name' => '评论ID', 'formtype' => 'text', 'datatype' => 'int'), 'title' => array('name' => '评论标题', 'formtype' => 'title', 'datatype' => 'title'), 'blogurl' => array('name' => '日志链接', 'formtype' => 'text', 'datatype' => 'string'), 'authorurl' => array('name' => '作者链接', 'formtype' => 'text', 'datatype' => 'string'), 'author' => array('name' => '作者', 'formtype' => 'text', 'datatype' => 'string'), 'time' => array('name' => '发布时间', 'formtype' => 'text', 'datatype' => 'string'), ); }一个模块应该是能反复使用的,所以应该提供一些能让使用者决定的设置。这里为说明概念起见,我们只提供一项设置:就是显示评论的前多少个字。function getsetting() { return array( 'titlelength' => array('title' => '显示长度', 'type' => 'text', 'default' => 40), );}最后就是如何从数据库里找到评论。所有的日志都存在home_blog表里,其中的friend列值为0意味着它是公开的日志,status列值为0意味着它通过了审核。所有的评论都存在home_comment表里,status列值为0意味着评论通过了审核。function getdata($style, $parameter) { $titlelength = $parameter['titlelength'] ? intval($parameter['titlelength']) : 40; $items = isset($parameter['items']) ? intval($parameter['items']) : 10; $list = array(); $sql = "SELECT c.cid, c.author, c.authorid, FROM_UNIXTIME(c.dateline, '%m/%d %H:%i') as time, c.message, b.uid, b.blogid FROM ".DB::table('home_comment')." c"; $sql = $sql." INNER JOIN ".DB::table('home_blog')." b ON c.id=b.blogid and b.friend = '0' and b.status = '0' "; $sql = $sql." WHERE c.status = '0'"; $sql = $sql." ORDER BY c.dateline DESC LIMIT 0, $items"; $query = DB::query($sql); while($data = DB::fetch($query)) { $list[] = array( 'id' => $data['cid'], 'title' => cutstr($data['message'], $titlelength, ''), 'fields' => array( 'blogurl' => 'home.php?mod=space&uid='.$data['uid'].'&do=blog&id='.$data['blogid'], 'authorurl' => 'home.php?mod=space&uid='.$data['authorid'], 'author' => $data['author'], 'time' => $data['time'], ) ); } return array('html' => '', 'data' => $list); }注意虽然我们前面只定义了一项设置,就是显示长度。但有一些设置是所有模块数据类共有的。如显示条数(items)。所以上面的代码里也检查了这项设置。

另外很重要的是,除个别字段外大多数字段要加在fields里面。据Discuz技术文库介绍“除 id,idtype, title, url, pic, picflag, summary 几个字段外,其它字段需要放到 fields 数组里”,不然这些字段的数值在将模块放入页面的设置完成后会消失。这样做的一个原因是前面那几个字段是所有模块都有的,在储存时他们的值也在数表 common_block 里各占据一个表列,而其余字段是各模块自己按需要定义的,他们的值合在一起储存在一个名叫 param 的表列里。

在管理中心的管理中心的工具页上更新DIY 模块分类缓存后,就可以在管理中心的门户页中的模块模板里为新的模块设置一个模块模板。

下面是我写的模板的具体内容:<div class="module cl"> <table style="border: solid lightgrey 1px; border-collapse: collapse;"> [loop] <tr><td style="border: dashed lightgrey 1px;"> <div>< a href="{authorurl}" target="_blank">{author}</a> <span style="margin-left: 10px;">{time}</span></div> <div>< a href="{blogurl}" target="_blank">{title}</a></div> </td></tr> [/loop] </table> </div>在管理中心的工具页更新模板缓存后,我们就可以去门户页将新的模块加入页面了。


这样我们就在门户页上添加了一个最新评论栏。点击某条评论就能进到包含该评论的日志里了。



参考资料: Discuz! 技术文库, 第三方DIY模块拓展类的开发



注:在本文中的代码中,在<符号和a字符相连的地方在两者之间加了一个不应该有的空格,以避免Discuz在保存日志时自动改变日志内容。
1

鲜花

真棒

玩闹

同情

看看

困惑

震惊

bad

刚表态过的朋友 (1 人)

发表评论 评论 (2 个评论)

回复 马力 2017-12-9 23:37
很多工作量,谢谢。这样会有更多人评论。
回复 admin 2017-12-9 23:39
马力: 很多工作量,谢谢。这样会有更多人评论。
嗯,这个工作很有意义。我以前在多维用过。

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 立即注册

Archiver|手机版|小黑屋|汉山网    

GMT-5, 2019-10-21 08:04 , Processed in 0.047314 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

返回顶部