# 链式操作

# sheet

工作表

# 说明:

指定导入的excel的工作表。

# 方法:sheet($sheet)

  • 参数 sheet (必须)
    • 类型一:callable 闭包,例:

      sheet(function(YunjImport $builder){
          return ["Sheet1","Sheet2"];
      });
      
      • 参数:
        参数 类型 说明
        $builder YunjImport 当前导入构建器
    • 类型二:array,例:

      sheet(["Sheet1","Sheet2"]);
      
    • 类型三:...string

      sheet("Sheet1","Sheet2");
      

# 示例:

设置工作表包含一年级二年级三年级四年级。#### 方法如下

$builder=YI('demo')->sheet("一年级","二年级","三年级","四年级")

# cols

工作表表头(必须)

# 说明:

设置工作表表头。

# 方法:cols($cols)

  • 参数 cols (必须)
    • 类型一:callable 闭包,例:

      // sheet设置时$sheet为sheet值,其余情况为null
      cols(function(YunjImport $builder,$sheet){
          $cols=[
              'name'=>[
                  "title"=>'中文名',
                  "default"=>"小王",
                  "verify"=>"require|chs",
                  "desc"=>"必填,只能输入汉字",
              ],...
          ];
          return $cols;
      });
      
      • 参数:
        参数 类型 说明
        $builder YunjImport 当前导入构建器
    • 类型二:array,例:

      cols([
          'name'=>[
              "title"=>'中文名',
              "default"=>"小王",
              "verify"=>"require|chs",
              "desc"=>"必填,只能输入汉字",
          ],...
      ]);
      
      

# 表头单项配置

key 类型 是否必须 说明
title string 表头标题
default string 表头对应数据列默认值,默认为空字符串
verify string 表头数据验证,|间隔的验证规则,通用验证规则详见:通用验证规则 (opens new window)
desc string 描述

# 示例:

设置工作表一年级二年级三年级四年级的表头字段为:姓名性别年龄爱好简介。#### 方法如下:

$builder=YI('demo')
    ->sheets(["一年级","二年级","三年级","四年级"])
    ->cols(function(YunjImport $builder,$sheet){
        $cols=[
            'name'=>[
                "title"=>'姓名',
                "default"=>"小王",
                "verify"=>"require|chs",
                "desc"=>"必填,只能输入汉字",
            ],
            'sex'=>[
                "title"=>'性别',
                'default'=>'男',
                'verify'=>'require|in:男,女',
                "desc"=>"必填,男/女",
            ],
            'age'=>[
                "title"=>'年龄',
                'default'=>'18',
                'verify'=>'require|positiveInteger',
                "desc"=>"必填,正整数",
            ],
            'hobby'=>[
                "title"=>'爱好',
                'default'=>'阅读',
                'verify'=>'require|in:写作,阅读',
                "desc"=>"必填,写作/阅读",
            ],
            'intro'=>[
                "title"=>'简介',
                'default'=>'个人简介',
                'verify'=>'require',
                "desc"=>"必填,如:姓名、曾用名、出生日期、籍贯、出生地、民族、现有文化程度、家庭现住址、现在工作单位和担任的社会职务、有何专业技术职称等基本情况。",
            ],
        ];
        return $cols;
    })

# validate

工作表表头验证验证器

# 说明:

设置工作表表头验证验证器。在导入表单数据时,对预设验证规则的工作表表头字段数据进行验证。在设定的验证器中可以写字段自定义的验证#### 方法,也可对工作表表头字段数据进行进一步处理(handleData操作)。默认筛选表单字段验证器为 \yunj\core\Validate

# 方法:validate($validate)

  • 参数 validate (必须)

    • 类型一:callable 闭包

      validate(function(YunjImport $builder){
          // 返回`\yunj\core\Validate`或其子类的实例对象
          return new TestValidate();
          // 返回`\yunj\core\Validate`或其子类的全限定类名
          return \demo\validate\TestValidate::class;
      });
      
      • 参数:
        参数 类型 说明
        $builder YunjImport 当前导入构建器
    • 类型二:string

      // `\yunj\core\Validate`或其子类的全限定类名
      validate(\demo\validate\TestValidate::class);
      
  • 验证环境scene:

    • 导入构建器id+Row:数据导入验证每行数据时的验证环境 注意:$row["sheet"] 为当前验证数据行所在工作表,仅在sheet设置时存在。

# 示例:

导入产品数据:序列号(sn)名称(name)商户(mid)...

  • 验证器

    namespace app\demo\validate\product;
    
    final class Import extends \yunj\core\Validate {
    
        // 自定义验证#### 方法,校验序列号唯一性
        protected function snUnique($value,$rule = "",$data){
            $isExist = Db::name("product")->where("sn","=",$value)->select();
            if($isExist ) return "该序列号已存在";
            return true;
        }
    
        // scene场景 = 构建器ID + 链式操作首字母大写驼峰(注意:rows的验证场景 = 构建器ID+Row)
        protected function handleData(array &$data, $scene): void {
            switch ($scene) {
                case "DemoImportRow":
                    // $data为单行配置表头键值对数组
                    // 固定参数:工作表。仅在sheet设置时存在$data["sheet"]
                    $sheet = $data["sheet"];
                    // 校验商户有效性,并获取商户数据添加到验证数据里
                    $merchant = Db::name("merchant")->where("id","=",$data["mid"])->select();
                    if(!$merchant ) throw_error_json("商户数据错误");
                    $data["merchant_data"] = $merchant;
                    break;
            }
        }
    
    }
    
  • 导入构建器:

    $builder=YI('DemoImport')->cols(function(YunjImport $builder,$sheet){
            $cols=[
                'sn'=>['title'=>'序列号','verify'=>'require|snUnique'],
                'name'=>['title'=>'名称','verify'=>'require|checkSn','desc'=>'只能输入汉字'],
                'mid'=>['title'=>'商户','verify'=>'require|positiveInteger']
            ];
            return $cols;
        })
        ->validate(\app\demo\validate\product\Import::class)
        ->row(function(YunjImport $builder,$row){    // $sheet仅在sheet设置时存在其他情况为null
            $rowData = $row->getData();
            // 获取展商数据
            $merchant = $rowData["merchant_data"];
            // 业务处理...
        });
    

# templet

指定模板下载地址

# 说明:

指定的模板下载地址。不设置此项时,默认系统自动生成模板文件。不预设多行数据的情况下,不建议使用此操作。

# 方法:templet($templet)

  • 参数 templet (必须)
    • 类型一:callable 闭包,例:

      templet(function(YunjImport $builder){
          return 'http://xxx.com/xxx.xlsx';
      });
      
      • 参数:
        参数 类型 说明
        $builder YunjImport 当前导入构建器
    • 类型二:string,例:

      templet('http://xxx.com/xxx.xlsx');
      
      

# 示例:

设置指定的模板下载地址为 http://xxx.com/demo.xlsx

  • # 方法一

$builder=YI('demo')->templet('http://xxx.com/demo.xlsx');
  • # 方法二

$builder=YI('demo')->templet(function(){
    return 'http://xxx.com/demo.xlsx';
})

# limit

每次导入条数

# 说明:

指定每次请求导入数据的条数。默认20。

# 方法:limit($limit)

  • 参数 limit (必须)
    • 类型一:callable 闭包,例:

      limit(function(YunjImport $builder){
          return 20;
      });
      
      • 参数:
        参数 类型 说明
        $builder YunjImport 当前导入构建器
    • 类型二:int,例:

      limit(20);
      
      

# 示例:

设置每次导入条数为 10

  • # 方法一

$builder=YI('demo')->limit(10)
  • # 方法二

$builder=YI('demo')->limit(function(){
    return 10;
})

# tips

提示语

# 说明:

设置数据导入页面提示语。

# 方法:tips($tips)

  • 参数 tips (必须),例:
    • 类型一:callable 闭包,例:

      tips(function(YunjImport $builder){
          return ["提示一","提示二"];
      });
      
      • 参数:
        参数 类型 说明
        $builder YunjImport 当前导入构建器
    • 类型二:array,例:

      tips(["提示一","提示二"]);
      
    • 类型三:...string,例:

      tips("提示一","提示二");
      

# 示例:

设置数据导入页面提示语包含不能包含敏感词汇信息导入需等待审核。#### 方法如下:

$builder=YI('demo')->tips([
    "不能包含敏感词汇",
    "信息导入需等待审核",
])

# row

单行数据处理

# 说明:

导入单行数据的事件处理。数据量少推荐使用此#### 方法

注意:row 优先级大于 rows

# 方法:row($callable)

  • 参数 callable (必须),为 callable 闭包。
    row(function(YunjImport $builder,$row){...});
    
    • 参数:

      参数 类型 说明
      $builder YunjImport 当前导入构建器
      $row \yunj\core\control\import\YunjImportRow 当前数据行对象。

# 示例代码如下:

$builder=YI('demo')
    ->sheets(["一年级","二年级","三年级","四年级"])
    ->row(function (YunjImport $builder,$row){
        // 获取当前数据行工作簿
        $sheet = $row->getSheet();
        // 获取当前数据行数据
        $rowData = $row->getData();
        $data=[
            "grade"=>$sheet,
        ]+$rowData;
        $res=Db::name('example')->insertGetId($data);
        // 导入成功(可不设置,默认为成功)
        //$row->importSuccess();
        // 导入失败
        $row->importFail('...失败原因...');
        // 导入失败,具体字段错误设置
        $row->importFail(['sex'=>'性别错误']);
    })

# rows

多行数据处理

# 说明:

导入多行数据的事件处理。数据量多推荐使用此#### 方法

注意:rows 优先级小于 row

# 方法:rows($callable)

  • 参数 callable (必须),为 callable 闭包。
    rows(function(YunjImport $builder,$rows){...});
    
    • 参数:

      参数 类型 说明
      $builder YunjImport 当前导入构建器
      $rows array<\yunj\core\control\import\YunjImportRow> 当前导入的多行数据对象集合,详见示例代码。

# 示例代码如下:

$builder=YI('demo')
    ->sheets(["一年级","二年级","三年级","四年级"])
    ->rows(function (YunjImport $builder,$rows){
        $datas = [];
        // id 为导入数据行唯一标识
        for($rows as $row){
            // 当前导入数据行对应工作表。sheet设置时存在
            $sheet = $row->getSheet();
            // 当前导入数据行数据
            $rowData = $row->getData();
            $datas[] = ["grade"=>$sheet]+$rowData;
            // 导入成功(可不设置,默认为成功)
            //$row->importSuccess();
            // 导入失败
            $row->importFail('...失败原因...');
            // 导入失败,具体字段错误设置
            $row->importFail(['sex'=>'性别错误']);
        }
        Db::name('example')->insertAll($datas);
    })