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事件

$('adata-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.btndata-iddata-piddata-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-changedata-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.btndata-iddata-piddata-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.btndata-iddata-piddata-pid!=0").not('.disabled').closest("tr").toggle(show);

$(".btn-node-subdata-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($("formrole=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();

}

相关推荐
juesdo1 小时前
青岑CTF之 EZPHP系列
笔记·web安全·php
Leweslyh2 小时前
3GPP TS 28.312 意图驱动管理服务 — 极详细通俗解读
开发语言·php
catchadmin3 小时前
PHP 在领域驱动(DDD)设计中的核心实践
开发语言·php
Johnstons3 小时前
网页加载到一半卡住?视频看到关键处花屏?可能是丢包在作祟
开发语言·php·音视频·弱网测试·网络损伤
Leweslyh4 小时前
《3GPP TS 28.312 面向移动网络的意图驱动管理服务》完整自学教程
开发语言·网络·php
Godspeed Zhao4 小时前
跨越天际:从智能汽车到 eVTOL 的适航与系统级开发21——时间触发以太网(TTE)与 ARINC 664(AFDX)
架构·汽车·php
zimoyin5 小时前
Webman 的 PHP 打包构建脚本:编译二进制、归档备份、生成校验包(附完整源码+解析)
php
酉鬼女又兒21 小时前
零基础入门计算机网络:网络层核心任务、三大关键问题、两种服务类型与 TCP/IP 网际层协议体系全解析
服务器·网络·网络协议·tcp/ip·计算机网络·php·求职招聘
神仙别闹1 天前
基于 PHP + MySQL学生信息管理系统
android·mysql·php
天启HTTP1 天前
开启全局代理后网络变慢,问题出在哪
开发语言·前端·网络·tcp/ip·php