fastadmin制作的插件增加数据导入方法

www.jswusn.com PHP 2024-06-28 15:17:36 30次浏览

1、在头部增加

use fastHttp;
use PhpOfficePhpSpreadsheetCellCoordinate;
use PhpOfficePhpSpreadsheetReaderCsv;
use PhpOfficePhpSpreadsheetReaderXls;
use PhpOfficePhpSpreadsheetReaderXlsx;


  2、文件末尾增加方法

/**
     * 表格导入数据
     * @return string|void
     * @throws Exception
     * Author: Wusn <958342972@qq.com>
     * DateTime: 2023/9/4 15:49
     */
    public function importf(){
        if($this->request->isPost()){
//            parent::import();
            $post = $this->request->post('row/a');
            $mid = $POST@['mid'];
            self::imports($mid);
        }else{
            $this->assign('download_template', url('ldcms/document/downloads'));

            $this_html = <<<html
<div class="form-inline">
        <div class="input-group">
          <input id="c-file" data-rule="required" class="form-control" size="50" name="file" type="text" value="" data-target="#msg-box">
          <div class="input-group-addon no-border no-padding">
            <span><button type="button" id="plupload" class="btn btn-danger plupload" data-input-id="c-file" data-url="ajax/upload" data-mimetype="xlsx,xls,csv" data-multiple="false"><i class="fa fa-upload"></i> 上传</button></span>
          </div>
          <sapn id="msg-box" class="msg-box n-right" for="c-file"></sapn>
        </div>
      </div>
html;
            return Form::instance()
                ->setFormItem('down', '模板', 'custom','',[
                    'extend_html'=>'<a href="'.url('ldcms/document/downloads').'" style="line-height: 34px; height: 34px;" target="_blank">点击下载</a>',
                    'value'=>'',
                ])
                ->setFormItem('mid', '模型', 'string', '', [
                    'class' => 'hidden',
                    'value' => $this->request->get('mid')
                ])
//                ->setFormItem('cid', '栏目', 'select', 'required', ['content_list' => $this->category_for_name,'extend_html'=>'data-live-search="true"'])

                ->setFormItem('import', '上传文件', 'custom','',[
                    'extend_html'=>$this_html,
                ])

                ->fetch();

//            return $this->view->fetch('import_file');
        }
    }

    /**
     * 下载模板文件
     * Author: Wusn <958342972@qq.com>
     * DateTime: 2023/8/29 17:51
     */
    public function downloads(){
//        $file = ROOT_PATH . 'public' . DS . 'assets' . DS . 'addons' . DS . 'ldcms' . DS . 'template.csv';
//        if (is_file($file)){
//            Http::sendToBrowser($file,false);
//        }else{
//            $this->error('文件不存在');
//        }

        /* 输入到CSV文件 */
        $html = "";

        /* 输出表头 */
        $filter = ['栏目','标题','内容','扩展字段1','扩展字段2'];

        foreach ($filter as $key => $title) {
            $html .= $title . "	,";
        }
        $html .= "
";

        /* 输出CSV文件 */
        header("Content-type:text/csv");
        header("Content-Disposition:attachment; filename=template.csv");
        echo $html;
        exit();
    }

    /**
     * 导入方法
     * @param $mid
     * @throws PDOException
     * @throws PhpOfficePhpSpreadsheetException
     * @throws 	hinkdbexceptionBindParamException
     * @throws 	hinkdbexceptionDataNotFoundException
     * @throws 	hinkdbexceptionModelNotFoundException
     * @throws 	hinkexceptionDbException
     * Author: Wusn <958342972@qq.com>
     * DateTime: 2023/9/4 15:57
     */
    protected function imports($mid)
    {
        $file = $this->request->request('file');
        if (!$file) {
            $this->error(__('Parameter %s can not be empty', 'file'));
        }
        $filePath = ROOT_PATH . DS . 'public' . DS . $file;
        if (!is_file($filePath)) {
            $this->error(__('No results were found'));
        }
        //实例化reader
        $ext = pathinfo($filePath, PATHINFO_EXTENSION);
        if (!in_array($ext, ['csv', 'xls', 'xlsx'])) {
            $this->error(__('Unknown data format'));
        }

//        halt($ext);
        if ($ext === 'csv') {
            $file = fopen($filePath, 'r');
            $filePath = tempnam(sys_get_temp_dir(), 'import_csv');
            $fp = fopen($filePath, 'w');
            $n = 0;
            while ($line = fgets($file)) {
                $line = rtrim($line, "

");
                $encoding = mb_detect_encoding($line, ['utf-8', 'gbk', 'latin1', 'big5']);
                if ($encoding !== 'utf-8') {
                    $line = mb_convert_encoding($line, 'utf-8', $encoding);
                }
                if ($n == 0 || preg_match('/^".*"$/', $line)) {
                    fwrite($fp, $line . "
");
                } else {
                    fwrite($fp, '"' . str_replace(['"', ','], ['""', '","'], $line) . ""
");
                }
                $n++;
            }
            fclose($file) || fclose($fp);

            $reader = new Csv();
        } elseif ($ext === 'xls') {
            $reader = new Xls();
        } else {
            $reader = new Xlsx();
        }

        //导入文件首行类型,默认是注释,如果需要使用字段名称请使用name
        $importHeadType = isset($this->importHeadType) ? $this->importHeadType : 'comment';


        $table = $this->model->getQuery()->getTable();

        $database = 	hinkConfig::get('database.database');
        $fieldArr = [];
        $list = db()->query("SELECT COLUMN_NAME,COLUMN_COMMENT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = ? AND TABLE_SCHEMA = ?", [$table, $database]);

        $add_field = array(
            ['COLUMN_NAME' => 'content', 'COLUMN_COMMENT' => '内容'],
            ['COLUMN_NAME' => 'cid', 'COLUMN_COMMENT' => '栏目'],
        );
        $list = array_merge($list, $add_field);

        //获取扩展字段
        $ext_field = ppdminmodelldcmsFields::instance()->where('mid', $mid)->select();
        $ext_arr = [];
        foreach ($ext_field as $k => $v) {
            $ext_arr[] = [
                'COLUMN_NAME' => $v['field'],
                'COLUMN_COMMENT' => $v['title']
            ];
        }
        $list = array_merge($list, $ext_arr);

        foreach ($list as $k => $v) {
            if ($importHeadType == 'comment') {
                $v['COLUMN_COMMENT'] = explode(':', $v['COLUMN_COMMENT'])[0]; //字段备注有:时截取
                $fieldArr[$v['COLUMN_COMMENT']] = $v['COLUMN_NAME'];
            } else {
                $fieldArr[$v['COLUMN_NAME']] = $v['COLUMN_NAME'];
            }
        }
//        dump($list);

        //对应栏目
        $category_arr = [];
        foreach ($this->categorys as $value){
            $category_arr[$value['id']] = $value['name'];
        }

        $category_arr_key = array_flip($category_arr);
//        dump($category_arr_key);

//        dump($category_arr);

        //加载文件
        $insert = [];
        try {
            if (!$PHPExcel = $reader->load($filePath)) {
                $this->error(__('Unknown data format'));
            }
            $currentSheet = $PHPExcel->getSheet(0);  //读取文件中的第一个工作表
            $allColumn = $currentSheet->getHighestDataColumn(); //取得最大的列号
            $allRow = $currentSheet->getHighestRow(); //取得一共有多少行
            $maxColumnNumber = Coordinate::columnIndexFromString($allColumn);
            $fields = [];
            for ($currentRow = 1; $currentRow <= 1; $currentRow++) {
                for ($currentColumn = 1; $currentColumn <= $maxColumnNumber; $currentColumn++) {
                    $val = $currentSheet->getCellByColumnAndRow($currentColumn, $currentRow)->getValue();
                    $fields[] = trim($val);
                }
            }
//dump($fields);
            for ($currentRow = 2; $currentRow <= $allRow; $currentRow++) {
                $values = [];
                for ($currentColumn = 1; $currentColumn <= $maxColumnNumber; $currentColumn++) {
                    $val = $currentSheet->getCellByColumnAndRow($currentColumn, $currentRow)->getValue();
                    $values[] = is_null($val) ? '' : trim($val);
                }
                $row = [];
                $temp = array_combine($fields, $values);
//                dump($temp);
                foreach ($temp as $k => $v) {
                    if(in_array($v,$category_arr) && $fieldArr[$k] == 'cid'){
                        $v = $category_arr_key[$v];

                    }
                    if (isset($fieldArr[$k]) && $k !== '') {

                        $row[$fieldArr[$k]] = $v;
                    }
                }
                if ($row) {
                    $row['mid'] = $mid;
                    $insert[] = $row;
                }
            }
        } catch (Exception $exception) {
            $this->error($exception->getMessage());
        }
        if (!$insert) {
            $this->error(__('No rows were updated'));
        }

//        halt($insert);

        //添加数据进数据库
        foreach ($insert as $key => $item) {
            $data = $item;
            $data['show_time'] = isset($data['show_time'])&&!empty($data['show_time']) ? $data['show_time'] : time();
//            dump($data);

            Db::startTrans();
            try {
                $res = $this->model::create($data, true);
                $id = $res->id;
                $content_data['content'] = $data['content'];
                /*数据写入content*/
                $content_data['id'] = $id;
//                dump($content_data);
                $this->model->saveContent($content_data);
                /*数据写入扩展表*/
                $extend_data = $data;
                $extend_data['id'] = $id;

                $this->model->savaExtend($this->extend_table_name, $extend_data);
                Db::commit();
            } catch (ValidateException | PDOException | Exception $e) {
                Db::rollback();
                $this->error($e->getMessage());
            }
        }

        $this->success();
    }


3、在语言包中增加

'Importf' => '导入数据',

4、在后台对应的模板文件中增加上上传按钮

{if $mid!=1}
<a class="btn btn-primary btn-customer-import {:$auth->check('ldcms/document/uploads')?'':'hide'}" data-params="mid={$mid}" title="{:__('Importf')}"><i class="fa fa-cloud-upload"></i> {:__('Importf')}</a>
{/if}

5、当前页面对应的js文件中增加以下代码

import_url: 'ldcms/document/importf',

在//为表格当定时间 上方添加以下代码

 // 导入数据
$(document).on('click', '.btn-customer-import', function () {
    var params = $(this).data('params');
    var options = table.bootstrapTable('getOptions');
    var url = options.extend.import_url+"?" + params;
    Fast.api.open(url, $(this).data("original-title") || $(this).attr("title") || __('Add'), $(this).data() || {});
    // Fast.api.open('ldcms/security/importf', '导入数据')
});

在edit:xxx 控制器方法中增加下方代码

importf:function () {
    Controller.api.bindevent();
},


注:上传excel文件时,有错误提示!请修改上传文件配置,需要将上传的文件类型后缀添加进去

修改文件 /application/extra/upload.php

修改第24行
/**
 * 可上传的文件类型
 */
'mimetype'  => 'jpg,png,bmp,jpeg,gif,webp,zip,rar,wav,mp4,mp3,webm,csv',


技术分享

苏南名片

  • 联系人:吴经理
  • 电话:152-1887-1916
  • 邮箱:message@jswusn.com
  • 地址:江苏省苏州市相城区

热门文章

Copyright © 2018-2024 jswusn.com 版权所有

技术支持:苏州网站建设  苏ICP备18036849号