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.
203 lines
6.3 KiB
203 lines
6.3 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 Yii;
|
|
use yii\helpers\Html;
|
|
use yii\helpers\Url;
|
|
use blobt\grid\Column;
|
|
|
|
class ActionColumn extends Column {
|
|
|
|
/**
|
|
* @var string 处理的控制器ID
|
|
*/
|
|
public $controller;
|
|
|
|
/**
|
|
* @var string 按钮模板
|
|
*/
|
|
public $template = '{view} {update} {delete}';
|
|
|
|
/**
|
|
* @var array 以按钮名为键,以匿名函数为值,通过匿名函数返回html,用来控制按钮的表现形式
|
|
* 匿名函数必须遵循以下申明方式:
|
|
*
|
|
* ```php
|
|
* function ($url, $model, $key) {
|
|
* // return the button HTML code
|
|
* }
|
|
* ```
|
|
*
|
|
* - `$url`: 按钮的跳转路径
|
|
* - `$model`: 每行的模型
|
|
* - `$key`: id值
|
|
*
|
|
* 使用案例:
|
|
* ```php
|
|
* [
|
|
* 'update' => function ($url, $model, $key) {
|
|
* return $model->status === 'editable' ? Html::a('Update', $url) : '';
|
|
* },
|
|
* ],
|
|
*
|
|
*/
|
|
public $buttons = [];
|
|
|
|
/** @var array 和上述$buttons功能类似,只是匿名函数返回布尔,只控制是否展示
|
|
* 匿名函数必须遵循以下申明方式:
|
|
*
|
|
* ```php
|
|
* function ($model, $key, $index) {
|
|
* return $model->status === 'editable';
|
|
* }
|
|
* ```
|
|
*
|
|
* 使用案例:
|
|
* ```php
|
|
* [
|
|
* 'update' => \Yii::$app->user->can('update'),
|
|
* ],
|
|
* ```
|
|
* @since 2.0.7
|
|
*/
|
|
public $visibleButtons = [];
|
|
|
|
/**
|
|
* @var callable 匿名函数,用作控制按钮Url
|
|
*
|
|
* 匿名函数必须遵循以下申明方式:
|
|
* ```php
|
|
* function (string $action, mixed $model, mixed $key, integer $index, ActionColumn $this) {
|
|
* //return string;
|
|
* }
|
|
* ```
|
|
*
|
|
* 如果没有设置,默认使用本类的[[createUrl()]].
|
|
*/
|
|
public $urlCreator;
|
|
|
|
/**
|
|
* @var array 按钮的html属性
|
|
*/
|
|
public $buttonOptions = [];
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
public function init() {
|
|
parent::init();
|
|
$this->initDefaultButtons();
|
|
}
|
|
|
|
/**
|
|
* 初始化默认按钮
|
|
*/
|
|
protected function initDefaultButtons() {
|
|
$this->initDefaultButton('view', 'eye-open');
|
|
$this->initDefaultButton('update', 'pencil');
|
|
$this->initDefaultButton('delete', 'trash', [
|
|
'alertify-confirm' => Yii::t('yii', 'Are you sure you want to delete this item?')
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* 初始化按钮
|
|
* @param string $name
|
|
* @param string $iconName
|
|
* @param array $additionalOptions 附加html属性
|
|
*/
|
|
protected function initDefaultButton($name, $iconName, $additionalOptions = []) {
|
|
if (!isset($this->buttons[$name]) && strpos($this->template, '{' . $name . '}') !== false) {
|
|
$this->buttons[$name] = function ($url, $model, $key) use ($name, $iconName, $additionalOptions) {
|
|
switch ($name) {
|
|
case 'view':
|
|
$title = Yii::t('yii', 'View');
|
|
break;
|
|
case 'update':
|
|
$title = Yii::t('yii', 'Update');
|
|
break;
|
|
case 'delete':
|
|
$title = Yii::t('yii', 'Delete');
|
|
break;
|
|
default:
|
|
$title = ucfirst($name);
|
|
}
|
|
$options = array_merge([
|
|
'title' => $title,
|
|
'aria-label' => $title,
|
|
'data-pjax' => '0',
|
|
], $additionalOptions, $this->buttonOptions);
|
|
$icon = Html::tag('span', '', ['class' => "glyphicon glyphicon-$iconName"]);
|
|
return Html::a($icon, $url, $options);
|
|
};
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 通过给定的action和model创建一个URL.
|
|
*
|
|
* @param string $action 按钮名
|
|
* @param \yii\db\ActiveRecordInterface $model 数据模型
|
|
* @param mixed $key 模型的ID
|
|
* @param int $index 行号
|
|
* @return string the created URL
|
|
*/
|
|
public function createUrl($action, $model, $key, $index) {
|
|
if (is_callable($this->urlCreator)) {
|
|
return call_user_func($this->urlCreator, $action, $model, $key, $index, $this);
|
|
}
|
|
|
|
$params = is_array($key) ? $key : ['id' => (string) $key];
|
|
$params[0] = $this->controller ? $this->controller . '/' . $action : $action;
|
|
|
|
return Url::toRoute($params);
|
|
}
|
|
|
|
/**
|
|
* {@inheritdoc}
|
|
*/
|
|
protected function renderDataCellContent($model, $key, $index) {
|
|
return preg_replace_callback('/\\{([\w\-\/]+)\\}/', function ($matches) use ($model, $key, $index) {
|
|
$name = $matches[1];
|
|
|
|
if (isset($this->visibleButtons[$name])) {
|
|
$isVisible = $this->visibleButtons[$name] instanceof \Closure ? call_user_func($this->visibleButtons[$name], $model, $key, $index) : $this->visibleButtons[$name];
|
|
} else {
|
|
$isVisible = true;
|
|
}
|
|
|
|
if ($isVisible && isset($this->buttons[$name])) {
|
|
$url = $this->createUrl($name, $model, $key, $index);
|
|
return call_user_func($this->buttons[$name], $url, $model, $key);
|
|
}
|
|
|
|
return '';
|
|
}, $this->template);
|
|
}
|
|
|
|
}
|