add checkTableField function in csv-dataimport,perfection the processing interface
This commit is contained in:
parent
80ffd16e2e
commit
119978c5a0
|
@ -4267,18 +4267,30 @@ class Admin_DataController extends Zend_Controller_Action
|
||||||
|
|
||||||
//检查能否写入数据表
|
//检查能否写入数据表
|
||||||
if($ac == "checktables"){
|
if($ac == "checktables"){
|
||||||
|
$this->_helper->layout->disableLayout();
|
||||||
|
$this->_helper->viewRenderer->setNoRender();
|
||||||
|
|
||||||
$table = $this->_getParam('table');
|
$table = $this->_getParam('table');
|
||||||
if(empty($table)){
|
$schema = $this->_getParam('schema');
|
||||||
|
$file = $this->_getParam('file');
|
||||||
|
if(empty($table) || empty($schema) || empty($file)){
|
||||||
$this->_helper->json(['error'=>'參數錯誤']);
|
$this->_helper->json(['error'=>'參數錯誤']);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
$tableControl = new Visual\DataTableControl;
|
$tableControl = new Visual\DataTableControl;
|
||||||
$fields = $tableControl->readFields($table);
|
$fields = $tableControl->readFields($schema . "." .$table);
|
||||||
|
|
||||||
foreach($fields as $k=>$v){
|
$fileHandle = new Dataimport\File;
|
||||||
|
$realFile = $fileHandle->getRealName($file);
|
||||||
|
|
||||||
}
|
$processing = Dataimport\ProcessFactory::Bootstrap($fileHandle->getFileTextExt($file));
|
||||||
|
/** @var \Westdc\Dataimport\Processing\Csv $processing */
|
||||||
|
$processing->init($realFile);
|
||||||
|
|
||||||
|
$status = $processing->checkTableField($fields);
|
||||||
|
|
||||||
|
//$this->_helper->json($status);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,16 +36,21 @@ $this->headTitle()->setSeparator(' - ');
|
||||||
|
|
||||||
<h6 id="error-loading"></h6>
|
<h6 id="error-loading"></h6>
|
||||||
|
|
||||||
<form action="/admin/data/dataimport/ac/table" id="schema-form">
|
<form action="/admin/data/dataimport/ac/checktables" id="schema-form">
|
||||||
<input type="hidden" name="file" value="<?= $this->file ?>">
|
<input type="hidden" name="file" value="<?= $this->file ?>">
|
||||||
<input type="hidden" name="schema" value="">
|
<input type="hidden" name="schema" value="">
|
||||||
<input type="hidden" name="table" value="">
|
<input type="hidden" name="table" value="" id="input-table">
|
||||||
<button type="submit" id="ctl-next" class="btn btn-success disabled" disabled>下一步</button>
|
<button type="button" id="ctl-next" class="btn btn-success disabled" disabled>下一步</button>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<script>
|
<script>
|
||||||
$(document).ready(function(){
|
$(document).ready(function(){
|
||||||
|
|
||||||
|
$('#ctl-next').click(function(){
|
||||||
|
ctl.checkTable();
|
||||||
|
});
|
||||||
|
|
||||||
$('.ctl-schema-btn').click(function(){
|
$('.ctl-schema-btn').click(function(){
|
||||||
$('#schema-form input[name=schema]').val($(this).val());
|
$('#schema-form input[name=schema]').val($(this).val());
|
||||||
|
|
||||||
|
@ -56,21 +61,28 @@ $this->headTitle()->setSeparator(' - ');
|
||||||
'success':function(data){
|
'success':function(data){
|
||||||
if (data!=null)
|
if (data!=null)
|
||||||
{
|
{
|
||||||
|
if($.isEmptyObject(data))
|
||||||
|
{
|
||||||
|
ctl.disableNext();
|
||||||
|
alert("此数据库中尚无数据表");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
$('#table-list').html('<h5>选择数据表</h5>');
|
$('#table-list').html('<h5>选择数据表</h5>');
|
||||||
|
|
||||||
if(!$.isEmptyObject(data))
|
$.each(data,function(index,value){
|
||||||
{
|
$('#table-list').append('<label class="radio">'
|
||||||
$.each(data,function(index,value){
|
|
||||||
$('#table-list').append('<label class="radio">'
|
|
||||||
+ '<input type="radio" value="'+value.tablename+'" name="table" class="ctl-table-name">'
|
+ '<input type="radio" value="'+value.tablename+'" name="table" class="ctl-table-name">'
|
||||||
+ value.tablename
|
+ value.tablename
|
||||||
+"</label>"
|
+"</label>"
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
}
|
|
||||||
|
|
||||||
$('.ctl-table-name').click(function(){
|
$('.ctl-table-name').click(function(){
|
||||||
$('#schema-form input[name=table]').val($(this).val());
|
$('#schema-form input[name=table]').val($(this).val());
|
||||||
|
if($('#schema-form input[name=schema]').val() != '' && $('#schema-form input[name=table]').val() != '')
|
||||||
|
{
|
||||||
|
ctl.enableNext();
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
$('#clt-next').removeClass('disabled');
|
$('#clt-next').removeClass('disabled');
|
||||||
|
@ -102,11 +114,15 @@ $this->headTitle()->setSeparator(' - ');
|
||||||
$('#ctl-next').removeClass("disabled");
|
$('#ctl-next').removeClass("disabled");
|
||||||
$('#ctl-next').removeAttr("disabled");
|
$('#ctl-next').removeAttr("disabled");
|
||||||
},
|
},
|
||||||
checkTable : function(table){
|
disableNext : function(){
|
||||||
|
$('#ctl-next').addClass("disabled");
|
||||||
|
$('#ctl-next').attr("disabled","disabled");
|
||||||
|
},
|
||||||
|
checkTable : function(){
|
||||||
$.ajax({
|
$.ajax({
|
||||||
'type':"POST",
|
'type':"POST",
|
||||||
'url':'/admin/data/dataimport/ac/checktables',
|
'url':'/admin/data/dataimport/ac/checktables',
|
||||||
'data':'schema=' + $(this).val(),
|
'data':$('#schema-form').serialize(),
|
||||||
'success':function(data){
|
'success':function(data){
|
||||||
if (data!=null)
|
if (data!=null)
|
||||||
{
|
{
|
||||||
|
@ -119,10 +135,8 @@ $this->headTitle()->setSeparator(' - ');
|
||||||
},
|
},
|
||||||
'timeout': 30000,
|
'timeout': 30000,
|
||||||
'beforeSend' : function(){
|
'beforeSend' : function(){
|
||||||
$('#error-loading').html("正在加载数据表......");
|
$('#error-loading').html("正在校验数据是否可以导入......");
|
||||||
$('#error-loading').show();
|
$('#error-loading').show();
|
||||||
$('#table-list').html('');
|
|
||||||
$('.ctl-table-name').unbind();
|
|
||||||
},
|
},
|
||||||
'complete' : function(){
|
'complete' : function(){
|
||||||
$('#error-loading').hide();
|
$('#error-loading').hide();
|
||||||
|
|
|
@ -17,7 +17,7 @@ $theme->AppendPlus($this,"jquery-fileupload");
|
||||||
<label>上传文件,请选择Excel文件进行上传</label>
|
<label>上传文件,请选择Excel文件进行上传</label>
|
||||||
|
|
||||||
<span class="btn btn-success fileinput-button file-upload-ctls">上传文件<input id="fileupload" type="file" name="FileData"></span>
|
<span class="btn btn-success fileinput-button file-upload-ctls">上传文件<input id="fileupload" type="file" name="FileData"></span>
|
||||||
<a href="javascript:void(0);" class="btn btn-info" id="ctl-show-files">查看已上傳的文件</a>
|
<a href="javascript:void(0);" class="btn btn-info" id="ctl-show-files">查看已上传的文件</a>
|
||||||
<div class="progress" id="pdf-upload-progress" style="display: none;">
|
<div class="progress" id="pdf-upload-progress" style="display: none;">
|
||||||
<div class="progress-bar progress-bar-striped active" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 0%">
|
<div class="progress-bar progress-bar-striped active" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 0%">
|
||||||
</div>
|
</div>
|
||||||
|
@ -116,8 +116,8 @@ $theme->AppendPlus($this,"jquery-fileupload");
|
||||||
makeFileHtml : function(data){
|
makeFileHtml : function(data){
|
||||||
return '<div class="alert alert-success">'
|
return '<div class="alert alert-success">'
|
||||||
+ '<span class="ctl-files">'+data.file+'</span>'
|
+ '<span class="ctl-files">'+data.file+'</span>'
|
||||||
+ ' <a href="/admin/data/dataimport/ac/prepare/?file='+ encodeURI(data.file) +'">導入數據</a>'
|
+ ' <a href="/admin/data/dataimport/ac/prepare/?file='+ encodeURI(data.file) +'">导入数据</a>'
|
||||||
+ '<a href="javascript:void(0)" onclick="upload.delete(this,\''+data.file+'\')" class="pull-right">刪除</a>'
|
+ '<a href="javascript:void(0)" onclick="upload.delete(this,\''+data.file+'\')" class="pull-right">删除</a>'
|
||||||
+ "</div>";
|
+ "</div>";
|
||||||
},
|
},
|
||||||
makeFileList : function(data){
|
makeFileList : function(data){
|
||||||
|
@ -127,8 +127,8 @@ $theme->AppendPlus($this,"jquery-fileupload");
|
||||||
$.each(data,function(k,v){
|
$.each(data,function(k,v){
|
||||||
li.push('<div class="alert alert-success ctl-files">'
|
li.push('<div class="alert alert-success ctl-files">'
|
||||||
+ '<span class="ctl-files">'+v+'</span>'
|
+ '<span class="ctl-files">'+v+'</span>'
|
||||||
+ ' <a href="/admin/data/dataimport/ac/prepare/?file='+ encodeURI(v) +'">導入數據</a>'
|
+ ' <a href="/admin/data/dataimport/ac/prepare/?file='+ encodeURI(v) +'">导入数据</a>'
|
||||||
+ '<a href="javascript:void(0);" onclick="upload.delete(this,\''+v+'\')" class="pull-right">刪除</a>'
|
+ '<a href="javascript:void(0);" onclick="upload.delete(this,\''+v+'\')" class="pull-right">删除</a>'
|
||||||
+ "</div>");
|
+ "</div>");
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -16,8 +16,9 @@ class Csv implements ProcessingInterface{
|
||||||
private $csv_object;
|
private $csv_object;
|
||||||
private $csv_line_data;
|
private $csv_line_data;
|
||||||
|
|
||||||
const ERROR_INDEX_NOT_MATCHED = "值的個數於其它行不匹配";
|
const ERROR_INDEX_NOT_MATCHED = "值的个数于其它行不匹配";
|
||||||
const ERROR_INDEX_TYPE_DIFFERENT = "值的類型於上一行的類型不同";
|
const ERROR_INDEX_TYPE_DIFFERENT = "值的类型于上一行不同";
|
||||||
|
const ERROR_EMPTY_FILE = "文件是空的";
|
||||||
const ERROR_LINE_TITLE = "行:";
|
const ERROR_LINE_TITLE = "行:";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -109,6 +110,9 @@ class Csv implements ProcessingInterface{
|
||||||
|
|
||||||
$error_stack = [];
|
$error_stack = [];
|
||||||
|
|
||||||
|
if(!is_array($lines) || count($lines) < 1)
|
||||||
|
return [self::ERROR_EMPTY_FILE];
|
||||||
|
|
||||||
foreach($lines as $k=>$v){
|
foreach($lines as $k=>$v){
|
||||||
if($k < 1 || empty($v))
|
if($k < 1 || empty($v))
|
||||||
continue;
|
continue;
|
||||||
|
@ -135,5 +139,31 @@ class Csv implements ProcessingInterface{
|
||||||
}//checkRegularity()
|
}//checkRegularity()
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查字段是否对应
|
||||||
|
* @param $fields
|
||||||
|
* @return array|bool
|
||||||
|
*/
|
||||||
|
public function checkTableField(array $fields)
|
||||||
|
{
|
||||||
|
$error_stack = [];
|
||||||
|
|
||||||
|
$frist_line = $this->getLines()[0];
|
||||||
|
var_dump($fields);
|
||||||
|
|
||||||
|
foreach($fields as $index => $field)
|
||||||
|
{
|
||||||
|
if($field['data_type']){
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(0)
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return $error_stack;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
|
@ -16,4 +16,17 @@ interface ProcessingInterface {
|
||||||
*/
|
*/
|
||||||
public function init($file);
|
public function init($file);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查数据文件是否规整
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function checkRegularity();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 检查字段是否对应
|
||||||
|
* @param array $fields
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function checkTableField(array $fields);
|
||||||
|
|
||||||
}
|
}
|
|
@ -44,12 +44,12 @@ class DataTableControl extends Database{
|
||||||
return $rs->fetchAll(\PDO::FETCH_ASSOC);
|
return $rs->fetchAll(\PDO::FETCH_ASSOC);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function readFields($tablename)
|
public function readFields($tablename,$identity = "")
|
||||||
{
|
{
|
||||||
$st=explode('.',$tablename);
|
$st=explode('.',$tablename);
|
||||||
$sql = "select COLUMN_NAME from INFORMATION_SCHEMA.COLUMNS where table_schema='".$st[0]."' and TABLE_NAME='".$st[1]."'";
|
$sql = "select * from INFORMATION_SCHEMA.COLUMNS where table_schema='".$st[0]."' and TABLE_NAME='".$st[1]."'";
|
||||||
$rs = $this->db->query($sql);
|
$rs = $this->db->query($sql);
|
||||||
return $rs->fetchAll(\PDO::FETCH_COLUMN);
|
return $rs->fetchAll(\PDO::FETCH_ASSOC);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
Loading…
Reference in New Issue