discuz二次开发,分析和实现 之 向dz数据库插入自己的帖子吧
发个博客太麻烦了,难怪写博客的越来越少,吐一下,cnblogs的编辑器模板太丑!
最近开发社区 需要采集一些数据,使得模板输出有图文效果。就写了个简单的采集脚本,爬取目标站的内容,(用php 下载图片 处理起来比较麻烦)。
有了数据 就要插入到dz的数据库 ,随便命名一个 test.php 放在discuz 的web根目录下。
操作一下 花了点功夫,中间有不少头疼的时候。特记录。
两个注意点,
一 ,Discuz的帖子 存储在帖子表 pre_forum_post ,message 字段,这里的图片 和换行 之类都是 bbcode, 插入之前需要先转换
二,Discuz 本身处理发帖的代码 位于\source\class\model\model_forum_thread.php,要使用里面的 方法 先要在test.php 引入discuz的核心类
require_once './source/class/class_core.php';
C::app()->init(); // 一定要初始化一下,否则 model_forum_thread.php 里的方法 无法使用
Discuz 作为一个老牌社区 有近300个表,实现帖子数据插入比较复杂。
刚开始,百度了一下,找到一篇文章记录,感觉比较靠谱。
引用一下:
discuz发表主题涉及的几个表:(这里列出了主要的几个相关的表)
1、主题表 pre_forum_thread:这个表一个主要数据就是 tid 主题ID
2、post 分表协调表 pre_forum_post_tableid:这里需要获取一个自增的 pid
3、帖子表 pre_forum_post :记录主题pid、fid、tid、title、content等主要信息
4、版块表 pre_forum_forum:这里主要更新版块的主题、帖子数量
5、帖子主题审核数据表 pre_forum_thread_moderate:这个可以根据自己状况决定,并不是必须的
6、用户统计表 pre_common_member_count:主要是更新用户的主题数量
感谢不知名的作者菌,刚搞的时候可以参考,毕竟300 个表里找几个具体的 也费功夫呢。
另有 http://discuzt.cr180.com/discuzcode-db.html cr180 discuz 二开大牛 提供的 数据库字典 对数据表 有详细索引。
直接上代码段 ,这个在我的本地环境是可以成功插入帖子数据的。
require_once './source/class/class_core.php';
C::app()->init();
$param=array(
'fid'=>2, //分类id
'uid'=>1, // 发布者的 id
'subject' =>'文章标题333',
'author' => '大哥哥',
'message'=>'内容位置,实现插入',
'publishdate' =>TIMESTAMP,
'views' =>168,
'tstatus' =>32,
'tags'=>array('good','cool'),
'useip' => getglobal('clientip'),
'port' => getglobal('remoteport')
);
//print_r($newImgSrc);
function dzThread($param){
$newthread = array(
'fid' => $param['fid'],// 文章分类板块
'author' => $param['author'],
'authorid' =>$param['uid'],
'subject' => $param['subject'],
'dateline' => $param['publishdate'],
'lastpost' => $param['publishdate'],
'lastposter' => $param['author'],
'attachment' => 0,
'views' =>$param['views'],
'status' => $param['tstatus'],
'closed' => $param['closed'] ? 1 : 0
);
$tid = C::t('forum_thread')->insert($newthread, true);
C::t('forum_newthread')->insert(array(
'tid' => $tid,
'fid' => $param['fid'],
'dateline' => $param['publishdate'],
));
//处理 tags
$param['tagstr'] = addTag($param['tags'], $tid, 'tid');
$pid = insertpost(array(
'fid' => $param['fid'],
'tid' => $tid,
'first' => '1',
'author' => $param['author'],
'authorid' => $param['uid'],
'subject' => $param['subject'],
'dateline' => $param['publishdate'],
'message' => $param['message'],
'useip' => $param['clientip'],
'port' => $param['remoteport'],
'usesig' => 1,
'attachment' => '0',
'tags' => $param['tagstr'],
'replycredit' => 0,
'status' => 0
));
}
function insertpost($data) {
if(isset($data['tid'])) {
$thread = C::t('forum_thread')->fetch($data['tid']);
$tableid = $thread['posttableid'];
} else {
$tableid = $data['tid'] = 0;
}
echo $data['tid'];
$pid = C::t('forum_post_tableid')->insert(array('pid' => null), true);
echo '116';
$data = array_merge($data, array('pid' => $pid));
C::t('forum_post')->insert($tableid, $data);
if($pid % 1024 == 0) {
C::t('forum_post_tableid')->delete_by_lesspid($pid);
}
savecache('max_post_id', $pid);
return $pid;
}
// discuz 的tag 处理比较麻烦
function addTag($tagarray, $itemid, $idtype = 'tid'){
$tagcount = 0;
$return='';
foreach($tagarray as $tagname) {
$tagname = trim($tagname);
if(preg_match('/^([\x7f-\xff_-]|\w|\s){3,20}$/', $tagname)) {
$status = $idtype != 'uid' ? 0 : 3;
$result = C::t('common_tag')->get_bytagname($tagname, $idtype);
if($result['tagid']) {
if($result['status'] == $status) {
$tagid = $result['tagid'];
}
} else {
$tagid = C::t('common_tag')->insert($tagname,$status);
}
if($tagid) {
if($itemid) {
C::t('common_tagitem')->replace($tagid,$itemid,$idtype);
}
$tagcount++;
$return .= $tagid.','.$tagname."\t";
}
if($tagcount > 4) {
unset($tagarray);
break;
}
}
}
return $return;
}
呵呵哒,结合采集代码 给$param数组 传数据 就可以了。
discuz二次开发,分析和实现 之 向dz数据库插入自己的帖子吧的更多相关文章
- discuz二次开发技巧
discuz二次开发技巧 二次开发大多时候知识设置和处理,如果能够获知模板文件获得的变量数组将大大提高我们的开发效率 获取页面已经定义的变量 <--{eval printf_r(get_defi ...
- discuz 二次开发
discuz 框架也算是比较流行的社区论坛框架,discuz 的基础架构采用世界上最流行的 web 编程组合 PHP + MySQL 实现,是一个经过完善设计,适用于各种服务器环境的高效论坛系统解决方 ...
- Discuz二次开发手册
Discuz文件说明,有助于discuz爱好者,进行自己的开发,在这里提供方便 admincp.php——后台系统设置主程序文件,一般只处理菜单的显示的访问权限,不处理管理控制. ajax.php—— ...
- discuz二次开发笔记(三)------discuz的安装步骤
下载好discuz的安装包后,解压在自己定义的文件夹里面,将upload里面的文件拷贝出来放到和upload同级的地方,然后删除upload文件夹. 打开浏览器,输入你文件夹的地址:如:http:// ...
- discuz二次开发笔记(二)------跳转函数运用
前几天在增加修改功能时,突然用到一个提示函数,有点不理解,看了他的由来后果断做下笔记,感觉这在以后的开发中肯定还是要用的上的.有些地方不是很理解,在以后慢慢纠正.查补. Htm页面中用的js跳转: $ ...
- discuz二次开发笔记(一)------$_G全解析
$_G 保存了 Discuz! 中所有的预处理数据缓存能够很好的提高程序的性能,一些配置数据没必要每次都查询数据库,只要在修改了的时候更新下缓存即可.Discuz! 中所有的缓存保存在 $_G[cac ...
- discuz二次开发之后导航无法高亮 $mnid == $nav[navid]解决办法(转)
在 <body>前面加入如下代码:body原来就有一个class,直接在增加一个进行测试 <!--{eval $mnid = getcurrentnav()}--> <! ...
- 在discuz二次开发模板时,diy编辑显示我“抱歉,您没有权限添加此模块
<div id="diy_vk_portal_slide_top" class="area"><div id="frameCRxR0 ...
- ECShop二次开发指南(一)
ECSHOP是一套完整的网络商店解决方案,包括前台的商品展示.购物流程和强大易用的后台管理.由于 ecshop简单易用,使用者几乎可以在3几分钟简单的设置一下就可以拥有一个网上商店系统,所以很多的B2 ...
随机推荐
- 采用TCP协议实现PIC18F97J60 ethernet bootloader
了解更多关于bootloader 的C语言实现,请加我QQ: 1273623966 (验证信息请填 bootloader),欢迎咨询或定制bootloader(在线升级程序). TCP/IP Stac ...
- 移动端自动化环境搭建-Appium Client的安装和AppiumLibrary库的安装
A.安装依赖 appium client是配合原生的webdriver来使用的(特别是用java而不用maven的同学),因此二者必须配合使用缺一不可. B.安装过程 1.在线安装 pip insta ...
- 关键字sizeof---常年被人误认为函数
sizeof 是关键字不是函数, sample: int i=0; A) sizeof(int); B) sizeof(i); C)sizeof int; D)sizeof i; C) ...
- JVM配置
1.堆设置 JVM中最大堆大小有三方面限制:操作系统位数(32-bt还是64-bit)限制:可用虚拟内存限制:系统的可用物理内存限制. java -Xmx3550m -Xms3550m -Xmn2g ...
- mongo group by
mongo的写法与mysql等sql有着天壤之别,如最近在统计爬虫抓取的数据,其中一个就是按字段从大到小取前十个: sql写法:select count(id) from invest group b ...
- 聊聊python 2中的编码
为什么需要编码: 计算机可以存储和处理二进制,那么从文字到计算机可以识别的二进制之间需要对应的关系,于是便有了ASCII,ASSCII使用7位字符,由于1byte=8bit,所以最高位补一个0,使用8 ...
- 一个简单的零配置命令行HTTP服务器
http-server 是一个简单的零配置命令行HTTP服务器, 基于 nodeJs. 如果你不想重复的写 nodeJs 的 web-server.js, 则可以使用这个. 安装 (全局安装加 -g) ...
- SpreadJS电子表格
SpreadJS是wijmo旗下的一款HTML5电子表格控件. 官方网址:http://wijmo.com/products/spreadjs/ 在这里简单整理了SpreadJS几个比较简单的特点,如 ...
- 对于那本--你必须知道的499个C语言问题--总结
(1)1.3 (2)1.10没看懂 (3)1.11和1.12都讲到了 静态变量和局部变量,那么这两个是啥啊,我不懂: (4)1.13针对那两个字符串定义为啥有问题,不懂 (5)2.8是做什么的 ( ...
- redis make时 提示 zmalloc.h:50:31: error: jemalloc/jemalloc.h:
redis安装需要环境必备 gcc 但是若未先安装好gcc,make失败后再次 make 会提示如下错误 zmalloc.h:50:31: error: jemalloc/jemalloc.h: 这时 ...