一張圖解析 FastAdmin 中的表格列表

作者:辰風沐陽 閱讀:2647 發(fā)布時間:2022-06-20 上次更新:2023-04-25

前言


該圖片取自 fastadmin 問答區(qū): https://ask.fastadmin.net/article/323.html

  1. // 初始化表格
  2. table.bootstrapTable({
  3. // 禁止雙擊打開編輯頁面
  4. dblClickToEdit: false,
  5. // 關閉快速搜索
  6. search: false,
  7. // 關閉瀏覽模式
  8. showToggle: false,
  9. // 關閉自定義顯示列
  10. showColumns: false,
  11. // 關閉導出功能
  12. showExport: false,
  13. // 關閉通用搜索
  14. commonSearch: false,
  15. })

1. 菜單名稱和描述


默認生成的 CRUD

當一鍵生成 CRUD 時, fastadmin 會自動創(chuàng)建表的控制器, 并將表注釋作為控制器類的文檔注釋存放在文件中

  1. php think crud -t test

一鍵生成菜單時,將自動取控制器類的文檔注釋作為菜單的名稱

在后臺 權限管理-菜單規(guī)則 中修改菜單的備注,填寫備注后菜單名稱和描述區(qū)域將自動顯示

  1. php think menu -c test

2. TAB 過濾選項卡


在一鍵生成 CRUD 時,表中如果存在 status 字段且為 enum 類型,則會生成相應的 TAB 過濾選項卡

  1. php think crud -t test

如果需要生成其它字段的過濾選項卡,則可以在一鍵生成 CRUD時使用 --headingfilterfield=字段名

  1. php think crud -t test --headingfilterfield=state

3. 通用搜索


通用搜索表單內(nèi)容是根據(jù) table.bootstrapTable 配置的 columns 屬性決定的。如果要刪除某一列的搜索,在 js 中配置 operate:false 即可,operate 用于查詢時的操作符,默認為 =,修改為 false 表示禁用該字段的通用搜索

  1. table.bootstrapTable({
  2. // 關閉通用搜索
  3. commonSearch: false,
  4. // 通用搜索表單默認顯示
  5. searchFormVisible: true,
  6. columns: [[
  7. // operate: false 字段列不參與通用搜索
  8. { field: 'img', title: '圖片', operate: false },
  9. // searchList 將通用搜索中的狀態(tài)修改為下拉選擇框
  10. {
  11. field: 'status', title: '狀態(tài)',
  12. searchList: { 1: __('Open'), 0: __('Close') }
  13. }
  14. ]]
  15. })

4. 工具欄按鈕


一鍵生成菜單時會自動生成 添加、編輯、刪除、更多按鈕的 HTML,這些按鈕會根據(jù)用戶是否擁有的權限來決定顯示或隱藏

我們可在控制器對應的視圖文件 index.html 中任意添加、刪除、修改對應的按鈕,這幾個自動生成的按鈕都通過擁有的 class 屬性來綁定相關的事件,例如添加按鈕擁有 btn-add 這個 class,框架已經(jīng)占有的 class 如下所示:

  1. btn-add: 添加按鈕
  2. btn-edit: 編輯按鈕
  3. btn-del: 刪除按鈕
  4. btn-import: 導入按鈕
  5. btn-more: 更多按鈕
  6. btn-multi: 指操作使用
  7. btn-disabled: 添加此 class 后則只有在列表有選中數(shù)據(jù)時按鈕才會變?yōu)榭墒褂?

如果想要點擊 添加按鈕 默認全屏,那么給添加按鈕加上 data-area='["100%","100%"] 屬性即可

  1. <a href="javascript:;" class="btn btn-success btn-add" data-area='["100%","100%"]'>
  2. <i class="fa fa-plus"></i> {:__('Add')}
  3. </a>

如果想要自定義按鈕并添加事件,我們需要在視圖中添加相應的 HTML 代碼,然后在對應的 JS 文件中添加按鈕的執(zhí)行事件

增加自定義按鈕后應在 權限管理-菜單規(guī)則 中添加該按鈕的權限

  1. <a href="javascript:;" class="btn btn-success btn-test">
  2. <i class="fa fa-plus"></i>導出
  3. </a>
  1. var Controller = {
  2. // ...
  3. }
  4. $('.btn-test').click(function () {
  5. console.log('btn-test 被點擊了..');
  6. })

工具欄按鈕是寫在 html 文件中的,要想隱藏按鈕,注釋掉即可

5. 動態(tài)渲染統(tǒng)計信息


有些時候需要在頁面額外顯示服務端傳回的動態(tài)數(shù)據(jù),比如: 數(shù)據(jù)合計。修改 index.html 視圖 (一般放在工具欄)

  1. <a href="javascript:;" class="btn btn-default" style="font-size:14px;color:dodgerblue;">
  2. <i class="fa fa-dollar"></i>
  3. <span class="extend">
  4. 金額:<span id="money">0</span>
  5. 單價:<span id="price">0</span>
  6. </span>
  7. </a>

然后在控制器對應的 JS 中的 index 方法中添加以下的 JS,data 是表格數(shù)據(jù)接口的返回值

  1. // 當表格數(shù)據(jù)加載完成時
  2. table.on('load-success.bs.table', function (e, data) {
  3. // 這里可以獲取從服務端獲取的JSON數(shù)據(jù)
  4. console.log(data);
  5. // 這里我們手動設置底部的值
  6. $("#money").text(data.extend.money);
  7. $("#price").text(data.extend.price);
  8. });

6. 快速搜索


快速搜索查詢條件: where 字段 like '%關鍵詞%'

快速搜索在鍵入關鍵詞時將實時從服務端搜索數(shù)據(jù),當數(shù)據(jù)表數(shù)據(jù)較大時,建議關閉此功能(在表格初始化時關閉)

默認只會搜索主鍵id這個字段,如果需要搜索其它字段,則需要在控制器中定義 $searchFields 性指定搜索字段

  1. // 自定義快速搜索文本框中的 placeholder, 必須在 table.bootstrapTable() 前定義
  2. $.fn.bootstrapTable.locales[Table.defaults.locale]['formatSearch'] = function () {
  3. return "自定義placeholder文本"
  4. };
  5. // 表格初始化
  6. table.bootstrapTable({
  7. // 關閉快速搜索
  8. search: false,
  9. })

如果使用了關聯(lián)查詢,此時快速搜索默認的根據(jù) id 查詢會報錯

  1. // 關聯(lián)查詢
  2. with(["admin"])
  3. // 快速搜索報錯
  4. SQLSTATE[23000]: Integrity constraint violation: 1052 Column 'id' in where clause is ambiguous

定義屬性指定查找的字段,字段前面帶上表名前綴即可

  1. // 快速搜索時執(zhí)行查找的字段(user是當前模型)
  2. protected $searchFields = ['user.id', 'admin.username'];

7. 瀏覽模式、顯示隱藏列、導出、通用搜索


瀏覽模式可以切換卡片視圖和表格視圖兩種模式,關閉此功能使用: showToggle: false

顯示隱藏列可以快速切換字段列的顯示和隱藏,關閉此功能使用: showColumns: false

導出按鈕默認將導出整個表的所有行,關閉導出功能使用: showExport: false

通用搜索指表格上方的搜索,關閉此功能使用: commonSearch: false

  1. table.bootstrapTable({
  2. // 關閉瀏覽模式切換
  3. showToggle: false,
  4. // 關閉自定義顯示列切換
  5. showColumns: false,
  6. // 關閉導出功能
  7. showExport: false,
  8. // basic 導出當前頁數(shù)據(jù) selected 導出選中的行
  9. exportDataType: 'basic',
  10. // 關閉通用搜索功能
  11. commonSearch: false,
  12. columns: [[
  13. // visible: false 字段列默認隱藏
  14. // operate: false 字段列不參與通用搜索
  15. { field: 'name', title: __('Name'), visible: false, operate: false }
  16. ]]
  17. })

9. 復選框


一鍵生成菜單的視圖文件默認都有復選框,不需要復選框刪除 js 中 columns 屬性的 { checkbox: true } 即可

  1. table.bootstrapTable({
  2. // 啟用跨頁選擇
  3. maintainSelected: true,
  4. columns: [[
  5. // 不需要復選框時移除下面代碼即可
  6. { checkbox: true },
  7. ]]
  8. })

10. 分類名稱(關聯(lián)查詢)


  1. protected $relationSearch = true; // 關聯(lián)查詢

11. 標志


  1. table.bootstrapTable({
  2. columns: [[
  3. {
  4. field: 'index', title: '標志',
  5. // 渲染標志字段
  6. formatter: Table.api.formatter.flag,
  7. // 擴展額外的顏色
  8. custom: { aaa: 'info', bbb: 'danger' }
  9. },
  10. ]]
  11. })

12. 圖片和圖片組


  1. // formatter: Table.api.formatter.image 支持的數(shù)據(jù)值
  2. https://img.itqaq.com/7b275c.png
  3. // formatter: Table.api.formatter.images 支持以下兩種數(shù)據(jù)值
  4. // https://img.itqaq.com/7b275c.png,https://img.itqaq.com/bdab5.png 字符串
  5. // ["https://img.itqaq.com/7b275c.png", "https://img.itqaq.com/bdab5.png"] 圖片數(shù)組
  1. table.bootstrapTable({
  2. columns: [[
  3. { field: 'img', title: '圖片', formatter: Table.api.formatter.image },
  4. { field: 'imgs', title: '圖片組', formatter: Table.api.formatter.images },
  5. ]]
  6. })

13. 開關


  1. table.bootstrapTable({
  2. columns: [[
  3. {
  4. field: 'status', title: '狀態(tài)',
  5. // formatter:Table.api.formatter.toggle 生成開關組件
  6. // yes、no 自定義開和關對應的值
  7. formatter: Table.api.formatter.toggle, yes: 'open', no: 'close',
  8. }
  9. ]]
  10. })

14. 狀態(tài)渲染


  1. table.bootstrapTable({
  2. columns: [[
  3. {
  4. field: 'status', title: '狀態(tài)',
  5. // 開啟狀態(tài)渲染
  6. formatter: Table.api.formatter.status,
  7. // 擴展值顯示顏色
  8. custom: { rejected: 'danger', agreed: 'success' }
  9. }
  10. ]]
  11. })

15. 自定義按鈕


  1. table.bootstrapTable({
  2. columns: [[
  3. {
  4. field: 'buttons',
  5. width: "120px",
  6. title: __('按鈕組'),
  7. table: table,
  8. events: Table.api.events.operate,
  9. // 自定義按鈕
  10. formatter: Table.api.formatter.buttons,
  11. buttons: []
  12. }
  13. ]]
  14. })