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数组 传数据 就可以了。

时间: 2024-11-05 01:52:02

discuz二次开发,分析和实现 之 向dz数据库插入自己的帖子吧的相关文章

discuz二次开发技巧

二次开发大多时候知识设置和处理,如果能够获知模板文件获得的变量数组将大大提高我们的开发效率 获取页面已经定义的变量 <--{eval printf_r(get_defined_vars());}--> 获取页面定义的常量 <--{eval print_r(get_defined_constants(true));}--> discuz二次开发技巧,布布扣,bubuko.com

Discuz二次开发手册

Discuz文件说明,有助于discuz爱好者,进行自己的开发,在这里提供方便 admincp.php——后台系统设置主程序文件,一般只处理菜单的显示的访问权限,不处理管理控制. ajax.php——论坛模板的ajax 判断及数据返回都在这里进行 attachment.php——附件文件,仅仅处理附件下载的功能. announcement.php——论坛公告的显示,一般很少改 config.inc.php——配置论坛数据库.密码等信息,这个大家最熟悉了 discuz_version.php——论

discuz 二次开发

discuz 框架也算是比较流行的社区论坛框架,discuz 的基础架构采用世界上最流行的 web 编程组合 PHP + MySQL 实现,是一个经过完善设计,适用于各种服务器环境的高效论坛系统解决方案. 1.安装 discuz 先下载 discuz 的安装包,解压之后有3个文件,如下: 然后把 upload 文件夹(另两个文件不用管)移动到本地服务器主机文件夹里(比如 htdocs),把 upload 文件夹的名字改成项目名(比如 discuz),再在地址栏输入 http://localhos

discuz二次开发笔记(一)------$_G全解析

$_G 保存了 Discuz! 中所有的预处理数据缓存能够很好的提高程序的性能,一些配置数据没必要每次都查询数据库,只要在修改了的时候更新下缓存即可.Discuz! 中所有的缓存保存在 $_G[cache] 中$_G[member] 会员信息数据$_G[uid] 用户 uid$_G[username] 用户名$_G[adminid] 用户管理组 id$_G[groupid] 用户用户组 id$_G[settting] 设置数据$_G[cache] 系统缓存$_G[cache][plugin] 插

discuz二次开发笔记(二)------跳转函数运用

前几天在增加修改功能时,突然用到一个提示函数,有点不理解,看了他的由来后果断做下笔记,感觉这在以后的开发中肯定还是要用的上的.有些地方不是很理解,在以后慢慢纠正.查补. Htm页面中用的js跳转: $("#lyy_real").click(function(){ $.post("api/realnamechange.php", {uname:$("#uname").val(),uid:$("#uid").val(),realn

discuz二次开发笔记(三)------discuz的安装步骤

下载好discuz的安装包后,解压在自己定义的文件夹里面,将upload里面的文件拷贝出来放到和upload同级的地方,然后删除upload文件夹. 打开浏览器,输入你文件夹的地址:如:http://192.168.1.95:90/lyy/ 它会跳出如下界面: 点击下一步后,会出现 按图点击下一步 标红线的地方都是要自己定义的,必须根据自己的实际需求来改. 开始安装数据库 安装完成,这时候你就可以登录你刚才填写的那个帐号了.

在discuz二次开发模板时,diy编辑显示我“抱歉,您没有权限添加此模块

<div id="diy_vk_portal_slide_top" class="area"><div id="frameCRxR0M" class=" frame move-span cl frame-1"><div id="frameCRxR0M_left" class="column frame-1-c"><div id="fra

什么是php二次开发,怎么做php二次开发?

什么是php二次开发 所谓的二次开发,简单的说就是修改别人的东西,变成你想要的东西,插件基本属于高端了,根据现有的程序的不足,加以改进修饰,然后达到自己想要实现的功能和效果. 怎么做php二次开发 二次开发和一次开发不同的地方在于你是要先看懂别人的代码再去做,二次开发,首先你需要知道自己对什么程序进行二次开发,比如一些招聘信息上会写Discuz二次开发,ShopEX二次开发.这些都是对已经成型的程序进行的功能性扩展开发. 第一,你要有这个开 源 产 品的所用语言的语言基础,就是能看懂代码是最基本

ECMALL模板解析机制.MVC架构分析及文件目录说明.二次开发指南手册(转)

ECMALL模板解析语法与机制 http://www.nowamagic.net/architecture/archt_TemplateSyntaxAndAnalysis.php ECMALL模块开发指南 http://wenku.baidu.com/view/785b8a1ea76e58fafab003a6.html ECMall 结构图 http://wenku.baidu.com/view/3e9d9921bcd126fff7050b10.html ECMall 数据库表结构 全面讲解 h