discuz 帖子模块用到的表及自动发帖函数

简介:

 最近在做一个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存放了对应板块的发帖数量,今日发帖数以及最近发帖的标题等信息。

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

  

复制代码
<?php
    if(!defined('IN_DISCUZ')) {
        exit('Access Denied');
    }
    echo "11111111111111111111111";
    require_once DISCUZ_ROOT . './source/class/class_core.php';
    $discuz = C::app();
    $discuz->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,如需转载请自行联系原作者
目录
相关文章
|
2月前
|
JavaScript 前端开发 Java
前端框架选择之争:jQuery与Vue在现代Web开发中的真实地位-优雅草卓伊凡
前端框架选择之争:jQuery与Vue在现代Web开发中的真实地位-优雅草卓伊凡
304 72
前端框架选择之争:jQuery与Vue在现代Web开发中的真实地位-优雅草卓伊凡
|
安全 Cloud Native Java
【云原生】五年博主教你用阿里云Serverless免费额度搞事情。
传统模式如果个人up主想要搞事情, 就要有一台服务器, 为了省钱可能你还会自己搭建一个数据库。其次你的流量还是需要付费的,如果个人用用还好,但是如果要被人攻击了。那流量蹭蹭的涨, 个人是完全受不了的。这点我是比较有发言权的。因为小编我目前就有一台阿里云实例。目前部署了mysql使用宝塔来维护。每次发布自己上传jar包。下面这个截图就是我的服务, 至于地址嘛,我就不给你们看了。(我怕你们偷我的流量),毕竟前有b站主播鱼皮,网站被攻击的先例,所以咱就低调点,自己用。
1893 0
【云原生】五年博主教你用阿里云Serverless免费额度搞事情。
|
算法 程序员 容器
工行银企互联接入详解(2)--下载证书
本文目录 1. 下载NC3.1 2. 启动NC 3. 进入下载证书页面 4. 配置参数 5. 下载证书 6. 其他
557 0
工行银企互联接入详解(2)--下载证书
|
自然语言处理 IDE 开发工具
通义灵码编程智能体上线,支持Qwen3模型
通义灵码最全使用指南,一键收藏。
128950 31
通义灵码编程智能体上线,支持Qwen3模型
|
JavaScript 计算机视觉
纯js实现人脸识别眨眨眼张张嘴案例——alive_face.js
纯js实现人脸识别眨眨眼张张嘴案例——alive_face.js
|
8月前
|
人工智能 数据可视化 机器人
【通义灵码】三句话生成P5.js粒子特效代码,人人都可以做交互式数字艺术
我发掘出的通义灵码AI程序员新玩法:三句话生成P5.js粒子特效代码,人人都可以做交互式数字艺术
289 6
|
11月前
|
存储 JavaScript 搜索推荐
Node框架的安装和配置方法
安装 Node 框架是进行 Node 开发的第一步,通过正确的安装和配置,可以为后续的开发工作提供良好的基础。在安装过程中,需要仔细阅读相关文档和提示,遇到问题及时解决,以确保安装顺利完成。
579 58
|
10月前
|
JavaScript 前端开发 测试技术
在 golang 中执行 javascript 代码的方案详解
本文介绍了在 Golang 中执行 JavaScript 代码的四种方法:使用 `otto` 和 `goja` 嵌入式 JavaScript 引擎、通过 `os/exec` 调用 Node.js 外部进程以及使用 WebView 嵌入浏览器。每种方法都有其适用场景,如嵌入简单脚本、运行复杂 Node.js 脚本或在桌面应用中显示 Web 内容。
562 15
在 golang 中执行 javascript 代码的方案详解
|
12月前
|
关系型数据库 MySQL 数据库
DZ社区 mysql日志清理 Discuz! X3.5数据库可以做定期常规清理的表
很多站长在网站日常维护中忽略了比较重要的一个环节,就是对于数据库的清理工作,造成数据库使用量增加必须多的原因一般有2个:后台站点功能开启了家园,此功能现在很少有论坛会用到,但是灌水机会灌入大量垃圾信息致使站长长时间未能发觉;再有就是程序默认的一些通知类表单会存放大量的、对于网站日常运行并无意义的通知信息。
338 2
|
数据库
Discuz!X3.5管理员前台正常后台登录不进去
Discuz!X3.5管理员前台正常后台登录不进如何解决 而且没反应 没报错 无提示?
288 0