之前使用fastadmin,自定义角色组,发现编辑/删除/修改等等权限可以直接权限管理中选择,然后用不同的角色登陆,会显示对应的权限按钮。此时有一个新的需求就是增加审核和批量审核,并且也增加对应的权限。
添加按钮
先不写功能,在对应的位置上加上审核按钮。在顶头位置的批量审核需要得到的样式如下:
原先的创建按钮方法为:
{:build_toolbar('refresh,edit,checkall')}
有时候不使用buid_toolbar来创建按钮,而是直接使用的
function build_toolbar($btns = NULL, $attr = [])
$auth = \app\admin\library\Auth::instance();
$controller = str_replace('.', '/', strtolower(think\Request::instance()->controller()));
$btns = $btns ? $btns : ['refresh', 'add', 'edit', 'del', 'import','checkall'];
$btns = is_array($btns) ? $btns : explode(',', $btns);
$index = array_search('delete', $btns);
'refresh' => ['javascript:;', 'btn btn-primary btn-refresh', 'fa fa-refresh', '', __('Refresh')],
'add' => ['javascript:;', 'btn btn-success btn-add', 'fa fa-plus', __('Add'), __('Add')],
$btnAttr = array_merge($btnAttr, $attr);
if (!isset($btnAttr[$v]) || ($v !== 'refresh' && !$auth->check("{$controller}/{$v}"))) {
list($href, $class, $icon, $text, $title) = $btnAttr[$v];
具体修改的就是两个地方,第一个是数组$btns,在$btns数组中添加需要的元素,在本例中添加checkall;第二就是修改$btnAttr,根据需要添加一个checkall元素,如下所示:
'checkall'=> ['javascript:;', 'btn btn-success btn-checkall
btn-disabled disabled', 'fa fa-flag-checkered', ' 批量审核', '批量审核'],
这里有需要特别注意的地方是,最好在类中加上btn-disabled disabled两个class,这样可以方便直接获取是否选择。也就是说,在没有选择项的情况下,所有批量操作的按钮都应该是不能点击的。
在修改完buildtoolbar之后在页面上使用应该就是可以直接调用出来了,到此第一步完成。
接下来修改require-table.js文件,因为所有的后台js文件都继承了这个文件,如果用的编辑器或IDE没有历史记录功能那就一定要做好备份。
首先是配置项,extend项代表每个url对应的方法,这里可以设置成缺省为空,然后在需要用到的js文件中再调用。加上checkall和check的URL,最好命名一致,修改完成的extend如下:
只需要按自己的需求把想加的公共方法加上,在config中添加按钮对应的class,比如这里添加:
$(toolbar).on('click', Table.config.checkallbtn, function () {
var ids = Table.api.selectedids(table);
layer.msg('您正在批量修改审核状态,请选择结果', {
$(this).data({'check':1,'tablename':'classes'});
Table.api.multi("checkall", ids, table, $(this));
$(this).data({'check':2,'tablename':'classes'});
Table.api.multi("checkall", ids, table, $(this));
其中Table.config.checkallbtn即之前在config中添加的按钮,其中绑定的类名必须在之前的buildtollbar的对应按钮上有,根据需求,这里设置一个弹窗,以点击通过为例:
multi方法即批量操作方法,因此这里应该直接调用,在multi方法中有以下的一句:
进入到控制器对应的js中调用方法,如果写在trait中,每个控制器都会直接继承,如果使用的地方较少,可以直接使用。地址是admin/library/traits/Backend.php
public function checkall($ids = "")
$row = $this->model->get($ids);
$this->error(__('No Results were found'));
$adminIds = $this->getDataLimitAdminIds();
if (!in_array($row[$this->dataLimitField], $adminIds)) {
$this->error(__('You have no permission'));
if ($this->request->isPost()) {
$values = $this->request->post()['params'];
$res =Db::name($values['tablename'])->where('id','IN',$ids)->update(['check'=>$values['check']]);
以上操作顺利完成之后显示的会是没有操作权限;首先进入规则管理,添加刚才新增的方法对应的规则,例如这里添加的是check:
之后进入角色组,在角色组对应的权限中勾选,此时就可以加上对应的权限,这是很重要的一步:
data-operate-check="{:$auth->check('course/clabelong/check')}"
data-operate-checkall="{:$auth->check('course/clabelong/checkall')}"**
此时再登录不同的用户,例如教师组没有批量审核权限,那么无法显示批量审核按钮。
除了批量操作,其实还可以单个操作,单个操作和批量操作稍有不同,但是更简单。可以仿照单元格元素事件来写,结果如下:
'click .btn-checkone': function (e, value, row, index) {
var table = $(this).closest('table');
var options = table.bootstrapTable('getOptions');
row = $.extend({}, row ? row : {}, {ids: ids});
var url = options.extend.check_url;
Fast.api.open(Table.api.replaceurl(url, row, table), '审核', $(this).data() || {});
if (options.extend.check_url !== '') {
classname: 'btn btn-xs btn-success btn-checkone',
在require-table中可能还有需要修改的地方,但是关键是按照原先的add.del等写好的方法来参照,基本上就不会出错了。