功能描述
請根據圖片上的數字索引查看對應功能說明。
1.時間篩選器
如果想在搜索欄使用時間區間進行搜索,則可以在JS中修改修改字段屬性,如
{field: 'createtime', title: __('Create Time'), formatter: Table.api.formatter.datetime, operate: 'BETWEEN', type: 'datetime', addclass: 'datetimepicker', data: 'data-date-format="YYYY-MM-DD"'},
其中type
為類型,使用datetime
將會把結果轉換成時間戳進行搜索,如果你的數據庫存儲的是日期時間型數據,則移除該type
屬性,data
指附件到input文本框上的屬性
最新版FastAdmin已經支持用戶體驗更好的datetimerange
插件,使用方式是:
{field:'createtime', title: __('Create Time'), formatter: Table.api.formatter.datetime, operate: 'RANGE', addclass:'datetimerange'}
2.狀態列表
默認我們的搜索都是一個文本框,如果需要改成下拉列表框,則需要使用如下代碼
{field: 'status', title: __('Status'), formatter: Table.api.formatter.status, searchList: {'normal': __('Normal'), 'hidden': __('Hidden')}, style: 'min-width:100px;'},
其中searchList
使用的是一個JSON數據,同時searchList
仍然支持數據、JSON對象、Ajax對象、Function函數。
普通搜索欄的搜索薦默認都是全部啟用的,如果想禁用字段在普通搜索欄的顯示,可以在字段屬性中添加operate: false
來禁用,如下方代碼
{field: 'status', title: __('Status'), operate:false, formatter: Table.api.formatter.status}
3.添加、編輯、刪除、導入、批量操作按鈕
FastAdmin的添加、編輯、刪除按鈕默認是由{:build_toolbar()}
生成的,默認是全部生成。如果我們只需要其中的部分按鈕,則可以傳入參數來實現,如{:build_toolbar('refresh,add')}
,這樣將只會生成刷新和添加按鈕。同時也支持調整參數的位置來調整最后生成的位置,另外請注意{:build_toolbar()}
還會根據當前管理員的權限判斷按鈕是否顯示,例如你使用{:build_toolbar('refresh,add')}
,如果當前管理員沒有添加的權限,添加按鈕仍然不會顯示 。
目前build_toolbar
支持的按鈕有:
refresh: 刷新按鈕
add: 添加
edit: 編輯
del: 刪除
import: 導入
批量操作按鈕是直接在視圖頁面上添加的HTML代碼,直接修改即可。
啟用導入請參考:https://forum.fastadmin.net/d/540
4.自定義搜索
FastAdmin中的Bootstrap-table
表格的自定義搜索功能是非常強大的,我們可以按需要修改來實現自己的搜索功能,這里實現的功能是點擊自定義搜索
則發起搜索分類ID為1的數據,代碼如下:
$(document).on("click", ".btn-singlesearch", function () { var options = table.bootstrapTable('getOptions'); options.pageNumber = 1; options.queryParams = function (params) { return { search: params.search, sort: params.sort, order: params.order, filter: JSON.stringify({category_id: 1}), op: JSON.stringify({category_id: '='}), offset: params.offset, limit: params.limit, }; }; table.bootstrapTable('refresh', {}); Toastr.info("當前執行的是自定義搜索"); return false; });
首先我們為自定義搜索這個按鈕綁定上點擊事件,這樣當我們點擊按鈕時則發起搜索請求。其次注意我們獲取了Bootstra-table表格的屬性配置,並修改了其中的pageNumber
和queryParams
,pageNumber
指頁碼置為第一頁,queryParams
是這里的重點,我們修改了其中的filter
和op
,filter
是我們的過濾條件,op
是我們的條件操作符,操作符支持=、!=、LIKE、NOT LIKE、>、>=、<、<=、IN(...)、NOT IN(...)、BETWEEN、NOT BETWEEN、LIKE %...%、IS NULL、IS NOT NULL
,這里的filter
和op
支持同時搜索多個條件。
5.快速搜索
快速搜索在鍵入關鍵詞時將實時從服務端搜索數據,如果你的數據表數據較大,建議關閉此功能,關閉的方法是使用search:false
,其次快速搜索默認只會搜索主鍵id
這個字段,如果你需要搜索其它字段,則需要在服務端你的控制器中定義$searchFields
這個值,如下
protected $searchFields = 'id,name,title';
這樣在快速搜索時將會搜索id,name,title
這三個字段。
如果需要修改默認文本框的placeholder
,可以在表格初始化前定義
$.fn.bootstrapTable.locales[Table.defaults.locale]['formatSearch'] = function(){return "自定義placeholder文本";};
6.瀏覽模式、顯示隱藏列、導出、通用搜索
瀏覽模式可以切換卡片視圖和表格視圖兩種模式,如果不需要此功能,可以設置showToggle: false
顯示隱藏列可以快速切換字段列的顯示和隱藏,如果不需要此功能,可以設置showColumns: false
,如果想要表格中的字段列默認隱藏可以設置字段屬性visible: false
即可默認隱藏
導出按鈕默認將導出整個表的所有行,如果需要僅導出當前分頁的數據,需要設置exportDataType: 'basic'
,如果想導出選中的行,則可以設置為exportDataType: 'selected'
,如果不需要此功能,可以設置showExport: false
通用搜索指表格上方的搜索,通用搜索的表單默認是隱藏的,如果需要默認顯示,需要設置searchFormVisible: true
,如果不需要通用搜索功能,可以設置commonSearch: false
。如果想要控制字段列不參考搜索則可以設置字段列屬性為operate: false
即可。
7. 分類名稱(關聯搜索出分類表的名稱)
這里顯示的分類名稱是根據分類表關聯查詢出來的結果,如果我們啟用關聯查詢,我們必須在當前控制器中設置屬性protected $relationSearch = true;
,同時我們的index
方法也需要重寫,請參考下方的完整代碼中PHP部分。如果我們啟用了關聯查詢,當兩個表中的字段有沖突時,我們必須在字段中加上別名。請參考下方的完整代碼中JS部分。
8.標志和圖片
FastAdmin封裝了許多常用的方法,我們可以快速的調用即可。
Table.api.formatter.icon
快速將字段渲染成一個按鈕,僅支持Fontawesome按鈕
Table.api.formatter.image
快速將字段渲染成圖片展示的形式
Table.api.formatter.images
快速將字段渲染成多圖片展示的形式,字段數據請以,
進行分隔
Table.api.formatter.status
快速將字段渲染成狀態,默認normal/hidden/deleted/locked
這四個狀態
Table.api.formatter.url
快速將字段渲染成URL框
Table.api.formatter.search
快速將字段渲染成可搜索的鏈接,點擊后將執行搜索
Table.api.formatter.addtabs
快速將字段渲染成可添加到選項卡的鏈接,點擊后將把鏈接添加到選項卡
Table.api.formatter.flag
快速將字段渲染成標志,僅支持index/hot/recommend/new
這四種標志
Table.api.formatter.label
快速將字段渲染Label標簽
Table.api.formatter.datetime
快速時間戳數據渲染成日期時間數據
Table.api.formatter.operate
操作欄固定按鈕
Table.api.formatter.buttons
快速生成多個按鈕
Table.api.formatter.toggle
快速生成切換按鈕
9.狀態
此處的狀態是根據第8項中的Table.api.formatter.status
進行生成的。如果需要傳入其它狀態,請使用custom
參數,參數配置為{狀態1: 'success', 狀態2: 'grey'}
10.按鈕組
按鈕組的功能是根據第8項中的Table.api.formatter.buttons
進行生成的,代碼如下
{field: 'id', title: __('按鈕'), table: table, buttons: [ {name: 'name1', text: '彈窗', title: '彈窗標題', icon: 'fa fa-list', classname: 'btn btn-xs btn-primary btn-dialog', url: 'page/detail', callback:function(data){}}, {name: 'name2', text: 'Ajax', title: 'Ajax標題', icon: 'fa fa-flash', classname: 'btn btn-xs btn-success btn-ajax', url: 'page/detail', success:function(data, ret){}, error:function(){}}, {name: 'name3', text: '選項卡', title: '選項卡標題', icon: 'fa fa-flash', classname: 'btn btn-xs btn-info btn-addtabs', url: 'page/detail'} ], operate:false, formatter: Table.api.formatter.buttons}
按鈕配置支持的參數有:
name
按鈕唯一標識,其中add/edit/del/dragsort
已經被占用,請勿使用。我們可以在HTML視圖文件的table
使用data-buttons-標識
來控制顯示
text
按鈕的文本內容,如果不需要顯示文本可忽略
title
鼠標移上去的標題或彈窗/選項
顯示的標題
icon
按鈕的圖標,請使用font-awesome
圖標庫
classname
按鈕的class
, 其中classname
中的btn-dialog、btn-ajax、btn-addtabs
,FastAdmin已經為這幾個固定的Class注冊了事件,所以可以直接使用,如果想要實現其它功能,需要自己手動編寫代碼綁定事件才可使用。
url
按鈕的鏈接/Ajax事件請求的URL/彈窗鏈接/選項卡鏈接,直接function
和string
類型,此鏈接會自動在鏈接后添加ids/{ids}
,{ids}
為當行主鍵ID,如果需要傳遞其它字段值,請在URL中使用{字段名}
占位即可
refresh
自動刷新,只針對btn-ajax
事件
confirm
確認框提示文字,配置后會在確認操作再執行對應的事件,只針對btn-ajax/btn-dialog/btn-addtabs
事件
success
事件成功的回調,只針對btn-ajax
事件
error
事件失敗的回調,只針對btn-ajax
事件
callback
彈窗回傳的回調,只針對btn-dialog
事件
hidden
是否隱藏按鈕,按鈕默認顯示,支持function
和bool
類型
visible
是否顯示按鈕,按鈕默認顯示,支持function
和bool
類型
extend
按鈕擴展信息,可以任意定制按鈕的參數,比如我們想在新窗口中打開鏈接,則配置extend:' target="_blank"'
即可
11.操作
操作區域默認是排序、編輯、刪除
這三個按鈕,此功能也是根據第8項中Table.api.formatter.operate
來實現的。排序按鈕只在表中存在weigh
字段時才會出現,編輯按鈕和刪除按鈕會根據管理員所擁有的權限進行按需顯示。其次Table.api.formatter.operate
也支持buttons
屬性來配置多個其它按鈕,如示例圖中的詳情
按鈕。請參考下方完整代碼中JS部分。
完整代碼
PHP代碼
<?php namespace app\admin\controller; use app\common\controller\Backend; /** * 單頁管理 * * @icon fa fa-circle-o * @remark 用於管理普通的單頁面,通常用於關於我們、聯系我們、商務合作等單一頁面 */ class Page extends Backend { protected $model = null; protected $relationSearch = true; public function _initialize() { parent::_initialize(); $this->model = model('Page'); } /** * 查看 */ public function index() { if ($this->request->isAjax()) { list($where, $sort, $order, $offset, $limit) = $this->buildparams(); $total = $this->model ->with("category") ->where($where) ->order($sort, $order) ->count(); $list = $this->model ->with("category") ->where($where) ->order($sort, $order) ->limit($offset, $limit) ->select(); $result = array("total" => $total, "rows" => $list); return json($result); } return $this->view->fetch(); } }
JS代碼:
define(['jquery', 'bootstrap', 'backend', 'table', 'form'], function ($, undefined, Backend, Table, Form) { var Controller = { index: function () { // 初始化表格參數配置 Table.api.init({ extend: { index_url: 'page/index', add_url: 'page/add', edit_url: 'page/edit', del_url: 'page/del', multi_url: 'page/multi', table: 'page', } }); var table = $("#table"); // 初始化表格 table.bootstrapTable({ url: $.fn.bootstrapTable.defaults.extend.index_url, sortName: 'weigh', columns: [ [ {field: 'state', checkbox: true}, {field: 'id', title: __('Id'), operate: false}, {field: 'category_id', title: __('Category_id'), operate: '='}, {field: 'category.name', title: __('Category'), operate: '=', formatter: Table.api.formatter.search}, {field: 'title', title: __('Title'), operate: 'LIKE %...%', placeholder: '關鍵字,模糊搜索'}, {field: 'flag', title: __('Flag'), formatter: Table.api.formatter.flag, operate: false}, {field: 'image', title: __('Image'), formatter: Table.api.formatter.image, operate: false}, {field: 'views', title: __('Views'), operate: false}, {field: 'comments', title: __('Comments'), operate: false}, {field: 'weigh', title: __('Weigh'), operate: false}, {field: 'status', title: __('Status'), formatter: Table.api.formatter.status, searchList: {'normal': __('Normal'), 'hidden': __('Hidden')}, style: 'min-width:100px;'}, {field: 'createtime', title: __('Create Time'), formatter: Table.api.formatter.datetime, operate: 'BETWEEN', type: 'datetime', addclass: 'datetimepicker', data: 'data-date-format="YYYY-MM-DD"'}, {field: 'id', title: __('按鈕'), table: table, buttons: [ {name: 'detail', text: '彈窗', title: '彈窗標題', icon: 'fa fa-list', classname: 'btn btn-xs btn-primary btn-dialog', url: 'page/detail'}, {name: 'detail', text: 'Ajax', title: 'Ajax標題', icon: 'fa fa-flash', classname: 'btn btn-xs btn-success btn-ajax', url: 'page/detail'}, {name: 'detail', text: '選項卡', title: '選項卡標題', icon: 'fa fa-flash', classname: 'btn btn-xs btn-info btn-addtabs', url: 'page/detail'} ], operate:false, formatter: Table.api.formatter.buttons}, {field: 'operate', title: __('Operate'), table: table, buttons: [ {name: 'detail', text: '詳情', title: '詳情', icon: 'fa fa-list', classname: 'btn btn-xs btn-primary btn-dialog', url: 'page/detail'} ], events: Table.api.events.operate, formatter: Table.api.formatter.operate} ] ], //普通搜索 commonSearch: true, titleForm: '', //為空則不顯示標題,不定義默認顯示:普通搜索 }); // 為表格綁定事件 Table.api.bindevent(table); //指定搜索條件 $(document).on("click", ".btn-singlesearch", function () { var options = table.bootstrapTable('getOptions'); options.pageNumber = 1; options.queryParams = function (params) { return { search: params.search, sort: params.sort, order: params.order, filter: JSON.stringify({category_id: 1}), op: JSON.stringify({category_id: '='}), offset: params.offset, limit: params.limit, }; }; table.bootstrapTable('refresh', {}); Toastr.info("當前執行的是自定義搜索"); return false; }); //獲取選中項 $(document).on("click", ".btn-selected", function () { Layer.alert(JSON.stringify(table.bootstrapTable('getSelections'))); }); //啟動和暫停按鈕 $(document).on("click", ".btn-start,.btn-pause", function () { //在table外不可以使用添加.btn-change的方法 //只能自己調用Table.api.multi實現 Table.api.multi("changestatus", 0, table, this); }); }, add: