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();

}

相关推荐
两个人的幸福11 天前
Windows 桌面应用自研 PHP 队列(下):完整代码与六大工程化优化
php
BingoGo13 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
JaguarJack13 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
用户30745969820714 天前
PHP 扩展——从入门到理解
php
鹏仔先生14 天前
拷贝漫画APP下载页PHP程序,后台带免费AI写作
php
云水一下15 天前
从零开始学 PHP 系列(一):PHP 的前世今生与开发环境搭建
开发语言·php
xingpanvip15 天前
星盘接口开发文档:本命盘接口指南
android·开发语言·css·php·lua
酉鬼女又兒15 天前
零基础入门计算机网络运输层:端到端通信核心作用、端口号分类规则、复用分用工作机制及UDP与TCP协议全方位对比详解
网络·网络协议·tcp/ip·计算机网络·考研·udp·php
dog25015 天前
不要再继续优化 TCP
网络协议·tcp/ip·php
Channing Lewis15 天前
PHP 解析 Excel 的那些坑:一次“行号错位”引发的数据丢失
开发语言·php·excel