本文网址:http://my.oschina.net/bubifengyun/blog/605908 本文改进版在:https://my.oschina.net/bubifengyun/blog/776979php
yii2作的网站,一边是树形结构treeview,一边是表格列表gridview,利用kartik的插件,这两个都比较容易搭建起来。选择左边的treeview,根据不一样的选择项,girdview显示对应节点的信息。这个功能具备较好的使用价值。node
总共花了两周时间才完成,中间查了不少资料,不一一记录了。因为时间较长,可能部份内容缺失,若是没法工做,欢迎在下面留言。整体流程是以下:安装tree manager的treeview,=》对treeview显示内容进行改动,=》把显示内容更改成gridview,=》修复gridview出现的各类问题。git
composer require kartik-v/yii2-tree-manager "@dev" composer require kartik-v/yii2-grid "@dev"
找到./vendor/kartik-v/yii2-tree-manager/schema/tree.sql
文件,因为本人是xampp开发,使用phpmyadmin, 进入到工做用的db_lhpg
,点击导入按钮,选择该文件导入便可。导入后,能够根据本身须要在tbl_tree
添加部分项,或者修改部分备注。 最好不要删除原有的项。我把添加好的tbl_tree
改名为tbl_unit
了,没有作任何添加。github
可使用gii自动生成工具,Model命名空间为common/models
。修改./common/models/Unit.php
文件(对应你生成的文件),修改内容以下。web
namespace common\models; use Yii; class Tree extends \kartik\tree\models\Tree { /*略*/ }
这部份内容比较多。ajax
mkdir ./frontend/modules
cp -r ./vendor/kartik-v/yii2-tree-manager ./frontend/modules/tree
./frontend/modules/tree
文件夹下全部.php文件的命名空间namespace kartik\tree
改成namespace frontend\modules\tree
; 包括那些namespace kartik\tree\controllers
等相似的命名空间。./frontend/config/main.php
,加入以下内容。'modules' => [ 'treemanager' => [ 'class' => '\frontend\modules\tree\Module', ] ]
假设现有一个Personinfo,对应有PersoninfoController
的动做sql
/** * Every User take control of Out in special unit. * @return mixed */ public function actionOut() { $see_unit = Yii::$app->user->identity->see_unit; // add children and itself. $query = Unit::findOne($see_unit) ->children() ->orWhere(['id' => $see_unit]) ->addOrderBy('root, lft'); $current_unit = Yii::$app->session->get('current_unit', 0); if ($current_unit === 0){ $current_unit = $see_unit; } return $this->render('out', [ 'query' => $query, 'current_unit' => $current_unit, ]); }
解说:数据库
$see_unit
$query
是提供给TreeView使用的变量.children()
函数见yii2-nested-sets的说明。$current_unit
是当前正在查看的变量。$current_unit
不在可查看权限$see_unit
的权限范围内的话,是0或者其余数值,则只显示根目录的数值。Yii::$app->session->get('current_unit', 0);
用于每次刷新,把上次点击的内容复制过来。也就是须要其余地方设置 Yii::$app->session->set('current_unit', $current_unit);
这个在下面说。下面说渲染的页面./frontend/views/personinfo/out.php
,代码以下:数组
<?= TreeView::widget([ 'query' => $query, 'headingOptions' => ['label' => '部别'], 'nodeView' => '@frontend/views/personinfo/_nodegridview', 'nodeActions' => [ Module::NODE_MANAGE => Url::to(['/treemanager/node/my-manage']), ], '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, ], ]) ?>
解说:bash
$query
见controller传过来的变量。nodeView
从新赋值了。为@frontend/views/personinfo/_nodegridview
,请必定把路径写完,不然没法找到该页面。nodeActions
只修改了NODE_MANAGE
,经多轮测试,一直没有找到好的解决方案,只好修改Module里源代码了,这也是把原来Module内置到frontend的缘由。toolbar
被禁用了,可是仍是那么操蛋,必需要一个个的赋值为false才能够。Module::NODE_MANAGE => Url::to(['/treemanager/node/my-manage'])
中的my-manage
的解说, 在 ./frontend/modules/tree/controllers/NodeController.php
文件中, 该动做对应于actionMyManage
函数。内容以下。
/** * View a tree node via ajax * * @return redirect to `/personinfo/out` */ public function actionMyManage() { extract(static::getPostData()); if (isset($id) && !empty($id)) { Yii::$app->session->set('current_unit', $id); } return $this->redirect(['/personinfo/out']); }
解说:
Module::NODE_MANAGE => Url::to(['/frontend/personinfo/out'])
的,可是各类调试失败,作了以下折中。 首先读取$_POST
的内容,主要是点击TreeView树形结构节点Node得到id
,而后刷新网页['/personinfo/out']
, 把得到的id
传递过去,传递方式采用的session方式。下面把./frontend/views/personinfo/_nodegridview.php
的内容贴出来。
<?php use yii\helpers\Html; use yii\widgets\ActiveForm; use yii\widgets\Pjax; use kartik\grid\GridView; use kartik\tree\TreeView; use common\models\Personinfo; use common\models\PersoninfoSearch; use common\models\Unit; /* @var $this yii\web\View */ /* @var $model common\models\Personinfo */ /* @var $form yii\widgets\ActiveForm */ Pjax::begin(); // run every key=>value as variant in PHP. extract($params); $children = Unit::findOne($node->id)->children()->all(); $selfAndChildrenID = [$node->id]; foreach($children as $child){ $selfAndChildrenID[] = $child->id; } $searchModel = new PersoninfoSearch(); $searchModel->unit_code = $selfAndChildrenID; $dataProvider = $searchModel->search(Yii::$app->request->queryParams); echo GridView::widget([ 'id' => 'admin-gridview-id', 'dataProvider' => $dataProvider, 'filterModel' => $searchModel, 'columns' => [ [ 'class' => 'kartik\grid\SerialColumn' ], 'name', 'is_married', 'can_home_weekend', 'mil_rank', [ 'class' => 'kartik\grid\ActionColumn', 'template' => '{view}{update}', ], ], 'containerOptions' => ['style'=>'overflow: auto'], // only set when $responsive = false 'toolbar' => [ '{export}', '{toggleData}' ], 'pjax' => true, 'bordered' => true, 'striped' => false, 'condensed' => false, 'responsive' => true, 'hover' => true, // 'floatHeader' => true, // 'floatHeaderOptions' => ['scrollingTop' => $scrollingTop], 'showPageSummary' => true, 'panel' => [ 'type' => GridView::TYPE_PRIMARY ], ]); Pjax::end();
解说:
params
是经过动做传过来的一个变量,知道内有一个node
就能够了,node
是Unit
的一个实例或者说是一个对象。$searchModel->unit_code = $selfAndChildrenID;
设置该语句的时候,其中$selfAndChildrenID
是数组array。 须要设置searchPersoninfo
的rules
的规则,unit_code
是safe
。Yii2会实现自动搜索全部归属这些单位的人员。调试发现,每次点击gridview的排序,都没有任何东西放在post变量里,这个问题须要好好解决。
这样就实现了一边是树形结构TreeView,一边是表格GridView,且GirdView能够调节改动。能够根据本身的须要,排序搜索GridView的内容。
在花费两周的时间才解决这个问题时,设想了不少方案,好比把原做者的这个模块给肢解了,各自放到frontend里。 固然最好的方案是把这个模块留在./vendor
文件夹里,不须要对他作任何改动。只是修改 Module::NODE_MANAGE => Url::to(['/frontend/personinfo/out']),
,而后配置一下Controller里的ActionOut函数。 因为缺少时间对此进行更深的研究,先留存在这里。
网站正在紧锣密鼓的开发中,后期会开源。