yii学习笔记--- 无限极分类(yii2 - treegrid插件)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/weixin_41120504/article/details/85060263

composer安装yii2 - treegrid:composer require --prefer-dist leandrogehlen/yii2-treegrid "*"

或者在composer.json文件的require部分添加:"leandrogehlen/yii2-treegrid": "*"

手动添加插件

分类表:

DROP TABLE IF EXISTS `shop_category`;
CREATE TABLE `shop_category` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `cat_name` varchar(90) NOT NULL DEFAULT '' COMMENT '分类名称',
  `cat_desc` varchar(255) NOT NULL DEFAULT '' COMMENT '分类描述',
  `parent_id` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT '父ID',
  `sort_order` int(4) unsigned NOT NULL DEFAULT '50' COMMENT '显示排序,数字越大越后',
  `is_show` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '是否在前台显示 (0:显示 1:不显示)',
  `icon_url` varchar(255) NOT NULL COMMENT '图标地址',
  `show_in_nav` tinyint(1) DEFAULT '0' COMMENT '是否在导航栏显示(0:显示 1:不显示)',
  PRIMARY KEY (`id`),
  KEY `parent_id` (`parent_id`)
) ENGINE=MyISAM AUTO_INCREMENT=10008 DEFAULT CHARSET=utf8;

模型用gii生成

控制器:

public function actionIndex()
    {
        $query = Category::find();
        $dataProvider = new ActiveDataProvider([
            'query' => $query,
            'pagination' => false
        ]);

        return $this->render('index', [
            'dataProvider' => $dataProvider
        ]);
    }

视图:

use leandrogehlen\treegrid\TreeGrid;


<?= TreeGrid::widget([
    'dataProvider' => $dataProvider,
    'keyColumnName' => 'id',
    'parentColumnName' => 'parent_id',
    'parentRootValue' => '0', //first parentId value
    'pluginOptions' => [
        'initialState' => 'collapsed',
    ],
    'columns' => [
        'cat_name',
        'cat_desc',
        'parent_id',
        'cat_id',
        'sort_order',
        [
            'attribute' => 'is_show',
            'label' => '是否在前台显示',
            'value' => function($model) {
                return $model->show_in_nav == 1 ? "不显示" : "显示";
            },
            'headerOptions' => ['width' => '132']
        ],
        [
            'attribute' => 'show_in_nav',
            'label' => '是否在导航栏显示',
            'value' => function($model) {
                return $model->show_in_nav == 1 ? "不显示" : "显示";
            },
            'headerOptions' => ['width' => '132']
        ],
        [
            'header' => '操作',
            'class' => 'yii\grid\ActionColumn',
            'headerOptions' => ['width' => '100']
        ]
        
    ]
]); ?>

最后发现查看修改删除ID该列对应不上,重写\vendor\yiisoft\yii2\grid\ActionColumn中的renderDataCellContent,

再创建按钮时返回正确的id

在根目录创建common文件夹,在common中创建components文件夹,创建TreeColumn.php文件

TreeColumn.php:

<?php
namespace app\common\components;
use yii\helpers\Html;
use yii\helpers\Url;
use Yii;

class TreeColumn extends \yii\grid\ActionColumn {
    public $template = '{:view} {:update} {:delete}';
    /**
     * 重写了标签渲染方法。
     * @param mixed $model
     * @param mixed $key
     * @param int $index
     * @return mixed
     */
    protected function renderDataCellContent($model, $key, $index)
    {
        return preg_replace_callback('/\\{([^}]+)\\}/', function ($matches) use ($model, $key, $index) {

            list($name, $type) = explode(':', $matches[1].':'); // 得到按钮名和类型
            if($name == 'view'){
                $url = Yii::$app->request->hostInfo.'/product/'.$model->id.'.html';
                return call_user_func($this->buttons[$type], $url, $model, $key,$options=['target'=>'_blank']);

            }else{
                if (!isset($this->buttons[$type])) { // 如果类型不存在 默认为view
                    $type = 'view';
                }

                if ('' == $name) { // 名称为空,就用类型为名称
                    $name = $type;
                }

                $url = $this->createUrl($name, $model, $key, $index);

                return call_user_func($this->buttons[$type], $url, $model, $key);
            }

        }, $this->template);

    }
    /**
     * 方法重写,让view默认新页面打开
     * @return [type] [description]
     */
    protected function initDefaultButtons(){

        if (!isset($this->buttons['view'])) {
            $this->buttons['view'] = function ($url, $model, $key) {

                $options = array_merge([
                    'title' => Yii::t('yii', 'View'),
                    'aria-label' => Yii::t('yii', 'View'),
                    'data-pjax' => '0',
                    //'target'=>'_blank'
                ], $this->buttonOptions);
                return Html::a('<span class="glyphicon glyphicon-eye-open"></span>', '/category/view?id='.$model->id, $options);
            };
        }
        if (!isset($this->buttons['update'])) {
            $this->buttons['update'] = function ($url, $model, $key) {
                $options = array_merge([
                    'title' => Yii::t('yii', 'Update'),
                    'aria-label' => Yii::t('yii', 'Update'),
                    'data-pjax' => '0',
                ], $this->buttonOptions);
                return Html::a('<span class="glyphicon glyphicon-pencil"></span>', '/category/update?id='.$model->id, $options);
            };
        }
        if (!isset($this->buttons['delete'])) {
            $this->buttons['delete'] = function ($url, $model, $key) {
                $options = array_merge([
                    'title' => Yii::t('yii', 'Delete'),
                    'aria-label' => Yii::t('yii', 'Delete'),
                    'data-confirm' => Yii::t('yii', 'Are you sure you want to delete this item?'),
                    'data-method' => 'post',
                    'data-pjax' => '0',
                ], $this->buttonOptions);
                return Html::a('<span class="glyphicon glyphicon-trash"></span>', '/category/delete?id='.$model->id, $options);
            };
        }
    }
}
?>

视图中操作 'class' => 'yii\grid\ActionColumn', 改为 'class' => 'app\common\components\TreeColumn',

 yii开发笔记--- (yii2 - treegrid插件)分页

不用插件:无限极分类

猜你喜欢

转载自blog.csdn.net/weixin_41120504/article/details/85060263
今日推荐