子体文件结构:
子体是放在XConvertk/data目录下的一个子文件夹.子体文件夹内包括三种规范化的文件:
1. config.php 子体配置文件
$program_author = 'COMSENZ';//子体作者,可以签上你的大名:)
$last_modified_time = '2007-07-10 18:22';//最后更新时间
$source_ver = 'LeadBBS v3.14 Access';//子体转换源对像及版本说明,在转换程序运行时会显示 $source_ver => $discuz_ver .
$source_dbtype = 'mssql';//标识源对象的数据库类型,目前仅支持 mysql, mssql(MS SQL SERVER), access
$discuz_ver = 'Discuz! 6.0'; //Discuz!版本说明.
$operations = array( //本数组对应子体的步骤文件.
'1'=>'转换会员数据', //对应step_1.php
'2'=>'转换版区数据', //对应step_2.php
'序号'=>'转换步骤', //对应step_序号.php
);
$checkchar = '版块表名(不带前缀),版块名称字段' 原论坛有汉字的表及它的字段,用于查看字符集设置是否正确
$extsettings = array( //定制转换时的用户配置项,在配置页面会追加显示后面.子体可以随时通过变量名称调用.
'1'=>array('变量名称', '配置项标题', '配置项说明文字','默认值')
);
$invaliddata = array( //用来提示用户有哪些不能转换的数据
'不能转换的数据1', '不能转换的数据2');
$afterconvert = "<li>第一条提示信息</li><li>第二条提示信息</li>";//用来提示用户转换后应该做哪些特殊的操作,如移动文件目录
$loggingfilename = '';//需要替换的 logging 文件名,留空为 logging.php;如果是 Discuz! 的可以留空
2. function.php 子体定制函数包
此文件存放除通用函数外的子体函数,此类函数名称不能与通用函数重名.此文件已经在主体中自动加载,编写子体时无需再次加载.
3. step_x.php
此类文件需要跟据转换步骤对应添加,是真正的转换程序体. X 的值对应着config.php中$operations数组中的键值.
子体开发细节:
一般的论坛转换到Discuz!最基本的数据包括 会员, 论坛版块, 主题, 贴子, 附件 和 短消息 .子体程序中用到的函数请参考通用函数库. 建议大家在编写子体时不要修改Discuz!的表结构.
子体代码从上到下大致可分为四段:
A.转换初始化
1.初始化比较简单,主要是在转换某步之前清空一下Discuz!对应的数据表(如:truncatetable('表名') )
2.获取源表的最大最小ID值(如:validid('字段名','表名') ),得到最大最小ID主要是为了控制分批转换一个大表时的开始和结束.论坛版块转换果可以不用这么做,因为论坛版块表一般都比较小,一次性转换速度也会很快.
B.读取源论坛数据
用$db['source']->query()查询源数据表.
$db['source']是XConvert主体生成的$db类,$db['source']已经根据用户配制的源数据库信息建立好了链接.子体中直接使用$DB类下相应的方法就可以了.
注意三种数据库mysql, mssql, access 请选择与源数据库对应的方法.
C.格式化数据
本段把读到的源论坛的数据格式化后附值给变量.
格式化是把源数据通过函数修改或替换成Discuz!格式的数据.(如: 会员户名称\主题标题的长度判断,贴子内容的UBB代码替换,日期时间等...)
D.写入Discuz!数据库
$db['discuz']->query()
$db['discuz']是XConvert主体生成的$db类,$db['discuz']已经根据用户配制的Discuz!数据库信息建立好了链接.子体中直接使用$DB类下相应的方法就可以了.
请选用mysql类的方法,$db['discuz']是固定的mysql数据库链接,在这里无需考虑数据类型.
需要说明的三条语句:
$convertedrows ++; //成功转换的记录数,会由主体写到转换报告中.
$totalrows ++; //需要转换的记录数,会由主体写到转换报告中.
$converted = 1;//转换过程标记,如果不定义这个变量那么主体会认为单个转换步聚转换已经结束. 注意,需要分批转换的时候这条语句是必需的.
请跟据以上说明仔细阅读现有子体.
小技巧:当你自己编写子体的时候,可以从现有子体中复制相应转换步骤的代码,之后对读取数据和格式化数据进行修改就基本可以了.(注意,数据库的类型相同的话修改起来会更加简单)
|