在ECOS后台中内置了导入导出的功能
在系统中默认的导入导出的文件格式是.csv。如果需要扩增别的导出格式这可注册service进行
扩增,service的id为desktop_io
<service id="desktop_io">
<class>desktop_io_type_csv</class>
</service>
在ECOS系统中默认的内置的导出的是根据finder中的定义的model将数据库中的数据导出来。它导出的数据并不是finder中所看到的数据
ECOS中对导出的处理
/** end **/
if( method_exists($model,'fgetlist_'.$_POST['_io_type']) ){
/** 导出头部 **/
$oImportType->export_header( $data,$model,$_POST['_export_type'] );
while( $listFlag = $model->fgetlist_.'$_POST['_io_type']'($data,$_POST,$offset,$_POST['_export_type']) ){
$offset++;
}
$oImportType->export( $data,$offset,$model,$_POST['_export_type'] );
}else{
/** 导出头部 **/
$oImportType->export_header( $data,$model,$_POST['_export_type'] );
while( $listFlag = $oImportType->fgetlist($data,$model,$_POST,$offset,$_POST['_export_type']) ){
$offset++;
$oImportType->export( $data,$offset,$model,$_POST['_export_type'] );
}
}
在对应的model下面定义export_header方法可以定义导出的header,
可以参照系统默认的导出header,
function export_header(&$data,&$model,$exportType=1){
header("Content-Type: text/csv"); //定义csv格式
$filename = $data['name'].".csv"; //定义导出的名字
$encoded_filename = urlencode($filename);
$encoded_filename = str_replace("+", "%20", $encoded_filename);
$ua = $_SERVER["HTTP_USER_AGENT"];
if (preg_match("/MSIE/", $ua)) {
header('Content-Disposition: attachment; filename="' . $encoded_filename . '"');
} else if (preg_match("/Firefox/", $ua)) {
header('Content-Disposition: attachment; filename*="utf8\'\'' . $filename . '"');
} else {
header('Content-Disposition: attachment; filename="' . $filename . '"');
}
//header("Content-Disposition: attachment; filename=".$data['name'].'.csv');
header('Cache-Control:must-revalidate,post-check=0,pre-check=0');
header('Expires:0');
header('Pragma:public');
}
根据导出的类型,在对应的model中定义fgetlist_csv(默认的是fgetlist_csv,名字是根据导出的类型来定义的 fgetlist_.$_POST['_io_type'])。
来自己组织数据进行导出
function fgetlist_csv(&$data,$filter,$offset,$exportType=1){
//$filter finder中每条记录的主键ID对应的值 $filter = array('ID'=>array('0'=>1));
//因为所有导出的数据都是先放在内存中,在将数据导出。因此可以先把内存放大
/** 适当放大内存到512M **/
if ($offset == 0){
@ini_set('memory_limit','512M');
}
/** end **/
//需要导出的数据是放在$data中的 $data['title'] 存放导出的头部标题 数据$data['contents']--内容
return true;
}
在ECOS中导入使用了队列,导入默认只支持.csv格式的文件。另外导入需要在对应的model中自己解析数据,返回filter条件的格式
首先根据 prepared_import_csv_row 方法进行数据解析,这里接受到数据$row是导入地csv文件中一行一行的抛过来的
function prepared_import_csv_row($row,$title,&$Tmpl,&$mark,&$newObjFlag,&$msg){
if( substr($row[0],0,2) == 'ID' ){//判断是否是标题
$mark = 'title'; //定义这是标题信息
$newObjFlag = true;
foreach($row as $k=>$v){
$pnt2 = "/\((.+?)\)/";
if(preg_match($pnt2,$v,$match)){
$row[$k] = $match[1];
}
}
/*
返回的title数据
Array
(
[user_id] => 0
[user_name] => 1
[user_info] => 2
[user_time] => 3
[user_email] => 4
)
*/
return array_flip($row);
}else{
$mark = 'contents'; //定义这是数据内容
$newObjFlag = true;
/*
返回的数据格式
Array
(
[0] => 1
[1] => wuwei
[2] => wuei11
[3] =>
[4] => fasdf@q.c
)
*/
return $row;
}
}
prepared_import_csv_obj 方法,是根据解析过来的数据组成filter条件再返回出去,解析的数据也是一行一行的抛过来的
function prepared_import_csv_obj($data,&$mark,$Tmpl,&$msg = ''){
if( !$data['contents'] )return null;
$mark = 'contents';
$key = $data['title'];
$value = $data['contents'];
foreach($key as $k=>$v){
$return[$k] = $value[0][$v];
}
/*
返回$filter类型的数据
Array
(
[user_id] => 1
[user_name] => wuwei
[user_info] => wuei11
[user_time] =>
[user_email] => fasdf@q.c
)
*/
return $return;
}
在prepared_import_csv_row和prepared_import_csv_obj两个方法中,如果是直接断点输出则什么都不显示,如果要查看断点输出的值
1 可以在http header的响应中查看到所断点echo出来的值
2 可以使用error_log查看