:::
14-2 修改題目
一、修改路由
- 修改路由
/專案/routes/web.php加入topic 的edit路由,一樣使用路由模型綁定,{topic}就是編號,放在前後其實都沒關係。Route::pattern('exam', '[0-9]+'); Route::pattern('topic', '[0-9]+'); //略 Route::get('/topic/{topic}/edit', 'TopicController@edit')->name('topic.edit');
二、修改樣板,加入編輯按鈕
-
修改原來的
/專案/resources/views/exam/show.blade.php樣板,加入編輯按鈕:<h3> @can('建立測驗') <a href="{{route('topic.edit', $topic->id)}}" class="btn btn-warning">編輯</a> ({{$topic->ans}}) @endcan {{ bs()->badge()->text($key+1) }} {{ $topic->topic }} </h3> - 如:

三、修改Topic控制器
-
要修改題目,會遇到和修改測驗一樣的問題(而且更複雜一點),因為是共用樣板,所以,必須針對「建立」和「修改」兩種情形來修改部份視圖的設定
-
建立的http動詞是
post,修改則是patch(如此,會自動加上CSRF保護,避免跨站攻擊) -
建立題目的表單
action是/topic,修改題目則是/topic/編號
-
-
在控制器中
/專案/app/Http/Controllers/TopicController.php,加入edit的方法:public function edit(Topic $topic) { $exam = $topic->exam; return view('exam.show', compact('exam', 'topic')); }-
主要就是讀出題目
$topic的原始內容,以便套用到表單中。我們將Topic注入$topic,$topic就成了一個Topic內容物件 -
此外,測驗內容
$exam也會被用到,用來顯示測驗標題,而且因為我們已經有設好關聯,所以,不用另外抓,$topic->exam就是所屬測驗的完整資料。
-
-
最後,修改
/專案/resources/views/exam/show.blade.php樣板:@can('建立測驗') @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() }} @endcan - 到此就大功告成啦!

- 最後,只要完成「更新」部份的功能即可。
14-1 更新測驗
