FastAdmin前端系列4--弹窗选择自定义表格组件fachoosetable,实现弹窗从表格中选择数据,支持多选

前言

需要实现自定义表格数据的弹窗选择,在社区找了找,发现没有很详细的解决方案,问询这个功能的小伙伴也挺多的,K老大都做了回复,提供了思路。
今天参考了附件选择组件的源码和思路,实现了这个弹窗选择自定义表格数据的组件。闲话少叙,直接上码。。。

效果截图

image.png
image.png
image.png

组件属性

需要给你元素的class加上fachoosetable,可以在元素添加以下的属性:
属性             说明                     示例
data-url         弹窗自定义表格的URL       data-url="auth/adminlog/select"data-multiple    是否可选择多个            data-multiple="true"data-user-id     筛选指定用户ID的数据      data-user-id="1"data-admin-id    筛选指定管理员ID的数据    data-admin-id="1"data-maxcount    最大的可选择数           data-maxcount="3"data-input-id    选中后填充的文本框       data-input-id="c-title"

1、控制器

以管理员日志作为自定义表格数据示例
application\admin\controller\auth\Adminlog.php文件添加select方法

/**
 * 选择表格
 */public function select()
{
    if ($this->request->isAjax()) {
        return $this->index();
    }
    return $this->view->fetch();
}

2、添加视图文件select.html

application\admin\view\auth\adminlog\select.html文件

<div class="panel panel-default panel-intro">

    <div class="panel-body no-padding">
        <div id="myTabContent" class="tab-content">
            <div class="tab-pane fade active in" id="one">
                <div class="widget-body no-padding">
                    <div id="toolbar" class="toolbar">
                        {:build_toolbar('refresh')}
                        {if request()->get('multiple') == 'true'}                        <a class="btn btn-danger btn-choose-multi">
                            <i class="fa fa-check"></i> {:__('Choose')}                        </a>
                        {/if}                    </div>
                    <table id="table" class="table table-bordered table-hover" width="100%">

                    </table>
                </div>
            </div>
        </div>
    </div></div>

3、对应js

public\assets\js\backend\auth\adminlog.js文件添加select方法

select: function () {    // 初始化表格参数配置
    Table.api.init({
        extend: {
            index_url: 'auth/adminlog/select',
        }
    });    var table = $("#table");    // 复选框的处理事件---start---
    var idArr = [];    var results = [];    var multiple = Backend.api.query('multiple');
    multiple = multiple == 'true' ? true : false;
    table.on('check.bs.table uncheck.bs.table check-all.bs.table uncheck-all.bs.table', function (e, row) {        if (e.type == 'check' || e.type == 'uncheck') {
            row = [row];
        } else {
            idArr = [];
            results = [];
        }
        $.each(row, function (i, j) {            if (e.type.indexOf("uncheck") > -1) {                var index = idArr.indexOf(j.id);                if (index > -1) {
                    idArr.splice(index, 1);
                    results.splice(index, 1);
                }
            } else {
                idArr.indexOf(j.id) == -1 && idArr.push(j.id) && results.push(row);
            }
        });
    });    // 复选框的处理事件---end---
    // 点击工具栏的选择按钮触发事件
    $(document).on("click", ".btn-choose-multi", function () {
        Fast.api.close({id: idArr.join(","), multiple: multiple, rows: results}); // 回传数据给Fast.api.open的callback
    });    // 初始化表格
    table.bootstrapTable({
        url: $.fn.bootstrapTable.defaults.extend.index_url,
        sortName: 'id',
        showToggle: false,
        showExport: false,
        maintainSelected: true,
        columns: [
            [
                {field: 'state', checkbox: multiple, visible: multiple, operate: false},
                {field: 'id', title: 'ID', operate: false},
                {field: 'username', title: __('Username'), 
                    formatter: Table.api.formatter.search},
                {field: 'title', title: __('Title'), operate: 'LIKE %...%',
                    placeholder: '模糊搜索'},
                {field: 'url', title: __('Url'), formatter: Table.api.formatter.url},
                {field: 'ip', title: __('IP'), events: Table.api.events.ip,
                    formatter: Table.api.formatter.search},
                {field: 'browser', title: __('Browser'), operate: false, 
                    formatter: Controller.api.formatter.browser},
                {field: 'createtime', title: __('Create time'), 
                    formatter: Table.api.formatter.datetime, operate: 'RANGE', 
                    addclass: 'datetimerange', sortable: true},
                {
                    field: 'operate', title: __('Operate'), events: {                        'click .btn-chooseone': function (e, value, row, index) {                            // 回传数据给Fast.api.open的callback
                            Fast.api.close({id: row.id, multiple: multiple}); 
                        },
                    }, formatter: function () {                        return '<a href="javascript:;" 
                        class="btn btn-danger btn-chooseone btn-xs">
                        <i class="fa fa-check"></i> ' + __('Choose') + '</a>';
                    }
                }
            ]
        ]
    });    // 为表格绑定事件
    Table.api.bindevent(table);
},

4、框架js定义组件

注意:如不希望更改框架源码,即不想封装成公用组件,则忽略4、这一步骤,请直接到5、
public\assets\js\require-form.js文件

Form.events里面添加fachoosetable function

    fachoosetable: function (form) {        //绑定fachoosetable选择表格事件
        if ($(".fachoosetable", form).size() > 0) {
            $(".fachoosetable", form).on('click', function () {                var that = this;                var multiple = $(this).data("multiple") ? $(this).data("multiple") : false;                var admin_id = $(this).data("admin-id") ? $(this).data("admin-id") : '';                var user_id = $(this).data("user-id") ? $(this).data("user-id") : '';                var url = $(this).data("url") ? $(this).data("url") : (typeof Backend !== 
                'undefined' ? "auth/adminlog/select" : "");
                parent.Fast.api.open(url + "?element_id=" + $(this).attr("id") + 
                "&multiple=" + multiple + "&admin_id=" + admin_id + "&user_id=" + user_id,                 __('Choose'), {                    callback: function (data) {                        var button = $("#" + $(that).attr("id"));                        var maxcount = $(button).data("maxcount");                        var input_id = $(button).data("input-id") ? $(button)
                        .data("input-id") : "";
                        maxcount = typeof maxcount !== "undefined" ? maxcount : 0;                        if (input_id && data.multiple) {                            var idArr = [];                            var inputObj = $("#" + input_id);                            var value = $.trim(inputObj.val());                            if (value !== "") {
                                idArr.push(inputObj.val());
                            }
                            idArr.push(data.id)                            var result = idArr.join(",");                            if (maxcount > 0) {                                var nums = value === '' ? 0 : value.split(/\,/).length;                                var files = data.id !== "" ? data.id.toString().split(/\,/) : [];                                var remains = maxcount - nums;                                if (files.length > remains) {                                    Toastr.error(__('You can choose up to %d row%s'
                                    , remains));                                    return false;
                                }
                            }
                            inputObj.val(result).trigger("change").trigger("validate");
                        } else {
                            $("#" + input_id).val(data.id).trigger("change")
                            .trigger("validate");
                        }
                    }
                });                return false;
            });
        }
    },

api.bindevent里引用:

    events.fachoosetable(form);

5、使用弹窗选择自定义表格组件

在测试管理的添加弹框页面调用fachoosetable组件
application\admin\view\test\add.html文件编辑一下标题处代码

<div class="form-group">
    <label class="control-label col-xs-12 col-sm-2">{:__('Title')}:</label>
    <div class="col-xs-12 col-sm-8">
        <div class="input-group">
            <input id="c-title" class="form-control" name="row[title]" type="text" value="">
            <div class="input-group-addon no-border no-padding">
                <span><button type="button" id="fachoosetable-title" 
                data-url="auth/adminlog/select" data-maxcount="3" data-admin-id="1" 
                class="btn btn-success fachoosetable" data-input-id="c-title"
                 data-multiple="true"><i class="fa fa-list"></i> {:__('Choose Table')}                 </button></span>
            </div>
        </div>
    </div></div><div class="form-group" style="display: none;" id="target">
    <label class="control-label col-xs-12 col-sm-2">选中的标题:</label>
    <div class="col-xs-12 col-sm-8">
        <table id="table" class="table table-striped table-bordered table-hover table-nowrap" width="100%">
            <thead>
                <tr>
                    <th style="text-align: center; vertical-align: middle; " data-field="id">
                        <div class="th-inner ">ID</div>
                        <div class="fht-cell"></div>
                    </th>
                    <th style="text-align: center; vertical-align: middle; " data-field="user_id">
                        <div class="th-inner ">用户名</div>
                        <div class="fht-cell"></div>
                    </th>
                    <th style="text-align: center; vertical-align: middle; " data-field="user.nickname">
                        <div class="th-inner ">标题</div>
                        <div class="fht-cell"></div>
                    </th>
                </tr>
            </thead>
            <tbody data-listidx="0" id="targetTr">

            </tbody>
        </table>
    </div></div>

设置多语言 application\admin\lang\zh-cn.php

'Choose Table'                  => '从列表中选择','You can choose up to %d row%s' => '你最多还可以选择%d行',

6、注意:如果不想更改框架源码,请忽略步骤4,使用下面的方案

public\assets\js\backend\test.js文件的add: function () {里面追加以下代码:

var form = $("form[role=form]");fachoosetable(form);function fachoosetable (form) {    if ($(".fachoosetable", form).size() > 0) {
        $(".fachoosetable", form).on('click', function () {            var that = this;            var multiple = $(this).data("multiple") ? $(this).data("multiple") : false;            var admin_id = $(this).data("admin-id") ? $(this).data("admin-id") : '';            var user_id = $(this).data("user-id") ? $(this).data("user-id") : '';            var url = $(this).data("url") ? $(this).data("url") : (typeof Backend !== 
            'undefined' ? "auth/adminlog/select" : "");
            parent.Fast.api.open(url + "?element_id=" + $(this).attr("id") + 
            "&multiple=" + multiple + "&admin_id=" + admin_id + "&user_id=" + user_id,             __('Choose'), {                callback: function (data) {                    var button = $("#" + $(that).attr("id"));                    var maxcount = $(button).data("maxcount");                    var input_id = $(button).data("input-id") ? $(button)
                    .data("input-id") : "";
                    maxcount = typeof maxcount !== "undefined" ? maxcount : 0;                    if (input_id && data.multiple) {                        var idArr = [];                        var inputObj = $("#" + input_id);                        var value = $.trim(inputObj.val());                        if (value !== "") {
                            idArr.push(inputObj.val());
                        }
                        idArr.push(data.id)                        var result = idArr.join(",");                        if (maxcount > 0) {                            var nums = value === '' ? 0 : value.split(/\,/).length;                            var files = data.id !== "" ? data.id.toString().split(/\,/) : [];                            var remains = maxcount - nums;                            if (files.length > remains) {                                Toastr.error(__('You can choose up to %d row%s'
                                , remains));                                return false;
                            }
                        }
                        inputObj.val(result).trigger("change").trigger("validate");
                    } else {
                        $("#" + input_id).val(data.id).trigger("change")
                        .trigger("validate");
                    }                    var targetTr = '';                    if (data.rows.length) {
                        $('#target').css('display','block');
                        $.each(data.rows, function (i, j) {                            var tr = `<tr data-index=${i}>
                                <td style="text-align: center; vertical-align: middle; ">${j[0].id}</td>
                                <td style="text-align: center; vertical-align: middle; ">${j[0].username}</td>
                                <td style="text-align: center; vertical-align: middle; ">${j[0].title}</td>
                            </tr>`
                            targetTr += tr; 
                        });
                        $('#targetTr').append(targetTr);
                    }
                }
            });            return false;
        });
    }
}

2022-06-28【更新】使用组件的下方展示选中的行信息

背景:

评论区小伙伴需要展示选中行的某几列信息,于是我就魔改了一下初步实现效果,写法可能不是很优雅,小伙伴有好的方式可以教教我哈~

效果图:

image.png

更新点:

1、在application\admin\view\test\add.html追加代码:

<div class="form-group" style="display: none;" id="target">
    <label class="control-label col-xs-12 col-sm-2">选中的标题:</label>
    <div class="col-xs-12 col-sm-8">
        <table id="table" class="table table-striped table-bordered table-hover table-nowrap" width="100%">
            <thead>
                <tr>
                    <th style="text-align: center; vertical-align: middle; " data-field="id">
                        <div class="th-inner ">ID</div>
                        <div class="fht-cell"></div>
                    </th>
                    <th style="text-align: center; vertical-align: middle; " data-field="user_id">
                        <div class="th-inner ">用户名</div>
                        <div class="fht-cell"></div>
                    </th>
                    <th style="text-align: center; vertical-align: middle; " data-field="user.nickname">
                        <div class="th-inner ">标题</div>
                        <div class="fht-cell"></div>
                    </th>
                </tr>
            </thead>
            <tbody data-listidx="0" id="targetTr">

            </tbody>
        </table>
    </div></div>

2、更新了public\assets\js\backend\auth\adminlog.js文件中的select方法
3、更新了public\assets\js\backend\test.js文件的add: function () {里面fachoosetable函数


«    2025年7月    »
123456
78910111213
14151617181920
21222324252627
28293031
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
搜索
    文章归档
    网站收藏
    友情链接

    Powered By Z-BlogPHP 1.7.4

    周易八字研究笔记 豫ICP备2021017518号-3     豫公网安备41077102000113