改版前網址:https://my.oschina.net/bubifengyun/blog/605908php
上文4、值得完善之處
,發現有改進的可能。後來網站開發須要,有更多的一邊是樹形結構,一邊是表格的形式,用原來的方法,太過粗糙,固然本次改版,也沒有逃脫效率低下的困境,惟一的優點是代碼量大幅度降低,並且還不懼原來插件的更新。node
參考資料:git
若有不明白,能夠參照原教程的 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
Tree
數據表添加你須要的屬性。我是使用 gii 直接導入的這個模型(model),gii 生成後,把原始表的全部字段的驗證去掉(此處感謝26056-sjg20010414 )。須要把他的父類修改一下,數據庫
namespace common\models; use Yii; class Tree extends \kartik\tree\models\Tree { /*略*/ }
'modules' => [ 'treemanager' => [ 'class' => '\kartik\tree\Module', // other module settings, refer detailed documentation ] ]
使用 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.phpuse 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
的,沒法直接調用,不得已,複製在此。文中缺乏的部分解釋,詳見原文,此處再也不贅述。