Laravel-admin 內聯表格【行展開】,格式化資料並新增頁碼!

zhaiduting發表於2020-02-09

經過數日摸索,終於找到了行展開後的表格新增頁碼的方法。效果如gif動畫所示
laravel-admin內聯表格【行展開】,格式化資料並新增頁碼!

相關程式碼如下

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 協議》,轉載必須註明作者和本文連結

相關文章