改版:yii2 tree manger 結合girdview的使用方法

改版前網址:https://my.oschina.net/bubifengyun/blog/605908php

上文4、值得完善之處,發現有改進的可能。後來網站開發須要,有更多的一邊是樹形結構,一邊是表格的形式,用原來的方法,太過粗糙,固然本次改版,也沒有逃脫效率低下的困境,惟一的優點是代碼量大幅度降低,並且還不懼原來插件的更新。node

第十八章 treeview 跟 Gridview 的結合(改版)

參考資料:git

1、示例提供的安裝教程(前半部分)

若有不明白,能夠參照原教程的 1-3 點。github

一、安裝插件

composer require kartik-v/yii2-tree-manager "@dev"
composer require kartik-v/yii2-grid "@dev"

二、導入數據庫

php yii migrate/up --migrationPath=@vendor/kartik-v/yii2-tree-manager/migrations

解釋:web

  • 我是使用 XAMPP 開發的,使用 phpmyadmin 能夠更改這個數據庫,建議對這個 Tree 數據表添加你須要的屬性。

三、創建模型(model)

我是使用 gii 直接導入的這個模型(model),gii 生成後,把原始表的全部字段的驗證去掉(此處感謝26056-sjg20010414 )。須要把他的父類修改一下,數據庫

namespace common\models;

use Yii;

class Tree extends \kartik\tree\models\Tree
{
/*略*/
}

四、創建模塊(module)

'modules' => [
   'treemanager' =>  [
        'class' => '\kartik\tree\Module',
        // other module settings, refer detailed documentation
    ]
]

2、結合 GridView 的部分

使用 TreeView 插件,假設現有一個 Personinfo ,對應有 PersoninfoController 的動做,bash

/**
     * Every User take control of Out in special unit.
     * @return mixed
     */
    public function actionOut()
    {
        $see_unit = Yii::$app->user->identity->see_unit;
        $current_unit = Yii::$app->session->get('current_unit', 0);
        if ($current_unit === 0) {
            $current_unit = $see_unit;
        }
        if (Unit::findOne($see_unit) == null) {
            throw new NotFoundHttpException('請檢查你能夠查看的單位範圍');
        }
        // add children and itself.
        $query = Unit::findOne($see_unit)
            ->children()
            ->orWhere(['id' => $see_unit])
            ->addOrderBy('root, lft');

        return $this->render('out', [
            'query' => $query,
            'current_unit' => $current_unit,
        ]);
    }

下面說渲染的頁面 ./frontend/views/personinfo/out.php,代碼以下:yii2

<?php

use yii\helpers\Html;
use yii\helpers\Url;
use kartik\tree\TreeView;
use kartik\tree\Module;
use common\models\Unit;

/* @var $this yii\web\View */
/* @var $model common\models\Personinfo */

$this->title = '外出管理';
$this->params['breadcrumbs'][] = ['label' => '全部人員', 'url' => ['index']];
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="personinfo-view">

<?= TreeView::widget([
    'query'             => $query,
    'headingOptions'    => ['label' => '部別'],
    'nodeView'          => '@frontend/views/personinfo/_nodeoutgridview',
    'nodeActions' => [
        Module::NODE_MANAGE => Url::to(['treemanager-router', 'router' => 'out']),
    ],
    'isAdmin'           => false,
    'rootOptions'       => ['label' => '您能夠查看的部別'],
    'displayValue'      => $current_unit,
    'toolbar'           => [
        TreeView::BTN_REFRESH => false,
        TreeView::BTN_CREATE => false,
        TreeView::BTN_CREATE_ROOT => false,
        TreeView::BTN_REMOVE => false,
        TreeView::BTN_SEPARATOR => false,
        TreeView::BTN_MOVE_UP => false,
        TreeView::BTN_MOVE_DOWN => false,
        TreeView::BTN_MOVE_LEFT => false,
        TreeView::BTN_MOVE_RIGHT => false,
        TreeView::BTN_SEPARATOR => false,
    ],
]) ?>

</div>

解釋:session

  • 其餘部分的解釋見原文
  • 裏面有一個特殊的動做,也即 Url::to(['treemanager-router', 'router' => 'out']),下面將會介紹。主要由該函數實現原博客粘貼整個模塊要實現的功能。位於 ./frontend/controller/PersoninforController.php
use kartik\tree\TreeView;
use kartik\tree\controllers\NodeController;
//** skip many code.
    public function actionTreemanagerRouter($router)
    {
        extract(static::getPostData());
        if (isset($id) && !empty($id)) {
            Yii::$app->session->set('current_unit', $id);
        }
        return $this->redirect([$router]);
    }

    protected static function getPostData()
    {
        if (empty($_POST)) {
            return [];
        }
        $out = [];
        foreach ($_POST as $key => $value) {
            $out[$key] = in_array($key, NodeController::$boolKeys) ? filter_var($value, FILTER_VALIDATE_BOOLEAN) : $value;
        }
        return $out;
    }
// skip many code

解釋:app

  • 因爲原來插件中 getPostData() 函數是 protected 的,沒法直接調用,不得已,複製在此。

文中缺乏的部分解釋,詳見原文,此處再也不贅述。

相關文章
相關標籤/搜索