博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
discuz 帖子模块用到的表及自动发帖函数
阅读量:7222 次
发布时间:2019-06-29

本文共 5256 字,大约阅读时间需要 17 分钟。

 最近在做一个discuz的插件,由于需要程序自动生成并调用discuz已经存在插件的帖子。然而这就相当于自动发帖的功能了。网上找了一下,大部分都是通过curl模拟登陆,模拟发帖的,这显然不满足我的要求。如果采用这种方式既笨重又麻烦。百度了一通,没发现好的结果。于是google了一番,最后找到一个类似的方法。经过一番整理,于是有了下面这个函数。

  discuz帖子模块用到的表:

    帖子表:pre_forum_post

    帖子表pid最大值设置表:pre_forum_post_tableid

    帖子列表表:pre_forum_thread

    帖子所在板块表:pre_forum_forum

  这几个表之间的关系是,帖子表pre_forum_post存放帖子的详细信息,其pid通过pre_forum_post_tableid表获得。帖子列表pre_forum_thread表决定了该条记录是否显示在列表中,如果此表中没有相应的记录帖子也就无法显示在列表中了。帖子所在板块表pre_forum_forum存放了对应板块的发帖数量,今日发帖数以及最近发帖的标题等信息。

  好了,了解了这几张表之间的关系后有了下面这个函数和测试例子。

  

cachelist = $cachelist; $discuz->init(); $subject = '自行写入帖子'; $message = '自行写入帖子的消息消息消息'; $thread['fid'] = 86; $thread['subject'] = $subject; $thread['message'] = $message; $thread["authorid"]= 1; $thread["author"]=$_G['member'][username]; $tid = addThread($thread); echo "*********** $tid **************"; /* * 添加帖子 * @data 帖子数组 * array('fid' => '板块ID', 'subject' => '标题', 'message' => '具体内容', 'authorid' => '用户ID', 'author' => '用户名'); */ function addThread($data){ $fid = $data['fid']; $subject = $data['subject']; $message = $data['message']; $authorid = $data['authorid']; $author = $data['author']; $proc_time = time(); $thread['fid'] = $fid;//板块ID $thread['subject'] = $subject;//标题 $thread["authorid"]= $authorid; $thread["author"]= $author; $thread["dateline"]= $proc_time; $thread["lastpost"]= $proc_time; $thread["lastposter"]= $author; //插件必须添加special参数,否则无法按照插件的样式进行显示 $thread["special"]= 127;//特殊主题,1:投票;2:商品;3:悬赏;4:活动;5:辩论贴;127:插件相关 $tid=C::t('forum_thread')->insert($thread, 1);//添加到帖子列表 if($tid){ $post["tid"] = $tid; $post['fid'] = $fid; $post["position"]= 1; $post["smileyoff"]= "-1"; $post["bbcodeoff"]= "-1"; $post["usesig"]= 1; $post["author"]= $author; $post["authorid"]= $authorid; $post["subject"]= $subject; $post["message"]= $message . chr(0).chr(0).chr(0) . "online_alipay";//结尾一定要加chr(0).chr(0).chr(0) . "online_alipay"结尾,否则无法调用插件的模板。 $post["dateline"]= $proc_time; $post["first"]= 1; $pid = C::t('forum_post_tableid')->insert(array('pid' => null), true);//添加pre_forum_post表的pid最大值 $post["pid"]= $pid; $okid=C::t('forum_post')->insert("0", $post, 1);//写入帖子 $lastpost = $tid . "$subject" . $proc_time . $author; $sql = "update " . DB::table('forum_forum') . " set threads = threads + 1, todayposts = todayposts + 1, lastpost = '$lastpost' where fid= $fid";//修改今日主题和帖子数量 DB::query($sql); } return $tid; }?>

  addThread参数需要提供几个必要的参数板块ID、标题、用户名、用户ID和消息内容。如果你想往哪个板块自动生成一个帖子,尽管调用addThread函数即可。

  如果是插件这里有个需要特别注意的地方

1、forum_thread表,必须将special字段的值设为127($thread["special"]= 127;) 2、forum_post表的message字段。如果你的是插件的话,最后面一定要加上
chr(0).chr(0).chr(0) . "插件名称"

  否则,插件的模板将无法调用。这是为什么呢?这涉及到discuz插件模板设计的问题。

  原因分析:

   ./source/module/forum/forum_viewthread.php,大概700行左右,有这么一段

if($_G['forum_thread']['special'] > 0 && (empty($_GET['viewpid']) || $_GET['viewpid'] == $_G['forum_firstpid'])) {    $_G['forum_thread']['starttime'] = gmdate($_G['forum_thread']['dateline']);    $_G['forum_thread']['remaintime'] = '';    switch($_G['forum_thread']['special']) {        case 1: require_once libfile('thread/poll', 'include'); break;        case 2: require_once libfile('thread/trade', 'include'); break;        case 3: require_once libfile('thread/reward', 'include'); break;        case 4: require_once libfile('thread/activity', 'include'); break;        case 5: require_once libfile('thread/debate', 'include'); break;        case 127:            if($_G['forum_firstpid']) {                $sppos = strpos($postlist[$_G['forum_firstpid']]['message'], chr(0).chr(0).chr(0));                $specialextra = substr($postlist[$_G['forum_firstpid']]['message'], $sppos + 3);                $postlist[$_G['forum_firstpid']]['message'] = substr($postlist[$_G['forum_firstpid']]['message'], 0, $sppos);                if($specialextra) {                    if(array_key_exists($specialextra, $_G['setting']['threadplugins'])) {                        @include_once DISCUZ_ROOT.'./source/plugin/'.$_G['setting']['threadplugins'][$specialextra]['module'].'.class.php';                        $classname = 'threadplugin_'.$specialextra;                        if(class_exists($classname) && method_exists($threadpluginclass = new $classname, 'viewthread')) {                            $threadplughtml = $threadpluginclass->viewthread($_G['tid']);                            //var_dump($post['message']);                        }                    }                }            }            break;    }}

  原因就出在这。

  1、special为127是才执行插件的内容

  2、由于插件有很多,真么知道是哪个插件呢?因此,请看这行

    $sppos = strpos($postlist[$_G['forum_firstpid']]['message'], chr(0).chr(0).chr(0));

  discuz采用了chr(0).chr(0).chr(0)进行分割,获取插件名。如果无法获取插件名,则无法调用相应的模板,因而也就调用默认的系统模板了。

本文转自秋楓博客园博客,原文链接:http://www.cnblogs.com/rwxwsblog/p/4759775.html,如需转载请自行联系原作者
你可能感兴趣的文章
Oracle查看和修改连接数(进程/会话/并发等等)
查看>>
【SpringMVC学习06】SpringMVC中的数据校验
查看>>
Laravel错误与日志处理
查看>>
微信小程序开发教程第七章:微信小程序编辑名片页面开发
查看>>
Java并发编程:Java ConcurrentModificationException异常原因和解决方法
查看>>
浅谈iOS中MVVM的架构设计
查看>>
node.js 中模块的循环调用问题详解
查看>>
ActiveReports 报表应用教程 (6)---分组报表
查看>>
OLEDB操作Excel
查看>>
struts2的json-default和struts-default的区别
查看>>
java中<> 的用法
查看>>
IIS 下配置无后缀的URL ReWrite
查看>>
对Asp.net Mvc 和 jQuery UI使用者的一些忠告
查看>>
Silverlight开发历程—动画(实现跑马灯效果)
查看>>
怎么说???
查看>>
[原]Windows批处理命令学习一
查看>>
AaronYang风格 C语言挑讲[一][基本入门]
查看>>
【oneday_onepage】——The Secret Of Steve<1>
查看>>
javascript基于原型的语言的特点
查看>>
我的爱情1
查看>>