在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查看