自定义按钮(老版)

var table = $("#table");
//自定义按钮弹出的页面设置
table.on('post-body.bs.table', function (e, settings, json, xhr) {
    $(".btn-expenses_house").data("area", ["100%", "100%"]);
});
{
    field: 'refundMontyis',
    title: __('退款'),
    table: table,
    events: Controller.api.events.buttons,
    buttons: [
        {
            name: 'confirm_refund_money',
            text: __('退款'),
            title: __('退款'),
            classname: 'btn btn-xs btn-success btn-refund btn-ajax',
            extend:'data-confirm="确认退款吗?"'
        }
    ],
    formatter: Controller.api.formatter.buttons,
},
api: {
    events:{
        buttons: {
            'click .btn-refund': function (e, value, row, index) {
                e.stopPropagation();
                var that = this;
                var top = $(that).offset().top - $(window).scrollTop();
                var left = $(that).offset().left - $(window).scrollLeft() - 260;
                if (top + 154 > $(window).height()) {
                    top = top - 154;
                }
                if ($(window).width() < 480) {
                    top = left = undefined;
                }
                var index = Layer.confirm(
                    $(that).data('confirm'),
                    {icon: 3, title: __('Warning'), offset: [top, left], shadeClose: true},
                    function (index) {
                        var table = $(that).closest('table');
                        var options = table.bootstrapTable('getOptions');
                        var params = {
                            url: 'mall/order/refund/orderRefund',
                            data: {
                                ids: row[options.pk],
                            }
                        };
                        Fast.api.ajax(params, function (data) {
                            table.bootstrapTable('refresh');
                        });
                        Layer.close(index);
                    }
                );
            }
        }
    },
    formatter:{
        buttons: function (value, row, index) {
            var table = this.table;
            // 操作配置
            var options = table ? table.bootstrapTable('getOptions') : {};
            // 默认按钮组
            var buttons = $.extend([], this.buttons || []);
            var html = [];
            var url, classname, icon, text, title, extend;
            //判断按钮是否显示
            $.each(buttons, function (i, j) {
                var attr = table.data("buttons-" + j.name);
                if (typeof attr === 'undefined' || attr) {
                    url = j.url ? j.url : '';
                    if (url.indexOf("{ids}") === -1) {
                        url = url ? url + (url.match(/(\?|&)+/) ? "&ids=" : "/ids/") + row[options.pk] : '';
                    }
                    url = Table.api.replaceurl(url, value, row, table);
                    url = url ? Fast.api.fixurl(url) : 'javascript:;';
                    classname = j.classname ? j.classname : 'btn-primary btn-' + name + 'one';
                    icon = j.icon ? j.icon : '';
                    text = j.text ? j.text : '';
                    title = j.title ? j.title : text;
                    extend = j.extend ? j.extend : '';
                    if(j.name=='call'&&row.refundStatus!=1){
                        html.push('<a href="' + url + '" class="' + classname + '" ' + extend + ' title="' + title
                            + '"><i class="' + icon + '"></i>' + (text ? ' ' + text : '') + '</a>');
                    }else if(j.name=='all_call'&&row.refundStatus!=1){
                        html.push('<a href="' + url + '" class="' + classname + '" ' + extend + ' title="' + title
                            + '"><i class="' + icon + '"></i>' + (text ? ' ' + text : '') + '</a>');
                    }else{
                        html.push('');
                    }
                }
            });
            return html.join(' ');
        },
    }
}

追加搜索条件

$this->request->filter(['strip_tags']);
if (filter_var($ids, FILTER_VALIDATE_INT)) {
    $append =[['fid'=>$ids]];
} else {
    $append =[['id'=>$ids]];
}
list($where, $sort, $order, $offset, $limit, $orderParams) = $this->buildparams(null, null, $append);
[filter_var PHP 过滤器](https://www.runoob.com/php/php-ref-filter.html)  
filter_var() 函数通过指定的过滤器过滤一个变量

公共搜索

{include file="expenses/index/common_search" /}
<div class="commonsearch-table">
    <form class="form-horizontal form-commonsearch nice-validator n-default" role="form" action="" novalidate="novalidate">
        <fieldset>
            <div class="row">
                <div class="form-group col-xs-12 col-sm-6 col-md-4 col-lg-3">
                    <label for="community_code" class="control-label col-xs-4">{:__('Community')}</label>
                    <div class="col-xs-12 col-sm-8">
                        <select id="community_code" class="form-control selectpicker show-tick" name="query[community_code]" data-live-search="true">
                            <option value="" {in name="query.community_code" value=""}selected{/in}>全部</option>
                            {foreach name="community" item="vo"}
                            <option value="{$vo.code}">{$vo.name}</option>
                            {/foreach}
                        </select>
                    </div>
                </div>
                <div class="form-group col-xs-12 col-sm-6 col-md-4 col-lg-3">
                    <div class="col-sm-8 col-xs-offset-4">
                        <button type="button" class="btn btn-primary" id="common_search">查询</button>
                        <button type="reset" class="btn btn-default">重置</button>
                    </div>
                </div>
            </div>
        </fieldset>
    </form>
</div>
### js 附件:图一、图二
table.bootstrapTable({
    url: $.fn.bootstrapTable.defaults.extend.index_url,
    escape: false, //无限分类字符乱码
    pk: 'id',
    sortName: 'weigh,id',
    sortOrder:'asc,desc',
    //sortName: 'weigh desc,id asc', sortOrder失效
    pagination: true,//是否分页
    pageSize: 10,//每页条数
    commonSearch: false,//是否启用公共搜索
    search:false,//去除右侧搜索框,移除或true为打开
    searchFormVisible:true,//默认显示table搜索框 false 点击显示
    showToggle:false, //去除切换功能,移除或true为打开
    showColumns:false, //去除列功能,移除或true为打开
    showExport:false, //去除导出数据功能,移除或true为打开
    exportTypes: ['csv','excel'],//导出类型
    showJumpto:false, //分页插件,实现自定义跳转页面 [showJumpto](https://ask.fastadmin.net/article/12294.html)  
    pageList: [10, 20, 50, 'All'],//每页条数
    //重组排序字段
    queryParams: function queryParams(params) {
        var searchForm = $("form[role=form]");
        if(searchForm.length){
            var searchFields = searchForm.serializeArray();
            for(var i=0;i<searchFields.length;i++) {
                if(searchFields[i]['value']) {
                    params[searchFields[i]['name']] = searchFields[i]['value'];
                }
            }
        }
        return params;
    },
    queryParamsType : "limit",
    columns: [
        [
            {checkbox: true},
            //sortable 添加排序
            {field: 'id', title: __('Id'),sortable:true},
            //筛选
            {field: 'goods_id', title: __('Goods_id'), operate: "in", formatter: Table.api.formatter.search},
            {field: 'createtime', title: __('Createtime'), operate:'RANGE', addclass:'datetimerange', 
                formatter: Table.api.formatter.datetime,datetimeFormat:"Y-M-D"},
            {field: 'status', title: __('Status'), operate: false, formatter: function (value) {
                var status = (value == '1') ? 'normal' : 'hidden'
                return Table.api.formatter.status(status);
            }},
            {field: 'project', title: __('Project'), formatter: function (project) {
                if(project) {
                    return project.name;
                }
                return '-';
            }},
            {field: 'status', title: __('Status'), operate: false,formatter: function (status) {
                    var types = [__('Status 0'),__('Status 1'),__('Status 2')];
                    return types[status];
            }}
        ]
    ]
});

// 为表格绑定事件 附件图片三
Table.api.bindevent(table);
//点击刷新
$("#common_search").bind("click",function () {
    table.bootstrapTable('refresh',{
        url: $.fn.bootstrapTable.defaults.extend.index_url,
        pageNumber: 1
    });
});
Controller.api.bindevent();

树节点 附件:图四

define(['jquery', 'bootstrap', 'backend', 'table', 'form', 'jstree'], function ($, undefined, Backend, Table, Form, undefined) {
    //读取选中的条目
    $.jstree.core.prototype.get_all_checked = function (full) {
        var obj = this.get_selected(), i, j;
        for (i = 0, j = obj.length; i < j; i++) {
            obj = obj.concat(this.get_node(obj[i]).parents);
        }
        obj = $.grep(obj, function (v, i, a) {
            return v != '#';
        });
        obj = obj.filter(function (itm, i, a) {
            return i == a.indexOf(itm);
        });
        return full ? $.map(obj, $.proxy(function (i) {
            return this.get_node(i);
        }, this)) : obj;
    };
});
api: {
    bindevent: function () {
        Form.api.bindevent($("form[role=form]"), null, null, function () {
            if ($("#treeview").size() > 0) {
                var r = $("#treeview").jstree("get_all_checked");
                $("input[name='row[rules]']").val(r.join(','));
            }
            return true;
        });
        //渲染权限节点树
        //销毁已有的节点树
        $("#treeview").jstree("destroy");
        Controller.api.rendertree(nodeData);
        //全选和展开
        $(document).on("click", "#checkall", function () {
            $("#treeview").jstree($(this).prop("checked") ? "check_all" : "uncheck_all");
        });
        $(document).on("click", "#expandall", function () {
            $("#treeview").jstree($(this).prop("checked") ? "open_all" : "close_all");
        });
    },
    rendertree: function (content) {
        $("#treeview").on('redraw.jstree', function (e) {
            $(".layer-footer").attr("domrefresh", Math.random());
        }).jstree({
            "themes": {"stripes": true},
            "checkbox": {
                "keep_selected_style": false,
            },
            "types": {
                "root": {
                    "icon": "fa fa-folder-open",
                },
                "menu": {
                    "icon": "fa fa-folder-open",
                },
                "file": {
                    "icon": "fa fa-file-o",
                }
            },
            "plugins": ["checkbox", "types"],
            "core": {
                'check_callback': true,
                "data": content
            }
        });
    }
}
> html
<div class="form-group">
    <label class="control-label col-xs-12 col-sm-2">{:__('Permission')}:</label>
    <div class="col-xs-12 col-sm-8">
        <span class="text-muted"><input type="checkbox" name="" id="checkall" /> <label for="checkall"><small>{:__('Check all')}</small></label></span>
        <span class="text-muted"><input type="checkbox" name="" id="expandall" /> <label for="expandall"><small>{:__('Expand all')}</small></label></span>
        <div id="treeview"></div>
    </div>
</div>
<script>
    var nodeData = {:json_encode($nodeList); };
</script>
> php
add.php
$nodeList = \app\admin\model\UserRule::getTreeList();
$this->assign("nodeList", $nodeList);
edit.php
$row = $this->model->get($ids);
if (!$row){
    $this->error(__('No Results were found'));
}
$rules = explode(',', $row['rules']);
$nodeList = \app\admin\model\UserRule::getTreeList($rules);
$this->assign("nodeList", $nodeList);
model
public static function getTreeList($selected = []){
    $ruleList = collection(self::where('status', 'normal')->order('weigh desc,id desc')->select())->toArray();
    $nodeList = [];
    Tree::instance()->init($ruleList);
    $ruleList = Tree::instance()->getTreeList(Tree::instance()->getTreeArray(0), 'name');
    $hasChildrens = [];
    foreach ($ruleList as $k => $v)
    {
        if ($v['haschild'])
            $hasChildrens[] = $v['id'];
    }
    foreach ($ruleList as $k => $v) {
        $state = array('selected' => in_array($v['id'], $selected) && !in_array($v['id'], $hasChildrens));
        $nodeList[] = array('id' => $v['id'], 'parent' => $v['pid'] ? $v['pid'] : '#', 'text' => __($v['title']), 'type' => 'menu', 'state' => $state);
    }
    return $nodeList;
}

移除排序

// 初始化表格参数配置
Table.api.init({
    extend: {
        index_url: 'mall/order/refund/index',
        add_url: 'mall/order/refund/add',
        edit_url: 'mall/order/refund/edit',
        del_url: 'mall/order/refund/del',
        multi_url: 'mall/order/refund/multi',
        dragsort_url: '',//移除排序
        table: 'mall_order_refund',
        //设置不同操作的弹窗宽高
        area: {
            add:['800px','350px'],
            edit:['800px','350px']
        }
    }
});

上传图片绑定事件

// 给上传按钮添加上传成功事件
    $("#plupload-avatar").data("upload-success", function (data) {
        var url = Backend.api.cdnurl(data.url);
        $(".profile-user-img").prop("src", url);
        Toastr.success("上传成功!");
    });
    
    // 给表单绑定事件
    Form.api.bindevent($("#update-form"), function () {
        var url = Backend.api.cdnurl($("#c-avatar").val());
        top.window.$(".user-panel .image img,.user-menu > a > img,.user-header > img").prop("src", url);
        return true;
    });

双击事件

//双击重新加载页面
$(document).on("dblclick", ".sidebar-menu li > a", function (e) {
    $("#con_" + $(this).attr("addtabs") + " iframe").attr('src', function (i, val) {
        return val;
    });
    e.stopPropagation();
});

无刷新 加载 更新 附件:图五

defind 添加 'editable'
var table = $("#table");
//设置字段
var columns = [
    {checkbox: true},
    {field: 'id', title: __('ID')},
    {field: 'goods_id', title: __('Goods_id'), operate: "in", formatter: Table.api.formatter.search, visible:false},
];
//动态追加分类规格作为字段
$.each(Config.specs, function (i, j) {
    var data = {field: "specid_" + i, title: j.specname, operate: 'like'};
    columns.push(data);
});
//追加表后续字段
columns.push({field: 'specitem_ids', title: __('Specitem_ids'), visible:false});
columns.push({field: 'marketprice', title: __('Marketprice'), operate:'BETWEEN', editable: true});
// 初始化表格
table.bootstrapTable({
    url: $.fn.bootstrapTable.defaults.extend.index_url,
    pk: 'id',
    sortName: 'id',
    sortOrder: 'asc',
    columns: columns,
    //pagination: false,
});
// 为表格绑定事件
Table.api.bindevent(table);

附件

图一:图一
图二:图二
图三:图三
图四:图四
图五:图五