```php public function show(Exam $exam) { $user = Auth::user(); if ($user and $user->can('進行測驗')) { $exam->topics = $exam->topics->random(10); } return view('exam.show', compact('exam')); } ``` ``` - 有「進行測驗」權限者: - 題目的部份,測驗本來就有設定一對多,所以,`$exam->topics`會是一個集合(`$exam`此時是`Exam`的資料物件),我們利用`random(10)`來從題目集合中,隨機取10筆來呈現。 ### 二、先簡化單一測驗的視圖 1. 修改`/專案/resources/views/exam/show.blade.php` 樣板,一樣依據權限來呈現不同畫面,不過因為程式碼越來越長,所以,我們可以把一些表單獨立成另外的視圖檔案: - 將編輯測驗的表單獨立成`\專案\resources\views\exam\form.blade.php` ```php @if(isset($topic)) {{ bs()->openForm('patch', "/topic/{$topic->id}", ['model' => $topic]) }} @else {{ bs()->openForm('post', '/topic') }} @endif {{ bs()->formGroup() ->label('題目內容', false, 'text-sm-right') ->control(bs()->textarea('topic')->placeholder('請輸入題目內容')) ->showAsRow() }} {{ bs()->formGroup() ->label('選項1', false, 'text-sm-right') ->control(bs()->text('opt1')->placeholder('輸入選項1')) ->showAsRow() }} {{ bs()->formGroup() ->label('選項2', false, 'text-sm-right') ->control(bs()->text('opt2')->placeholder('輸入選項2')) ->showAsRow() }} {{ bs()->formGroup() ->label('選項3', false, 'text-sm-right') ->control(bs()->text('opt3')->placeholder('輸入選項3')) ->showAsRow() }} {{ bs()->formGroup() ->label('選項4', false, 'text-sm-right') ->control(bs()->text('opt4')->placeholder('輸入選項4')) ->showAsRow() }} {{ bs()->formGroup() ->label('正確解答', false, 'text-sm-right') ->control(bs()->select('ans',[1=>1, 2=>2, 3=>3, 4=>4])->placeholder('請設定正確解答')) ->showAsRow() }} {{ bs()->hidden('exam_id', $exam->id) }} {{ bs()->formGroup() ->label('') ->control(bs()->submit('儲存')) ->showAsRow() }} {{ bs()->closeForm() }} ``` - 然後修改`/專案/resources/views/exam/show.blade.php` 樣板,利用`@include()`引入該檔案,位置放在`exam\form.blade.php`,引入時需寫成`exam.form` ```php @can('建立測驗') @include('exam.form') @endcan ``` - 同樣的,我們把題目的呈現也獨立成一個視圖檔案`\專案\resources\views\exam\topic.blade.php` ```php
```markup @if(Auth::check('建立測驗') || Auth::check('進行測驗')) @can('進行測驗') {{ bs()->openForm('post', '/test') }} @include('exam.topic') {{ bs()->hidden('user_id', Auth::id()) }} {{ bs()->hidden('exam_id', $exam->id) }} {{ bs()->submit('寫完送出') }} {{ bs()->closeForm() }} @else @include('exam.topic') @endcan @else @component('bs::alert', ['type' => 'info']) 共 {{ $exam->topics->count() }} 題 @endcomponent @endif ``` ``` - 由於我們要判斷兩個以上的權限,所以,`@can`無法使用,故改用`Auth::check('建立測驗')`搭配`@if`就可以達成。 - 若是有「進行測驗」權限者,我們就替題目加上表單,讓該表單可以送出。表單送至/test即可,讓考試(test)的模型來儲存資料即可。 - 記得將測驗編號及受測者(登入者)編號放到隱藏欄位中。 使用者編號實際上也可以直接用`Auth::id()`來抓取即可。 - 至於訪客看到的訊息,我們暫時簡單的列出題目數量即可。`$exam->topics`本身是一個集合,要算數量可以用`count()` - alert視窗可以用`class="alert"`來做,也可以用`@component`的方式來做。如果只是簡單的訊息,其實用單純HTML語法來做更簡單。 2. 如: ![](https://campus-xoops.tn.edu.tw/uploads/tad_book3/image/37/l56_057.png) [![到GitHub觀看此單元程式異動](https://campus-xoops.tn.edu.tw/uploads/tad_book3/image/34/to_github.png)](https://github.com/tad0616/exam56/commit/32a23820699a817b1f0e0cdf998beaf4525d00e3)
進階搜尋