fastadmin 分类可以叠加展开

define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) {

var Controller = {

index: function () {

// 初始化表格参数配置

Table.api.init({

extend: {

index_url: 'category/index',

add_url: 'category/add',

edit_url: 'category/edit',

del_url: 'category/del',

multi_url: 'category/multi',

dragsort_url: 'ajax/weigh',

table: 'category',

}

});

var table = $("#table");

var tableOptions = {

url: $.fn.bootstrapTable.defaults.extend.index_url,

pk: 'id',

pagination: false,//隐藏分页

search: true,//隐藏搜索框

commonSearch: false,//隐藏搜索按钮

showToggle: false,//表格视图两种模式

showColumns: false,//隐藏列

showExport: false,//隐藏导出

dbClickToEdit:false,

clickToSelect:false,

/*columns: [

{ checkbox: true }, { field: 'id', title: __('Id') }, { field: 'type', title: __('Type'), operate: false, searchList: Config.searchList, formatter: Table.api.formatter.label }, { field: 'name', title: __('Name'), align: 'left', formatter: function (value, row, index) { return value.toString().replace(/(\&\|\&)nbsp;/g, '\ '); } }, { field: 'nickname', title: __('Nickname') }, { field: 'flag', title: __('Flag'), formatter: Table.api.formatter.flag }, { field: 'image', title: __('Image'), operate: false, events: Table.api.events.image, formatter: Table.api.formatter.image }, { field: 'weigh', title: __('Weigh') }, { field: 'is_gyqg', title:'供应求购',formatter:function(value,row,index){ return value==1?'\是 \':' '; }}, { field: 'status', title: __('Status'), operate: false, formatter: Table.api.formatter.status }, { field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate }

] */

columns: [

{checkbox: true}, {field: 'id', title: __('Id')}, { field: 'type', title: __('Type'), operate: false, searchList: Config.searchList, formatter: Table.api.formatter.label }, {field: 'name', title: __('Name'), align: 'left', formatter:function (value, row, index) {return value.toString().replace(/(\&\|\&)nbsp;/g, '\ ');}}, {field: 'image', title: __('Image'), events: Table.api.events.image, formatter: Table.api.formatter.image}, {field: 'pid', title: __('Pid')}, { field: 'weigh', title: __('Weigh'), editable: { type: 'number', // 数字输入类型 title: '请输入权重值', validate: function (value) { if (value === '') { return '权重值不能为空'; } if (!/\^\\d+$/.test(value)) { return '权重值必须为数字'; } if (parseInt(value) \< 0) { return '权重值不能小于0'; } return ''; } } }, { field: 'flag', title: __('Flag'), formatter: Table.api.formatter.flag }, {field: 'id', title: '展开', operate: false, formatter: Controller.api.formatter.subnode}, { field: 'is_gyqg', title:'供应求购',formatter:function(value,row,index){ return value==1?'\是 \':' '; }}, { field: 'status', title: __('Status'), operate: false, formatter: Table.api.formatter.status }, {field: 'operate', title: __('Operate'), table: table, events: Table.api.events.operate, formatter: Table.api.formatter.operate}

],

};

// 初始化表格

table.bootstrapTable(tableOptions);

//绑定TAB事件

$('a[data-toggle="tab"]').on('shown.bs.tab', function (e) {

// var options = table.bootstrapTable(tableOptions);

var typeStr = $(this).attr("href").replace('#', '');

var options = table.bootstrapTable('getOptions');

options.pageNumber = 1;

options.queryParams = function (params) {

// params.filter = JSON.stringify({type: typeStr});

params.type = typeStr;

return params;

};

table.bootstrapTable('refresh', {});

return false;

});

// 为表格绑定事件

Table.api.bindevent(table);

table.off('dbl-click-row.bs.table');

//当内容渲染完成后

table.on('post-body.bs.table', function (e, settings, json, xhr) {

//默认隐藏所有子节点

$("a.btn[data-id][data-pid][data-pid!=0]").closest("tr").hide();

// $(".btn-node-sub.disabled").closest("tr").hide();

//显示隐藏子节点

$(".btn-node-sub").off("click").on("click", function (e) {

var status = $(this).data("shown") ? true : false;

("a.btn\[data-pid='" + (this).data("id") + "']").each(function () {

$(this).closest("tr").toggle(!status);

});

$(this).data("shown", !status);

return false;

});

//点击切换/排序/删除操作后刷新左侧菜单

$(".btn-change[data-id],.btn-delone,.btn-dragsort").data("success", function (data, ret) {

Fast.api.refreshmenu();

return false;

});

});

//批量删除后的回调

$(".toolbar > .btn-del,.toolbar .btn-more~ul>li>a").data("success", function (e) {

Fast.api.refreshmenu();

});

//展开隐藏一级

$(document.body).on("click", ".btn-toggle", function (e) {

$("a.btn[data-id][data-pid][data-pid!=0].disabled").closest("tr").hide();

var that = this;

var show = $("i", that).hasClass("fa-chevron-down");

$("i", that).toggleClass("fa-chevron-down", !show);

$("i", that).toggleClass("fa-chevron-up", show);

$("a.btn[data-id][data-pid][data-pid!=0]").not('.disabled').closest("tr").toggle(show);

$(".btn-node-sub[data-pid=0]").data("shown", show);

});

//展开隐藏全部

$(document.body).on("click", ".btn-toggle-all", function (e) {

var that = this;

var show = $("i", that).hasClass("fa-plus");

$("i", that).toggleClass("fa-plus", !show);

$("i", that).toggleClass("fa-minus", show);

$(".btn-node-sub.disabled").closest("tr").toggle(show);

$(".btn-node-sub").data("shown", show);

});

},

add: function () {

Controller.api.bindevent();

setTimeout(function () {

$("#c-type").trigger("change");

}, 100);

},

edit: function () {

Controller.api.bindevent();

},

api: {

formatter: {

subnode: function (value, row, index) {

return '<a href="javascript:;" data-toggle="tooltip" title="' + __('Toggle sub menu') + '" data-id="' + row.id + '" data-pid="' + row.pid + '" class="btn btn-xs '

  • (row.haschild == 1 || row.ismenu == 1 ? 'btn-success' : 'btn-default disabled') + ' btn-node-sub"><i class="fa fa-sitemap"></i></a>';

}

},

bindevent: function () {

Form.api.bindevent($("form[role=form]"));

}

}

};

return Controller;

});

修改后台分类方法

public function _initialize()

{

parent::_initialize();

$this->model = model('app\common\model\Category');

// 必须将结果集转换为数组

ruleList = collection(this->model->field('*')->order('id ASC')->select())->toArray();

foreach (ruleList as k => &$v) {

v\['name'\] = __(v['name']);

unset(ruleList\[k]['classify_id']);

}

Tree::instance()->init($ruleList);

$this->categorylist = Tree::instance()->getTreeList(Tree::instance()->getTreeArray(0), 'name');

$ruledata = [0 => __('None')];

foreach (this-\>categorylist as k => &$v) {

ruledata\[v['id']] = $v['name'];

}

// $tree = Tree::instance();

// tree-\>init(collection(this->model->order('weigh desc,id desc')->select())->toArray(), 'pid');

// this-\>categorylist = tree->getTreeList($tree->getTreeArray(0), 'name');

// $categorydata = [0 => ['type' => 'all', 'name' => __('None')]];

foreach (this-\>categorylist as k => $v) {

if (isset(v\['level'\]) \&\& v['level'] <= 2) { // level从0开始,0=一级,1=二级,2=三级

categorydata\[v['id']] = $v;

} else if (!isset($v['level'])) {

// 如果没有level字段,可能是根节点,也加入

categorydata\[v['id']] = $v;

}

}

$typeList = CategoryModel::getTypeList();

this-\>view-\>assign("flagList", this->model->getFlagList());

this-\>view-\>assign("typeList", typeList);

this-\>view-\>assign("parentList", categorydata);

this-\>assignconfig('typeList', typeList);

}

public function index()

{

//设置过滤方法

$this->request->filter(['strip_tags']);

if ($this->request->isAjax()) {

// 获取搜索和筛选参数

search = this->request->request("search");

type = this->request->request("type");

// 构建查询条件

$where = [];

if (type \&\& type !== 'all') {

where\['type'\] = type;

}

// 执行查询获取所有数据

query = this->model->where($where);

// 获取所有符合条件的数据

allData = query->order('weigh desc,id desc')->select();

allDataArray = collection(allData)->toArray();

// 添加 haschild 字段,标识每个分类是否有子分类

foreach (allDataArray as \&item) {

hasChild = this->model->where('pid', $item['id'])->count() > 0;

item\['haschild'\] = hasChild ? 1 : 0;

}

// 如果有搜索关键词,则找出所有匹配的节点及其父节点

if ($search) {

$matchedNodes = [];

allNodes = allDataArray;

// 首先找出直接匹配的节点

foreach (allNodes as node) {

if (

strpos(node\['name'\], search) !== false ||

strpos(node\['nickname'\], search) !== false

) {

matchedNodes\[\] = node['id'];

// 同时收集其所有父节点ID

parentId = node['pid'];

while ($parentId != 0) {

$parentNode = null;

foreach (allNodes as n) {

if (n\['id'\] == parentId) {

parentNode = n;

break;

}

}

if ($parentNode) {

matchedNodes\[\] = parentNode['id'];

parentId = parentNode['pid'];

} else {

break;

}

}

}

}

// 过滤出匹配的节点数据

$filteredData = [];

foreach (allDataArray as item) {

if (in_array(item\['id'\], matchedNodes)) {

filteredData\[\] = item;

}

}

// 重新构建树形结构

$tree = Tree::instance();

tree-\>init(filteredData, 'pid');

list = tree->getTreeList($tree->getTreeArray(0), 'name');

} else {

// 没有搜索时,正常构建树形结构

$tree = Tree::instance();

tree-\>init(allDataArray, 'pid');

list = tree->getTreeList($tree->getTreeArray(0), 'name');

}

// 对结果进行处理,确保每个节点都有 haschild 字段

list = this->processTreeData($list);

total = count(list);

result = array("total" =\> total, "rows" => $list);

return json($result);

}

return $this->view->fetch();

}

相关推荐
ServBay1 天前
垃圾堆里编码?真的不要怪 PHP 不行
后端·php
用户962377954481 天前
CTF 伪协议
php
BingoGo3 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php
JaguarJack3 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php·服务端
BingoGo4 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php
JaguarJack4 天前
OpenSwoole 26.2.0 发布:支持 PHP 8.5、io_uring 后端及协程调试改进
后端·php·服务端
JaguarJack5 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
后端·php·服务端
BingoGo5 天前
推荐 PHP 属性(Attributes) 简洁读取 API 扩展包
php
JaguarJack6 天前
告别 Laravel 缓慢的 Blade!Livewire Blaze 来了,为你的 Laravel 性能提速
后端·php·laravel
郑州光合科技余经理7 天前
代码展示:PHP搭建海外版外卖系统源码解析
java·开发语言·前端·后端·系统架构·uni-app·php