导入导出

在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'] );
    }
}

修改导出heaer

在对应的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查看


沪ICP备05002918号

© 2003-2017 ShopEx,Inc.All rights reserved.