You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

202 lines
6.1 KiB

<?php
/*
* The MIT License
*
* Copyright 2019 Blobt.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
namespace blobt\grid;
use Closure;
use yii\base\Model;
use yii\data\ActiveDataProvider;
use yii\data\ArrayDataProvider;
use yii\db\ActiveQueryInterface;
use yii\helpers\ArrayHelper;
use yii\helpers\Html;
use yii\helpers\Inflector;
/**
*
*
* @author Blobt
* @email 380255922@qq.com
* @created Aug 13, 2019
*/
class DataColumn extends Column {
/**
* @var string 本列需要显示的模型属性值,
* 如果设置了value,则会显示value。
*/
public $attribute;
/**
* @var string 列首的label。如果不设置,则会显示attribute关联的label
*/
public $label;
/**
* @var bool 是否需要html转义
*/
public $encodeLabel = true;
/**
* @var string|Closure 字符串或匿名函数.
*/
public $value;
/**
* @var string|array|Closure 每个数据模型的值应以哪种格式显示(例如“raw”`、“text”`、“html”`,`[date','php:y-m-d']`)。
* 默认格式为“文本”
*/
public $format = 'text';
/**
* @var bool 有时候我们记录数据时候,使用了整数值来代替字符,当此属性被设置成true时候,
* 会视图找到数值对应的字符,并显示出来
*/
public $showConstText = false;
/**
* @var bool 是否开始排序
*/
public $enableSorting = true;
/**
* @var bool 排序a标签的html属性
*/
public $sortLinkOptions = [];
/**
* @var bool 筛选表单单
*/
public $filter;
/**
* 初始化参数
*/
public function init() {
parent::init();
}
/**
* 渲染头单元.
*/
public function renderHeaderCell() {
return Html::tag('th', $this->renderHeaderCellContent(), $this->headerOptions);
}
/**
* {@inheritdoc}
*/
protected function renderHeaderCellContent() {
if ($this->header !== null || $this->label === null && $this->attribute === null) {
return parent::renderHeaderCellContent();
}
$label = $this->getHeaderCellLabel();
if ($this->encodeLabel) {
$label = Html::encode($label);
}
if ($this->attribute !== null && $this->enableSorting &&
($sort = $this->grid->dataProvider->getSort()) !== false && $sort->hasAttribute($this->attribute)) {
return $sort->link($this->attribute, array_merge($this->sortLinkOptions, ['label' => $label]));
}
return $label;
}
/**
* {@inheritdoc]
*/
protected function getHeaderCellLabel() {
$provider = $this->grid->dataProvider;
if ($this->label === null) {
if ($provider instanceof ActiveDataProvider && $provider->query instanceof ActiveQueryInterface) {
/* @var $modelClass Model */
$modelClass = $provider->query->modelClass;
$model = $modelClass::instance();
$label = $model->getAttributeLabel($this->attribute);
} elseif ($provider instanceof ArrayDataProvider && $provider->modelClass !== null) {
/* @var $modelClass Model */
$modelClass = $provider->modelClass;
$model = $modelClass::instance();
$label = $model->getAttributeLabel($this->attribute);
} else {
$models = $provider->getModels();
if (($model = reset($models)) instanceof Model) {
/* @var $model Model */
$label = $model->getAttributeLabel($this->attribute);
} else {
$label = Inflector::camel2words($this->attribute);
}
}
} else {
$label = $this->label;
}
return $label;
}
/**
* 返回单元格值
* @param mixed $model
* @param mixed $key 模型ID
* @param int $index 行号
* @return string
*/
public function getDataCellValue($model, $key, $index) {
if ($this->value !== null) {
if (is_string($this->value)) {
return ArrayHelper::getValue($model, $this->value);
}
return call_user_func($this->value, $model, $key, $index, $this);
} elseif ($this->attribute !== null) {
$val = ArrayHelper::getValue($model, $this->attribute);
if ($this->showConstText) {
$constArrKey = Inflector::variablize($this->attribute, '_');
if (isset($model::$$constArrKey)) {
$val = $model::$$constArrKey[$val];
}
}
return $val;
}
return null;
}
/**
* {@inheritdoc}
*/
protected function renderDataCellContent($model, $key, $index) {
if ($this->content === null) {
return $this->grid->formatter->format($this->getDataCellValue($model, $key, $index), $this->format);
}
return parent::renderDataCellContent($model, $key, $index);
}
}