columns = [
* 'USER_ID' => null,
* 'USER_NAME' => [
* 'header' => '会员编号',
* 'headerOther' => ['width' => '150'],
* ],
* 'IS_DEC' => [
* 'header' => '是否报单中心',
* 'value' => function($row) {
* return (new YesNo([
* 'value' => $row['IS_DEC'],
* ]))->result();
* },
* 'show' => function($row) {
* return '
列表展示的值结果
';
* }
* 'headerOther' => function($row) {
* return [
* 'width' => '120',
* 'tag'=>['type'=>$row['IS_DEC'] ? 'success' : 'info', 'size' => 'small']
* ];
* },
* ],
* ]
* @method getFilterTypes
*/
class DataList extends Model
{
/**
* 导出
* @var bool
*/
public $isExport = false;
/**
* 列表当前页码
* @var null
*/
protected $page = null;
/**
* 列表每页数量
* @var int
*/
protected $pageSize = 0;
/**
* 列表查询条件
* @var string
*/
protected $condition = '';
/**
* 列表查询条件参数
* @var array
*/
protected $params = [];
/**
* 列表查询其他参数
* @var array
*/
protected $others = [];
/**
* 列表数据
* @var
*/
protected $listData;
/**
* 列表字段限制条件
* @var
*/
protected $columns;
/**
* 用于筛选的字段
* @var
*/
protected $filterTypes;
/**
* 主要是给导出时候的表头使用
* @var array
*/
protected $headers = [];
/**
* 主要是给页面输出是展示用的就是columns去掉value的结果,让vue方便循环表头和表头样式
* @var array
*/
protected $columnsShow = [];
/**
* 主要是给前端的筛选类型
* @var array
*/
protected $filterTypesShow = [];
/**
* 获取列表
* @param null $params
* @return mixed
* @throws Exception
*/
public function getList($params = null){
if($params !== null) {
$this->prepare($params);
}
// 获取数据
$this->dataHandle();
// 获取列信息
$this->getColumn();
// 获取筛选字段的信息,用于前端筛选
if(!$this->isExport){
$this->getFilterTypes();
}
// 利用权限处理掉不需要的字段(只需要从$this->columns中去掉就可以)
$userId = isset($params['userId']) && $params['userId'] ? $params['userId'] : null;
$this->permissionColumn($userId);
// 处理数据
$this->_formatDataByColumn();
return $this->listData;
}
/**
* 获取导出用到的列标题
* @param $userId
* @return array
* @throws Exception
*/
public function getExportHeaders($userId){
if(!$this->headers && $this->isExport){
$this->getColumn();
// 利用权限处理掉不需要的字段(只需要从$this->columns中去掉就可以)
$this->permissionColumn($userId);
foreach($this->columns as $hk => $column){
if(is_string($column)){
$this->headers[] = Tool::textConvert($column);
} elseif(is_array($column)) {
if(!isset($column['header'])){
throw new Exception('column数组中必须存在header');
}
if(isset($column['hidden'])&&$column['hidden']) continue;
if(is_callable($column['header'])){
$header = $column['header']([]);
} else {
$header = $column['header'];
}
$this->headers[] = Tool::textConvert($header);
} elseif (is_callable($column)) {
$this->headers[] = Tool::textConvert($column([]));
}
}
}
return $this->headers;
}
/**
* 获取全部列及列名,主要用于后台权限的筛选
* @return array
* @throws Exception
*/
public function getAllColumnHeaderName(){
$result = [];
foreach($this->getColumn() as $hk => $column){
if(is_string($column)){
$result[] = [
'header' => $column,
'index' => $hk,
];
} elseif(is_array($column)) {
if(!isset($column['header'])){
throw new Exception('column数组中必须存在header');
}
//if(isset($column['hidden'])&&$column['hidden']) continue;
if(is_callable($column['header'])){
$header = $column['header']([]);
} else {
$header = $column['header'];
}
$result[] = [
'header' => $header,
'index' => $hk,
];
} elseif (is_callable($column)) {
$result[] = [
'header' => $column([]),
'index' => $hk,
];
}
}
return $result;
}
/**
* 整理参数
* @param $params
*/
protected function prepare($params){
$default = [
'condition' => '',
'params' => [],
'others' => [],
'page' => null,
'pageSize' => 0,
];
$params = Tool::deepParse($params ,$default);
$this->condition = $params['condition'];
$this->params = $params['params'];
$this->others = $params['others'];
$this->page = $params['page'];
$this->pageSize = $params['pageSize'];
}
/**
* 格式化输出的数据
* @throws Exception
*/
private function _formatDataByColumn(){
$data = [];
foreach($this->listData['list'] as $key=>$row){
foreach($this->columns as $hk => $column){
if(is_string($column)){
if($key == 0){
$this->headers[] = $this->isExport ? Tool::textConvert($column) : $column;
$this->columnsShow[] = [
'header' => $column,
'index' => $hk,
'other' => [],
];
if(isset($this->filterTypes[$hk])){
$this->filterTypesShow[$hk] = $this->filterTypes[$hk];
}
}
if($this->isExport){
$data[$key][$hk] = $row[$hk];
} else {
$data[$key][$hk] = [
'value' => $row[$hk],
'other' => [],
];
}
} elseif(is_array($column)) {
if(!isset($column['header'])){
//throw new Exception('column数组中必须存在header');
$this->addError('header', \Yii::t('ctx', 'columnArrayMustExistHeader')); // 提交场景不存在
return null;
}
if($key == 0){
if(!isset($column['hidden']) || !$column['hidden']){
if(is_callable($column['header'])){
$header = $column['header']($row);
} else {
$header = $column['header'];
}
if(isset($column['headerOther'])){
if(is_callable($column['headerOther'])){
$headerOther = $column['headerOther']($row);
} else {
$headerOther = $column['headerOther'];
}
} else {
$headerOther = [];
}
$this->headers[] = $this->isExport ? Tool::textConvert($header) : $header;
$this->columnsShow[] = [
'header' => $header,
'index' => $hk,
'other' => $headerOther,
];
}
if(isset($this->filterTypes[$hk])){
$this->filterTypesShow[$hk] = $this->filterTypes[$hk];
}
}
if(isset($column['hidden'])&&$column['hidden']) continue;
// 如果是回调函数,则直接调用回调函数,否则直接赋值
$tempValue = null;
if(!isset($column['value'])){
$tempValue = $row[$hk];
} else {
if(is_callable($column['value'])){
$tempValue = $column['value']($row);
} else {
$tempValue = $column['value'];
}
}
if(!$this->isExport && isset($column['showValue'])){
if(is_callable($column['showValue'])){
$tempValue = $column['showValue']($row);
} else {
$tempValue = $column['showValue'];
}
}
if(!isset($column['valueOther'])){
$tempListValueOther = [];
} else {
if(is_callable($column['valueOther'])){
$tempListValueOther = $column['valueOther']($row);
} else {
$tempListValueOther = $column['valueOther'];
}
}
if($this->isExport){
$data[$key][$hk] = $tempValue;
} else {
$data[$key][$hk] = [
'value' => $tempValue,
'other' => $tempListValueOther,
];
}
} elseif (is_callable($column)) {
if($key == 0){
$this->headers[] = $this->isExport ? Tool::textConvert($column($row)) : $column($row);
$this->columnsShow[] = [
'header' => $column($row),
'index' => $hk,
'other' => [],
];
if(isset($this->filterTypes[$hk])){
$this->filterTypesShow[$hk] = $this->filterTypes[$hk];
}
}
if($this->isExport){
$data[$key][$hk] = $row[$hk];
} else {
$data[$key][$hk] = [
'value' => $row[$hk],
'other' => [],
];
}
} elseif ($column === null){
// 这种直接加入到list中,但是header和columns里面没有
if(!$this->isExport){
$data[$key][$hk] = $row[$hk];
}
}
}
}
$this->listData['listName'] = $this->getListName();
$this->listData['list'] = $data;
if($this->isExport){
$this->listData['headers'] = $this->headers;
} else {
if(empty($this->listData['list'])){
$this->getShowHeaders();
}
$this->listData['columnsShow'] = $this->columnsShow;
$this->listData['filterTypes'] = $this->filterTypesShow;
}
unset($data);
}
/**
* 列表为空时需要调用此方法获取一下显示给前端的表头
* @throws Exception
*/
public function getShowHeaders(){
foreach($this->columns as $hk => $column){
if(is_string($column)){
$this->headers[] = Tool::textConvert($column);
if(isset($this->filterTypes[$hk])){
$this->filterTypesShow[$hk] = $this->filterTypes[$hk];
}
} elseif(is_array($column)) {
if(!isset($column['header'])){
throw new Exception('column数组中必须存在header');
}
if(isset($column['hidden'])&&$column['hidden']) continue;
if(is_callable($column['header'])){
$header = $column['header']([]);
} else {
$header = $column['header'];
}
if(isset($column['headerOther'])){
if(is_callable($column['headerOther'])){
$headerOther = $column['headerOther']([]);
} else {
$headerOther = $column['headerOther'];
}
} else {
$headerOther = [];
}
$this->columnsShow[] = [
'header' => $header,
'index' => $hk,
'other' => $headerOther,
];
if(isset($this->filterTypes[$hk])){
$this->filterTypesShow[$hk] = $this->filterTypes[$hk];
}
} elseif (is_callable($column)) {
$this->columnsShow[] = [
'header' => $column([]),
'index' => $hk,
'other' => [],
];
if(isset($this->filterTypes[$hk])){
$this->filterTypesShow[$hk] = $this->filterTypes[$hk];
}
}
}
}
/**
* 按照权限处理哪些字段显示哪些字段不显示
* @param null $userId
* @throws Exception
*/
protected function permissionColumn($userId = null){
return ;
$allRole = AdminRole::getFromCache();
if($userId === null){
$roleId = \Yii::$app->user->userInfo['roleId'];
} else {
$admin = Admin::findOneAsArray('ID=:ID', [':ID'=>$userId]);
if(!$admin){
//throw new Exception('管理员不存在');
$this->addError('admin', \Yii::t('ctx', 'adminUserDoesNotExist')); // 提交场景不存在
return null;
}
$roleId = $admin['ROLE_ID'];
if(!$roleId){
//throw new Exception('管理组不存在');
$this->addError('roleid', \Yii::t('ctx', 'adminUserGroupDoesNotExist')); // 提交场景不存在
return null;
}
}
// 如果是超级管理员直接返回不做处理
if($roleId == \Yii::$app->params['superAdminRoleId']){
return ;
}
$role = isset($allRole[$roleId]) ? $allRole[$roleId] : null;
if($role){
$className = get_class($this);
$listModuleArr = explode('\\', $className);
$listModuleArrCount = count($listModuleArr);
$listModule = $listModuleArr[$listModuleArrCount-2].'/'.$listModuleArr[$listModuleArrCount-1];
// 把列里面没有的内容过滤掉
if($this->columns){
foreach($this->columns as $key=>$column){
if($column !== null){
if(!in_array($key, $role['COLUMN_PERMISSION'][$listModule])){
unset($this->columns[$key]);
// 把筛选里面没有的内容也过滤掉
if(isset($this->filterTypes[$key])) unset($this->filterTypes[$key]);
}
}
}
}
} else {
$this->columns = [];
}
}
}