iT邦幫忙

2023 iThome 鐵人賽

DAY 16
0
Modern Web

Laravel實作 —系列 第 16

[Day 16] Laravel實作 -- 更新生死簿看看有沒有其他遺漏者

  • 分享至 

  • xImage
  •  

連假要結束了,周末的狂歡方式是和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()))是負責檢查現在這位使用者是否正是這篇文章的作者,如果使用者正是文章的作者,網頁才會顯示修改的按鈕,這位使用者才有辦法可以修改此篇文章。

現在動動手新增一篇文章,就可看到我們的文章放在首頁上,接著點下右上角的按鈕,
https://ithelp.ithome.com.tw/upload/images/20231001/20163142KTNPzg3Au7.png

我們就可以跟著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,今天就早點洗洗睡吧,明天再和我們一起繼續走完剩下的鐵人賽,掰掰。


上一篇
[Day 15] Laravel實作 -- 地獄業火焚燒的是我對前端的美好願景
下一篇
[Day 17] Laravel實作 -- delete人生show出地獄
系列文
Laravel實作 —30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言