情况稍复杂,表头的列是动态的,且字段名称也不固定
思路:首先ajax获取表头及字段名称,拼接数组,传到前端
获取整体数据时按照表头列名赋值
例如我是将动态列设置为property_动态id的方式
具体代码:
(tp5实现)
ajax方法:
public function getDynamicHead(){
if(Request::isPost() && Request::isAjax()){
$courseId = Request::param('course_id');
$properties = Queryproperties::where('course_id',$courseId)->field('id,name')->select();
$header2 = array();
if(count($properties) > 0){
foreach ($properties as $k=>$v){
$header2[] = array(
'field'=> 'property_'.$v['id'],
'width'=> '100',
'title'=> $v['name'],
'align'=> 'center'
);
}
}
$header1 = array(
array('checkbox'=>true),
array('title'=>'序号','type'=>'numbers'),
array('field'=>'course_name','width'=>200,'title'=>'课程名称','align'=>'center'),
array('field'=>'uid','width'=>150,'title'=>'用户名','align'=>'center'),
array('field'=>'displayname','width'=>100,'title'=>'姓名','align'=>'center'),
);
$header3 = array(
array('field'=>'total','width'=>70,'title'=>'总分','align'=>'center'),
array('field'=>'notes','width'=>200,'title'=>'注释','align'=>'center'),
array('fixed'=>'right','width'=>200,'title'=>'操作','align'=>'center','toolbar'=>'#barTool'),
);
$dynamicHead = array_merge($header1,$header2,$header3);
return resMsg(1, array($dynamicHead), '');
}else{
return resMsg(-1, $this->_message['request_wrong'], '');
}
}
获取完整数据方法:
public function userResultList(){
// 搜索功能
$courseId = Request::param('course_id');
if (empty($courseId) ) {
$courseId = Db::name('query_course_notes')->order('id')->limit(1)->value('course_id');
}
$map[] = ['course_id', '=',$courseId];
$notes = Db::name('query_course_notes')->where($map)->select();
$userData = array();
$tablename = $this->getUserTablename($courseId); // 获取数据表名称
foreach ($notes as $k=>$v){
$total = 0;
$uid = $v['uid'];
$userData[$k]['uid'] = $uid;
$userData[$k]['course_name'] = getQueryCourseName($courseId);
$userData[$k]['displayname'] = getUserDisplayName($uid);
$userData[$k]['notes'] = $v['content'];
$userProperties = Db::name($tablename)->where('course_id',$courseId)->where('uid',$uid)->field('property_id,score')->select();
foreach ($userProperties as $kk=>$vv){
$total += $vv['score'];
$userData[$k]['property_'.$vv['property_id']] = $vv['score'];
}
$userData[$k]['total'] = (String)$total; // 总分
}
$result = array("code" => 0, "msg" => $this->_message['query_success'], "count" => 0, "data" => $userData);
return json($result);
}
前端:
let attrCols;
$.ajax({
url: '{:url("getDynamicHead")}',
type: 'POST',
dataType: 'json',
async: false,
data: {
course_id : courseId
},
success: function(res){
if (res.status == 1) {
attrCols = res.message;
}
}
});
table.render({
elem : '#dataTable'
,url : '{:url("userResultList")}'
,cellMinWidth: 80
,page: {
prev: '上一页',
next: '下一页',
layout: ['prev', 'page', 'next', 'skip', 'count', 'limit']
}
,limit: 20 //每页默认显示的数量
,toolbar: '#toolbar' // 指定顶部工具栏模板
,title: '课程数据' // 表格标题,用户导出数据文件名
,text: { // 指定无数据或数据异常时的提示文本
none: '暂无相关数据' //默认:无数据。注:该属性为 layui 2.2.5 开始新增
}
,id: 'dataTable'
,cols: attrCols
, done:function() {
// 搜索功能
var $ = layui.$, active = {
reload: function(){
var course_id = $('#course_id');
//执行重载
table.reload('dataTable', {
page: {
curr: 1 //重新从第 1 页开始
}
,where: {
keywords: keywords.val(),
gid: gid.val()
}
}, 'data');
$('#course_id').val(course_id.val());
bindTableToolbarFunction();
}
};
$('.search-btn').on('click', function(){
var type = $(this).data('type');
active[type] ? active[type].call(this) : '';
});
}
});
思路来源于以下链接分享:
https://blog.csdn.net/sinat_31986807/article/details/87007953
https://blog.csdn.net/u011456813/article/details/86484762
https://blog.csdn.net/qq_26814945/article/details/89356898
https://segmentfault.com/a/1190000038770849
https://blog.csdn.net/Rec_Mervyn/article/details/105367817
更多精彩内容:各种AI课程、技能课程、黑科技软件、网站小程序源码、副业小项目、PPT模板等精品素材、电商课程、推广引流课程等,尽在 天边资源网 。