FastAdmin列表通过queryParams实现自定义传值

场景

FastAdmin Table列表通过操作栏,打开新的页面。需要找到行对应的数据。

 点击自定义操作按钮,打开新页面。按照行索引ID进行搜索。

 JS中实现:

代码:

table.bootstrapTable({
                url: $.fn.bootstrapTable.defaults.extend.index_url,
                pk: 'id',
                sortName: 'id',
                search: false,
                showExport: false,
                showToggle: false,
                showColumns: false,
                searchFormVisible: false,
                commonSearch:false,
                columns: [
                    [
                        {checkbox: true},
                        {field: 'id', title: __('Id')},
                        {field: 'place.name', title: __('Place.name'), operate: 'LIKE'},
                        {field: 'pager.name', title: __('Pager.name'), operate: 'LIKE'},
                        {field: 'stem.name', title: __('Stem.name'), operate: 'LIKE'},
                        {field: 'createtime', title: __('Createtime'), operate:'RANGE', addclass:'datetimerange', autocomplete:false, formatter: Table.api.formatter.datetime}
                    ]
                ],
                queryParams:function (params) {
                    var place_id = Fast.api.query('ids');
                    var filter = typeof params.filter == "undefined" ? {} : JSON.parse(params.filter);
                    var op = typeof params.op == "undefined" ? {} : JSON.parse(params.op);
                    filter.place_id = place_id;
                    op.place_id = '=';
                    params.filter = JSON.stringify(filter);
                    params.op = JSON.stringify(op);

                    return params;
                }
            });

最终通过自定义参数,展示对应的数据。

<think>我们正在处理一个关于FastAdmin框架的问题:用户想在列表实现自定义按钮的拖动排序功能。 根据用户需求,我们需要在FastAdmin的后台列表页中,对自定义添加的按钮进行拖动排序。 分析: 1. FastAdmin基于ThinkPHP和Bootstrap,并使用了RequireJS进行模块管理。 2. 列表页的按钮通常通过`table`组件的`buttons`配置项来添加,但这些按钮默认不支持拖动排序。 3. 我们需要引入拖拽排序的JavaScript库(如Sortable.js)来实现拖动功能,并调整按钮的DOM结构使其可拖动。 4. 同时,我们需要将拖动后的顺序保存到数据库,以便下次加载时按新顺序显示。 步骤: 一、前端实现拖动排序 1. 在列表页的按钮容器上启用Sortable.js。 2. 当拖动结束时,获取新的按钮顺序,并发送到服务器保存。 二、后端保存顺序 1. 提供一个API接口,接收按钮顺序(如按钮ID数组)并更新数据库。 三、加载时按保存的顺序渲染按钮 1. 在生成按钮列表时,从数据库中读取保存的顺序,按该顺序输出按钮。 具体实现: 第一步:修改视图文件,为按钮容器添加一个可拖动的容器。 通常,FastAdmin列表页按钮位于`<div class="btn-group">`中,我们可以在这个容器上启用Sortable。 但是,由于FastAdmin的按钮是通过JS动态生成的,我们需要在生成后初始化Sortable。 第二步:引入Sortable.js库。 在FastAdmin中,可以通过RequireJS引入。 第三步:编写初始化排序的JS代码,并处理排序后的保存操作。 第四步:创建后端接口保存顺序。 下面我们逐步说明: 1. 引入Sortable.js 由于FastAdmin使用RequireJS,我们可以将Sortable.js放在`public/js`目录下,然后在`bootstrap.js`中配置路径,或者直接在视图文件中使用RequireJS引入。 这里我们选择在视图文件中动态引入。 2. 修改视图文件(例如:application/admin/view/你的控制器/index.html) 在文件末尾的`<script>`标签中,我们动态引入Sortable.js,并在表格初始化完成后,对按钮容器进行初始化。 3. 初始化Sortable并保存顺序 注意:FastAdmin的表格按钮默认是在一个`<div class="btn-group">`中,我们可以通过选择器找到这个容器。 但是,由于可能有多个按钮组(例如操作按钮组和工具栏按钮组),我们需要确定要对哪个按钮组进行排序。这里我们假设用户是对工具栏上的自定义按钮组进行排序。 工具栏按钮的容器通常是:`<div class="btn-group hidden-xs">`(在`table`标签上方) 4. 保存顺序时,我们可以将按钮的ID(或标识)按顺序组成数组,通过AJAX发送到后端。 5. 后端接收顺序数组,并更新数据库(例如,在数据库中有一个表存储按钮的顺序,或者将顺序序列化存储到配置表中)。 由于用户的需求是“自定义按钮”,我们假设用户已经通过某种方式添加了自定义按钮(比如通过`addAction`方法添加的按钮),并且每个按钮都有一个唯一的标识(比如`name`属性)。 示例代码(视图文件中的JS部分): ```javascript // 在表格初始化完成后执行 require(['sortable'], function(Sortable) { // 等待表格渲染完成,这里使用setTimeout延迟执行,确保按钮已经生成 setTimeout(function() { // 找到按钮容器,这里以工具栏的按钮组为例 var container = document.querySelector('.table .btn-group.hidden-xs'); if (container) { // 初始化Sortable Sortable.create(container, { animation: 150, onEnd: function(evt) { // 拖动结束,收集按钮的顺序 var buttons = container.querySelectorAll('a.btn'); var order = []; buttons.forEach(function(button) { // 假设每个按钮都有一个data-id属性来存储唯一标识 // 如果没有,可以用按钮的name或者其他属性 var id = button.getAttribute('data-id'); if (id) { order.push(id); } }); // 发送AJAX请求保存顺序 $.ajax({ url: '你的保存顺序的URL', type: 'post', data: {order: order}, success: function(res) { if (res.code) { // 保存成功,可以提示 Toastr.success("保存成功"); } else { Toastr.error(res.msg); } } }); } }); } }, 1000); }); ``` 注意:上面的代码中,我们假设每个按钮都有一个`data-id`属性,这个需要在添加按钮时设置。 例如,在控制器中,我们添加按钮时设置`data-id`: ```php $this->assignconfig('buttons', [ [ 'name' => 'custom', 'title' => __('自定义按钮'), 'class' => 'btn btn-primary btn-ajax', 'icon' => 'fa fa-heart', 'data-id' => 'custom_button' // 这里设置data-id ], // ... 其他按钮 ]); ``` 或者,在JS中动态添加按钮时设置: ```javascript table.bootstrapTable('addAction', { name: 'custom', title: __('自定义按钮'), class: 'btn btn-primary btn-ajax', icon: 'fa fa-heart', extend: 'data-id="custom_button"' }); ``` 6. 后端接口实现(在FastAdmin中创建一个新的控制器方法) 例如,在对应的控制器中创建`sort`方法: ```php public function sort() { $order = $this->request->post("order/a"); if (empty($order)) { $this->error("参数错误"); } // 这里将$order数组保存到数据库,例如更新配置表 // 假设我们有一个配置项叫'custom_buttons_order' $config = [ 'custom_buttons_order' => $order ]; if (model('admin/Config')->saveConfig($config)) { $this->success("保存成功"); } else { $this->error("保存失败"); } } ``` 7. 在加载按钮时,按保存的顺序排序 在生成按钮列表时,我们需要从数据库中读取保存的顺序,然后按这个顺序排列按钮。 例如,在控制器中: ```php // 获取保存的按钮顺序 $order = model('admin/Config')->getConfig('custom_buttons_order'); // 假设$buttons是原始的按钮数组 if ($order) { // 按照$order数组的顺序重新排列$buttons usort($buttons, function($a, $b) use ($order) { $aIndex = array_search($a['name'], $order); $bIndex = array_search($b['name'], $order); if ($aIndex === false && $bIndex === false) { return 0; } elseif ($aIndex === false) { return 1; } elseif ($bIndex === false) { return -1; } return $aIndex - $bIndex; }); } ``` 注意:以上代码仅为示例,实际实现需要根据具体业务调整。 总结: 实现拖动排序功能需要前后端配合: - 前端:使用Sortable.js实现拖拽,并发送顺序到后端。 - 后端:接收顺序数组并保存到数据库(或配置文件)。 - 在生成按钮时,按保存的顺序输出。 注意事项: 1. 确保按钮容器可以被Sortable正确操作,注意FastAdmin的按钮可能是动态生成的,所以需要在按钮生成后初始化Sortable。 2. 按钮的唯一标识(data-id)需要设置且唯一。 3. 保存顺序的接口需要做好权限控制。 相关问题: 1. 如何为FastAdmin的表格按钮添加自定义事件? 2. 在FastAdmin中如何创建新的API接口? 3. Sortable.js有哪些常用的配置项和事件?</think>### 在FastAdmin实现列表自定义按钮拖动排序功能 在FastAdmin框架中实现列表自定义按钮的拖动排序功能,需要结合前端拖拽库和后端数据存储。以下是完整实现方案: #### 一、前端实现步骤(使用Sortable.js) 1. **引入Sortable.js库** 在`public/js`目录下添加Sortable.js,或在视图文件中通过CDN引入: ```html <script src="https://cdn.jsdelivr.net/npm/sortablejs@1.15.0/Sortable.min.js"></script> ``` 2. **修改按钮容器结构** 在列表页模板文件(如`application/admin/view/yourcontroller/index.html`)中: ```html <div class="btn-group" id="custom-buttons-container"> {foreach $customButtons as $button} <a href="{$button.url}" class="btn {$button.class}" data-id="{$button.id}"> <i class="{$button.icon}"></i>{$button.title} </a> {/foreach} </div> ``` 3. **初始化拖拽排序** 在页面底部添加JS代码: ```javascript <script> require(['jquery'], function($) { $(function() { // 初始化拖拽 const container = document.getElementById('custom-buttons-container'); new Sortable(container, { animation: 150, onEnd: function(evt) { // 获取新顺序的ID数组 const newOrder = Array.from(container.children).map(el => $(el).data('id')); // 发送排序数据到后端 $.ajax({ url: 'yourcontroller/dragSort', type: 'POST', data: { order: newOrder }, success: function(res) { if (res.code) { toastr.success('排序已保存'); } } }); } }); }); }); </script> ``` #### 二、后端实现步骤(PHP部分) 1. **创建数据库存储结构** 在数据库中创建按钮排序表: ```sql CREATE TABLE `fa_button_sort` ( `id` INT(11) PRIMARY KEY AUTO_INCREMENT, `button_id` INT(11) NOT NULL COMMENT '按钮ID', `sort_order` INT(11) NOT NULL DEFAULT 0 COMMENT '排序', `admin_id` INT(11) NOT NULL COMMENT '管理员ID' ); ``` 2. **实现排序接口** 在控制器中添加排序方法: ```php public function dragSort() { $order = $this->request->post('order/a'); $adminId = $this->auth->id; // 删除旧排序 Db::name('button_sort')->where('admin_id', $adminId)->delete(); // 保存新排序 $data = []; foreach ($order as $index => $buttonId) { $data[] = [ 'button_id' => $buttonId, 'sort_order' => $index + 1, 'admin_id' => $adminId ]; } Db::name('button_sort')->insertAll($data); $this->success(); } ``` 3. **加载排序数据** 在列表页控制器中: ```php public function index() { // 获取原始按钮数据 $buttons = config('custom_buttons'); // 获取当前用户的排序 $sortedIds = Db::name('button_sort') ->where('admin_id', $this->auth->id) ->order('sort_order', 'ASC') ->column('button_id'); // 按排序重组按钮 $sortedButtons = []; foreach ($sortedIds as $id) { if (isset($buttons[$id])) { $sortedButtons[] = $buttons[$id]; } } // 添加未排序的按钮 foreach ($buttons as $id => $button) { if (!in_array($id, $sortedIds)) { $sortedButtons[] = $button; } } $this->assign('customButtons', $sortedButtons); return $this->view->fetch(); } ``` #### 三、样式优化 在`public/css`中添加样式: ```css #custom-buttons-container { cursor: move; user-select: none; } #custom-buttons-container a.btn { margin-right: 5px; cursor: move; } ``` #### 四、注意事项 1. **权限控制** - 添加后台权限节点:`yourcontroller/dragSort` - 在权限管理中添加对应规则 2. **数据关联** - 按钮ID应与后台权限节点ID关联 - 每个管理员的排序数据独立存储 3. **移动端适配** ```javascript new Sortable(container, { // ... delayOnTouchOnly: true, touchStartThreshold: 5 }); ``` 4. **性能优化** - 添加防抖处理频繁请求 - 使用本地缓存临时存储排序 [^1]: 关于FastAdmin表格功能的详细说明,参考官方文档:一张图解析FastAdmin中的表格列表功能 [^2]: 弹窗内拖拽排序实现参考:Vue+Sortable.js实现弹窗拖拽排序 --- ### 相关问题 1. **如何实现FastAdmin表格行数据的拖拽排序?** > 可通过类似方案实现,需修改数据提交接口和数据库存储结构,重点处理行数据的ID排序 2. **Sortable.js在移动端有哪些特殊配置?** > 需要配置`touchStartThreshold`和`delayOnTouchOnly`参数,并注意iOS的触摸事件限制 3. **如何实现多管理员共享同一套按钮排序?** > 移除数据库中的`admin_id`字段关联,改为全局配置存储,需添加权限分级控制 4. **拖拽排序后如何实时刷新按钮状态?** > 可通过前端框架(如Vue)实现数据绑定,或使用`location.reload()`强制刷新页面 5. **FastAdmin中如何添加自定义JS模块?** > 通过RequireJS注册新模块,在`public/js`目录添加文件并在配置中声明依赖关系
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值