23. Yii2如何重写Gii生成的列表页按钮

Gii默认生成的crud操作虽然简单,但是可定制的灵活性却没那么简便。如果默认的样式勉强够用,推荐使用gii生成,毕竟太便捷了。但是如果需要一些个性的可定制性,就得需要去了解很多额外的东西。这次我们讲解,如何重写默认生成的查看,编辑和删除操作按钮并新增按钮。

// 默认是不需要设置的,默认值是
[
    'class' => 'yii\grid\ActionColumn',
    'template' => '{view} {update} {delete}'
],

// 可以看到默认的实现方式是:
protected function initDefaultButtons()
{
    if (!isset($this->buttons['view'])) {
        $this->buttons['view'] = function ($url, $model, $key) {
            $options = array_merge([
                'class' => 'buttonViewLink',
                'title' => Yii::t('yii', '查看'),
                'aria-label' => Yii::t('yii', 'View'),
                'data-pjax' => '0',
            ], $this->buttonOptions);
            return Html::a('<span class="glyphicon glyphicon-eye-open"></span>', $url, $options);
        };
    }
}
// 即是使用Bootstrap的字体和样式实现的

因此就可以重写该类,覆盖原来的内容。因为常用的操作就这么多,修改默认样式和增加新按钮相对多些。比如不想用默认的图标,想改成汉字,比如”查看”, “编辑”, “删除”,则只需要改变return的行为就可以,

return Html::a('查看', $url, $options);

如果对框架没有严格的限制,可以直接修改框架源码,但一般不推荐修改框架底层的东西。

// 如果想增加按钮,比如"设置",则需要修改默认的模板,比如:
[
    'class' => 'admin\modules\temp\vendor\ActionColumn',  // 这个类就需要自己集成该类来实现了
    'template' => '{view} {update} {delete} {set}'
],

// 这个类的头部是这样写的:
class ActionColumn extends \yii\grid\ActionColumn
{
    // set 是你要新增的按钮
    public $template = '{view} {update} {delete} {set}';

    function __toString()
    {
        return $this->template;
    }

    public function init()
    {
        parent::init();
    }

    // 然后把默认的几个复制过来
    /**
     * Initializes the default button rendering callbacks.
     */
    protected function initDefaultButtons()
    {
        if (!isset($this->buttons['view'])) {
            $this->buttons['view'] = function ($url, $model, $key) {
                $options = array_merge([
                    'class' => 'buttonViewLink',
                    'title' => Yii::t('yii', '查看'),
                    'aria-label' => Yii::t('yii', 'View'),
                    'data-pjax' => '0',
                ], $this->buttonOptions);
                return Html::a('<span class="glyphicon glyphicon-eye-open"></span>', $url, $options);
            };
        }
        if (!isset($this->buttons['update'])) {
            $this->buttons['update'] = function ($url, $model, $key) {
                $options = array_merge([
                    'class' => 'buttonUpdateLink',
                    'title' => Yii::t('yii', '编辑'),
                    'aria-label' => Yii::t('yii', 'Update'),
                    'data-pjax' => '0',
                ], $this->buttonOptions);
                return Html::a('<span class="glyphicon glyphicon-pencil"></span>', $url, $options);
            };
        }
        if (!isset($this->buttons['delete'])) {
            $this->buttons['delete'] = function ($url, $model, $key) {
                $options = array_merge([
                    'class' => 'buttonDeleteLink',
                    'title' => Yii::t('yii', '删除'),
                    'aria-label' => Yii::t('yii', 'Delete'),
                    'data-confirm' => Yii::t('yii', '确定要删除该条记录吗?'),
                    'data-method' => 'post',
                    'data-pjax' => '0',
                ], $this->buttonOptions);
                return Html::a('<span class="glyphicon glyphicon-trash"></span>', $url, $options);
                //return Html::a('删除', $url, $options);
            };
        }

        // 然后在这里新增自己的自定义按钮
        if (!isset($this->buttons['set'])) {
            $this->buttons['set'] = function ($url, $model, $key) {
                $options = array_merge([
                    'title' => \Yii::t('yii', '设置'),
                    'aria-label' => \Yii::t('yii', 'Update'),
                    'data-pjax' => '0',
                    'class' => 'tags', // 还可以顺带自定义一些标签属性
                ], $this->buttonOptions);
                return Html::a('设置', $url, $options);
            };
        }
    }

    // 如此一来就达到了重写gii默认外观的目的。
}