在学习Fastadmin的下拉选项中,遇到了多级展示的需求。效果是2级及以上的选项作出标示。如下效果:


以我在使用的话题Topic相关代码为例。
表数据主要字段:
| 字段 | 说明 |
|---|---|
| id | 主键ID |
| topic | 话题名 |
| pid | 父级话题id |
1.使用Fastadmin框架自带的Tree类: 目录 \extend\fast\Tree.php;
2.控制器层 Topic.php 中,增加以下代码:
// 引入Tree类use fast\Tree; /**
* 设置pid 的树形结构数据
*
* @param array $data 待转换的数据,如果没有则读取数据库
* @return array
* sourcedata:原始数据,只修改展示字段,
* treedata:树形结构展示数据
*/
public function setPidTreeList($data=[]) {
// 添加父级主题Tree形结构
$ruleList = is_array($data) && !empty($data) ? $data : collection($this->model->order('id', 'asc')->select())->toArray();
// select的option展示的数据字段,默认是name,我这边用的是topic字段
$nameFiled = 'topic';
$tree = Tree::instance();
$tree->init($ruleList, 'pid');
$treeList = $tree->getTreeList($tree->getTreeArray(0), $nameFiled);
$formatTreeList = [];
foreach ($treeList as $val) {
$formatTreeList[$val['id']] = $val[$nameFiled];
}
$this->view->assign('pidTreeList', $formatTreeList);
return ['sourcedata' => $treeList, 'treedata' => $formatTreeList];
}
// add方法中,view视图展示前,增加 `$this->setPidTreeList();`
public function add(){
if (false === $this->request->isPost()) {
$this->setPidTreeList();
return $this->view->fetch();
}
// ...其他代码
}
// edit方法中同样如此,view视图展示前,增加 `$this->setPidTreeList();`
public function edit(){
// ...其他代码
if (false === $this->request->isPost()) {
$this->setPidTreeList();
$this->view->assign('row', $row);
return $this->view->fetch();
}
// ...其他代码
}3.在Model层 Topic.php 中增加代码
public function topicpid() {
return $this->belongsTo('Topic', 'pid', 'id', [], 'LEFT')->setEagerlyType(0);
}4.View视图层增加代码
<!-- add.html --><div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Pid')}:</label>
<div class="col-xs-12 col-sm-8">
{:Form::selectpicker('row[pid]', array_merge([0 => __('Toptopic')], $pidTreeList), 0, ['data-rule'=>'required'])}
</div>
</div>
<!-- edit.html --><div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Pid')}:</label>
<div class="col-xs-12 col-sm-8">
{:Form::selectpicker('row[pid]', array_merge([0 => __('Toptopic')], $pidTreeList), $row['pid'], ['data-rule'=>'required'])}
</div>
</div>5.js层增加代码
// 初始化表格
table.bootstrapTable({
... columns: [
[
...
{field: 'topic', title: __('Topic'), operate: 'LIKE', align: 'left',
formatter: function (value, row, index) {
return value.toString().replace(/(&|&)nbsp;/g, ' ');
}
},
{field: 'topicpid.topic', title: __('Pidname'), align: 'left',
formatter: function (value, row, index) {
return value ? value : __('Toptopic');
},
},
...
]
]坑点:
① Article的编辑页,直接使用 data-source="blog/topic/index" 属性,并 不会展示默认选中的话题;
② 还是在Article的编辑页,选择话题后,前面的空格会被转义为
效果:

其他类如果要使用该Tree树形数据,会出现空格被转为
的问题。下面以文章类Article.php举例,来避免被转义
- 首先Article 表和Topic表做了关联, article.topic_id = topic.id
Article.php 控制器中
// add方法,增加 `setPidTreeList()` 方法调用
public function add(){
if (false === $this->request->isPost()) {
$topicController = new Topic();
$topicController->setPidTreeList();
return $this->view->fetch();
}
...
}// edit方法同上,也增加 `setPidTreeList()` 方法调用2.View层add.html 和 edit.html 增加代码
<div class="form-group">
<label class="control-label col-xs-12 col-sm-2">{:__('Topic_id')}:</label>
<div class="col-xs-12 col-sm-8">
{:Form::selectpicker('row[topic_id]', $pidTreeList, $row['topic_id'], ['data-rule'=>'required'])}
</div>
</div>3.效果展示:

本文为牛洁原创文章,转载无需和我联系,但请注明来自牛洁博客baobaoo.cn
