最近在做一个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)进行分割,获取插件名。如果无法获取插件名,则无法调用相应的模板,因而也就调用默认的系统模板了。

discuz 帖子模块用到的表及自动发帖函数的更多相关文章

  1. JavaWeb_(SSH论坛)_五、帖子模块

    基于SSH框架的小型论坛项目 一.项目入门 传送门 二.框架整合 传送门 三.用户模块 传送门 四.页面显示 传送门 五.帖子模块 传送门 六.点赞模块 传送门 七.辅助模块 传送门 回复帖子 分析回 ...

  2. 第三百零七节,Django框架,models.py模块,数据库操作——表类容的增删改查

    Django框架,models.py模块,数据库操作——表类容的增删改查 增加数据 create()方法,增加数据 save()方法,写入数据 第一种方式 表类名称(字段=值) 需要save()方法, ...

  3. phalcon:整合官方多模块功能,方便多表查询

    phalcon:整合官方多模块功能,方便多表查询 项目分为: namespace Multiple\Backend; namespace Multiple\Frontend; 目录结构如下: publ ...

  4. 五 Django框架,models.py模块,数据库操作——表类容的增删改查

    Django框架,models.py模块,数据库操作——表类容的增删改查 增加数据 create()方法,增加数据 save()方法,写入数据 第一种方式 表类名称(字段=值) 需要save()方法, ...

  5. Python进阶----pymysql模块的使用,单表查询

    Python进阶----pymysql模块的使用,单表查询 一丶使用pymysql ​   ​   1.下载pymysql包: pip3 install pymysql ​​   ​   2.编写代码 ...

  6. python xlrd 模块(获取Excel表中数据)

    python xlrd 模块(获取Excel表中数据) 一.安装xlrd模块   到python官网下载http://pypi.python.org/pypi/xlrd模块安装,前提是已经安装了pyt ...

  7. [MySQL数据库之Navicat.pymysql模块、视图、触发器、存储过程、函数、流程控制]

    [MySQL数据库之Navicat.pymysql模块.视图.触发器.存储过程.函数.流程控制] Navicat Navicat是一套快速.可靠并价格相当便宜的数据库管理工具,专为简化数据库的管理及降 ...

  8. 你真的会玩SQL吗?表表达式,排名函数

    你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...

  9. MS SQL Server中数据表、视图、函数/方法、存储过程是否存在判断及创建

    前言 在操作数据库的时候经常会用到判断数据表.视图.函数/方法.存储过程是否存在,若存在,则需要删除后再重新创建.以下是MS SQL Server中的示例代码. 数据表(Table) 创建数据表的时候 ...

随机推荐

  1. 设计模式原来如此-代理模式(Proxy Pattern)

    代理模式(Proxy Pattern)是一个使用率非常高的模式,其定义如下:为其他对象提供一种代理以控制对这个对象的访问. 在某些情况下,一个客户不想或者不能直接引用另一个对象,而代理对象可以在客户端 ...

  2. Spring Boot - fish

    1. @RestController combines @Controller and @ResponseBody, 这是不是意味着不用再import jakson的包(@ResponseBody时用 ...

  3. UVa 437 The Tower of Babylon

    Description   Perhaps you have heard of the legend of the Tower of Babylon. Nowadays many details of ...

  4. SQL增加、删除、更改表中的字段名

    1. 向表中添加新的字段 ) not null 2. 删除表中的一个字段 delete table table_name column column_name 3. 修改表中的一个字段名 alter ...

  5. Nagios配置和命令介绍(二 )

    Nagios配置 Nagios 主要用于监控一台或者多台本地主机及远程的各种信息,包括本机资源及对外的服务等.默认的Nagios 配置没有任何监控内容,仅是一些模板文件.若要让Nagios 提供服务, ...

  6. linux c学习笔记----进程创建(fork,wait,waitpid)

    1.pid_t fork(); (1)当一个进程调用了fork 以后,系统会创建一个子进程.这个子进程和父进程不同的地方只有他的进程ID 和父进程ID,其他的都是一样.就象符进程克隆(clone)自己 ...

  7. mvc 简单笔记

    ---恢复内容开始--- 入口文件 index.php 唯一的一个让浏览器直接请求的脚本文件 控制器 协调模型和试图 模型 提供数据 保存数据 数据的验证 试图 只负责显示 <?php $c = ...

  8. WinForm AutoComplete 输入提示、自动补全

    一.前言 又临近春节,作为屌丝的我,又要为车票发愁了.记得去年出现了各种12306的插件,最近不忙,于是也着手自己写个抢票插件,当是熟悉一下WinForm吧.小软件还在开发中,待完善后,也写篇博客与大 ...

  9. LINUX的两种后门总结(suid shell与inetd)

    前提: 你现在已经是root用户, 想留一个后门以便日后再一次进入. 系统环境:  1 dawg:~# uname -a 2 Linux dawg 2.4.20-1-386 #3 Sat Mar 22 ...

  10. Java操作Excel(读、写、搜索关键字、插入图片)

    import java.io.File; import java.io.IOException; import jxl.Cell; import jxl.Sheet; import jxl.Workb ...