連假要結束了,周末的狂歡方式是和Laravel一起共舞,接著前面的Tailwind css,store也可以儲存文章了,今天要先讓我們文章能顯示在網頁的首頁上,而後回歸controller新增edit和update,也是CRUD的U,新增路徑的同時,也製作出相應的blade,事不宜遲,開始今天的Laravel。
我們先到resources\views\articles\index.blade.php
,新增一些程式碼:
<x-app-layout>
...
<div class="m-6"></div>
@foreach($articles as $article)
<div class="py-2 ">
<div class="max-w-7xl mx-auto sm:px-6 lg:px-8 ">
<div class=" bg-white shadow-sm sm:rounded-lg divide-y">
<div class="text-lg p-6 text-gray-900 ">
<div class="flex justify-between items-center">
<div class="font-semibold px-4">
<a href = "{{ route('articles.show', $article) }}"> {{ $article->title }} </a>
</div>
@if ($article->user->is(auth()->user()))
<button type = "submit" class="px-3 py-1 rounded bg-gray-800 text-white hover:bg-gray-700">
<a href = "{{route('articles.edit', $article)}}"> 修改活動</a>
</button>
@endif
</div>
<div class = "ml-2 text-base text-gray-500 py-4 px-6">
{{ $article->summary }}
</div>
</div>
</div>
</div>
</div>
@endforeach
{{ $articles -> links() }}
</x-app-layout>
其中@if ($article->user->is(auth()->user()))
是負責檢查現在這位使用者是否正是這篇文章的作者,如果使用者正是文章的作者,網頁才會顯示修改的按鈕,這位使用者才有辦法可以修改此篇文章。
現在動動手新增一篇文章,就可看到我們的文章放在首頁上,接著點下右上角的按鈕,
我們就可以跟著route進入article的edit畫面,接著我們進入熟悉的controller,app\Http\Controllers\ArticleController.php
,
public function edit(Article $article)
{
$article = auth() -> user() -> articles -> find($article);
return view('articles.edit', ['article' => $article]);
}
將由前端傳遞的article處理完,再接著傳向edit的前端,這時候又到了製作blade的時候,我們進到resources\views\articles
新增edit的blade,並放上,
<x-app-layout>
<x-slot name="header">
<h2 class="font-semibold text-xl text-gray-800 leading-tight">
{{ __('修改活動內容') }}
</h2>
</x-slot>
<div class="py-12">
<div class="max-w-7xl mx-auto sm:px-6 lg:px-8">
<div class="bg-white overflow-hidden shadow-sm sm:rounded-lg">
<div class="p-6 text-gray-900 m-6 text-center">
@if($errors->any())
<div class = "error p-3 bg-red-150 text-white font-thin rounded">
<ul>
@foreach($errors -> all() as $error)
<li>{{ $error }}</li>
@endforeach
</ul>
</div>
@endif
<form action = "{{ route('articles.update', $article) }}" method = "post">
@csrf
@method('patch')
<div class="field my-2 ">
<lable for="" class="mb-2"> {{__("標題")}}</lable>
<input type = "text" value="{{ $article -> title }}" name = "title" class = "w-2/5 border-gray-300 p-2 mx-2">
</div>
<div class="flex-auto ">
<div class="field my-2" ><p>{{__("內文")}}</p></div>
<div class="field my-2" >
<lable for="" class="mb-2"> {{__("")}} </lable>
<textarea name = "content" rows = "20" class = "w-4/5 m-auto border-gray-300 p-2 " >{{ $article -> content }}</textarea>
</div>
</div>
<div class="flex-auto ">
<div class="field my-2" ><p>{{__("簡介")}}</p></div>
<div class="field my-2 " >
<lable for="" class="mb-2"> {{__("")}} </lable>
<textarea name = "summary" rows = "5" class = "w-4/5 m-auto border-gray-300 p-2" >{{ $article -> summary }}</textarea>
</div>
</div>
<div class="field my-2 ">
<lable for=""> {{__("開始時間")}} </lable>
<input type = "date" value="{{ $article -> start_time }}" name = "start_time" class = "border-gray-300 p-2 mx-2">
</div>
<div class="field my-2 ">
<lable for=""> {{__("結束時間")}} </lable>
<input type = "date" value="{{ $article -> end_time }}" name = "end_time" class = "border-gray-300 p-2 mx-2">
</div>
<div class="flex mt-4 space-x-6 justify-center">
<div class="actions">
<button type = "submit" class="px-3 py-1 rounded bg-gray-800 text-white hover:bg-gray-700"> {{__("修改活動內容")}} </button>
</div>
<div class="px-3 py-1 rounded bg-gray-200 hover:bg-gray-300 ">
<a href = "{{route('dashboard')}}" > {{__("取消修改")}} </a>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
</x-app-layout>
edit的畫面其實和create很像,有相同的錯誤提示和表單,不同的地方在於我們修改的表單是建立在已經創建過的活動上,edit的表單是有預設值的,所以value="{{ $article -> title }}"
,而不是拯救來不及送出的value="{{ old('title') }}"
。另一個相異處,@method('patch')
,put/patch都是更新的意思,區別在於put會更新整筆資料,但patch只會更新有改動的地方。
編輯資料送出後,就到了我們檢查和更新的地方了,回到app\Http\Controllers
新增,
public function update(Request $request, Article $article)
{
$article = auth() -> user() -> articles -> find($article);
$content = $request->validate([
'title' => 'required',
'content' => 'required|min:50',
'summary' => 'required|min:10',
'start_time' => 'required',
'end_time' => 'required',
]);
$article -> update($content);
return redirect() -> route('dashboard');
}
我們先找到要修改的article,並檢查資料,接者使用update更新article的內容,最後把我們的使用者送回首頁,修改活動的功能就暫且告一個段落了。
今天首頁順利顯示活動總覽,和新增了修改更新文章的方式,而明天要做的是controller最後兩項show和delete,今天就早點洗洗睡吧,明天再和我們一起繼續走完剩下的鐵人賽,掰掰。