經過數日摸索,終於找到了行展開後的表格新增頁碼的方法。效果如gif動畫所示
相關程式碼如下
protected function grid()
{
$grid = new Grid(new Role());
$grid->column('id', 'ID');
$grid->column('name', '角色名稱')
->expand(function($model){
$users= $model->users()
->paginate(2, ['*'], 'row'. $this->id)
->appends('page', request('page'));
$pagination= $users->toHtml(); //或者 $users->links()
$array= $users->map(function($user){
$user->name=
"<a target='_blank' href='". route('users.show', $user->id). "'>".
"<img class='img-thumbnail' width='30px' src='".
$user->avatar ."'> ".
$user->name.
"</a>";
return $user->only(['id', 'name']);
})->toArray();
$array[]['id']= $pagination; //追加分頁程式碼到新行的第一列
return (new Table(['id', '使用者名稱'], $array));
});
$grid->column('permissions', '許可權')->pluck('name')->label('default');
$grid->paginate(6);
return $grid;
}
行擴充套件的關鍵程式碼是$grid->column(..)->expand(function($model){..})
,這裡面涉及到一個回撥函式。分頁按鈕、資料格式化功能就是通過這個回撥函式實現的。
1、連結http://w.bbs.cc/admin/roles?page=2&row11=2
表示的是第2頁、id為11的資料。
由於這是一個多欄分頁的頁面,分頁引數彼此不能衝突,所以採用了 row1、row2、...這樣的分頁引數。paginate(2, ['*'], 'row'. $this->id)
主要解決的就是這個引數衝突問題。
2、僅僅解決引數衝突問題還不夠,還必須附帶新增外層表格的分頁引數,appends('page', request('page'))
解決的就是引數附加問題。
3、$pagination= $users->toHtml();
將前面定製好的分頁程式碼提取出來。
4、$array[]['id']= $pagination;
將提取出來的分頁程式碼偽裝成新行,新增到內聯表格裡面。這樣頁面就可以成功顯示分頁按鈕了!
5、在expand()的回撥函式內部有一個陣列對映的回撥函式,$users->map(function($user){..})
,這個函式裡面實現了格式化功能(顯示使用者頭像並新增跳轉連結)。
感覺程式碼寫得很粗糙,尤其是$user->name的替換操作更是麻煩。如果大家有更加優雅的寫法,敬請分享一下,謝謝!
這裡面還有個令人不爽的大問題:點選分頁按鈕後,之前原本展開的行沒能保持展開狀態。求解!
另外,將分頁程式碼新增到新行的話,可能需要設定colspan="2"
這樣的屬性,也不知道怎麼新增進去。
本作品採用《CC 協議》,轉載必須註明作者和本文連結