Anda di halaman 1dari 7

>> Sekarang kita sudah berhasil menampilkan data postnya dan juga melakukan create

new post
jadi kalau CRUD, yang kita lakukan c nya sudah, r nya sudah. Sekarang kita
masuk ke 2 fitur
lagi yaitu update dan delete

>> Yang akan kita lakukan adalah fitur delete dlu, kita buka halaman index dari
post dashboard
kita cari syntax delete. Untuk yang delete kita akan ubah link menjadi sebuah
tombol di
dalam form, hapus ini harus dimasukkan ke dalam form karena kita butuh request
method
nya delete dan juga fitur csrf

>> Yang akan kita lakukan adalah kita buka tag form yang actionnya akan mengarah
ke link
/dashboard/posts nanti yang akan membedakan di route resourcenya adalah request
methodnya
kita kasih methodnya post

>> Di dalam tag form kita kasih request methodnya, kita bajak istilahnya,
methodnya kita ganti
jadi delete, lalu kita kasih csrf, untuk mengamankan form kita
Misal :
<form action="/dashboard/posts" method="post">
@method('delete')
@csrf
</form>

>> Setelah itu di dalam tag form kita bikin tombol, jadi tombol di bootstrap, jadi
kita bikin
tag button yang isinya icon x-circle, kita cut tag span nya, kita kasih class
di buttonnya
kita samain dengan tombolnya, yaitu badge bg-danger

>> Kalau kita melakukan ini di tag button, maka tombolnya akan sedikit berbeda,
kalau sudah
kita cek di web browser, sekarang semua tombolnya akan berubah menjadi block
element,
karena disimpan ke dalam form yang tag form adalah displaynya block

>> Sama sekarang jadi ada bordernya di buttonnya. Kita hilangkan bordernya dengan
cara
kasih border-0, supaya bordernya hilang, lalu tag formnya kita kasih class d-
inline
atau display inline
Misal :
<form action="/dashboard/posts" method="post" class="d-
inline">
@method('delete')
@csrf
<button class="badge bg-danger border-0"><span
data-feather="x-circle"></span></button>
</form>

>> Jika kita cek di web browser, sekarang bentuk tombolnya bukan link lagi, tapi
dia tombol
yang ada di dalam form. Sebelum kita jalankan fungsi delete, kita kasih sebuah
konfirmasi
dalam bentuk javascript

>> Supaya kalau kita klik tombol delete, gk langsung hapus, tapi dikasih
konfirmasi dlu. Biar
gampang kita pakai javascript dengan event onclick di buttonnya, lalu berisi
return
method confirm(), di dalamnya kita isi pesannya
Misal :
<button class="badge bg-danger border-0" onclick="return confirm('Are you
sure?')">

>> Jika di klik maka sudah muncul pesannya. Kalau klik ok, maka akan masuk ke
dalam action
tapi kalau klik cancel tidak terjadi apa2. Jadi kalau sekarang kita klik ok,
maka akan
terjadi error, karena kita belum menangani routenya.

>> Sekarang kita buka ke controller, kita cari file dashboardpostcontroller.


Caranya kita
cuman butuh baris yang ada di method create, tapi kita akan ganti create dengan
destroy
Kita copas 2 baris terakhir method dari create

>> Pindahkan ke namanya destroy. create kita ganti jadi destroy, isinya kita ambil
dari
$post->id. Selanjutnya pesan yang akan dikirim adalah Post has been deleted
Misal :
public function destroy(Post $post)
{
Post::destroy($post->id);

return redirect('/dashboard/posts')->with('success', 'Post has been


deleted');
}

>> Tapi sepertinya kita harus mengirim datanya ke function destroy ini dari tag
form kita
sebelumnya. Kita kirimin slugnya, jadi nanti route model bindingnya jalan. Jadi
kita
kasih $post->slug.

>> Jadi ini akan ngirim resource $post dengan method delete, lalu di ambil
methodnya,
lalu dicari id hapus, data post berdasarkan id. Jadi delete from table post
where id
sama dengan $post->id
Misal :
<form action="/dashboard/posts/{{ $post->slug }}" method="post" class="d-
inline">

>> Jika kita coba maka data akan terhapus dan pesannya sudah muncul. Tetapi pesan
alertnya
kepanjangan, jadi kita atur alertnya sesuai dengan ukurannya sama kolom
tablenya. Jadi kita
copas saja syntaxnya
Misal :
<div class="alert alert-success col-lg-8" role="alert">

>> Jika kita hapus datanya, maka data akan terhapus dan alertnya sudah berukuran
sama seperti
tablenya. Selanjutnya jangan lupa, kita juga akan memberikan fitur delete pada
file
shownya. Jadi kita tinggal copas syntax dari form delete
Misal :
<form action="/dashboard/posts/{{ $post->slug }}" method="post"
class="d-inline">
@method('delete')
@csrf
<button class="btn btn-danger" onclick="return confirm('Are you
sure?')"><span data-feather="x-circle">Delete</span></button>
</form>

>> Jika sudah, kita coba hapus postingan kita, maka postingannya akan otomatis
terhapus.
Selanjutnya kita akan jalankan fungsi editnya, ini sama seperti halaman create,
bedanya
sudah ada isinya kalau edit, sesuai dengan apa yang mau kita edit

>> Jadi kita contek saja syntax dari view create, tapi untuk sekarang kita buka
file index
post dashboard, kita arahkan linknya ke halaman edit. Kalau ke halaman edit,
kita cukup
tulis di hrefnya /dashboard/posts/{{$post->slug}}/edit. Mirip seperti show.
Bedanya di
akhir kita tambahkan edit
Misal :
<a href="/dashboard/posts/{{ $post->slug }}/edit" class="badge bg-warning">

>> Ini adalah aturan default dari route resourcenya. Kalau kita ingin tahu route
resource
kita ada apa saja, sebetulnya kita bisa lihat lewat terminal, kita ketikkan php
artisan
route:list. Maka kita bisa lihat daftar dari route kita

>> Seluruh route kita ada di terminal, baik yang ditulis manual ataupun yang di
generate
laravel. Kita punya yang dashboard. Kalau mau edit, hrefnya
/dashboard/posts/{post}/eit
Nanti kalau kita mau mengupdate, jadi dashboard/posts/{post}, tapi methodnya
kita pilihnya
antara PUT atau PATCH

>> Kalau delete juga kita arahkan ke yang sama dengan update, tetapi methodnya
DELETE. Jadi
semua sama depannya, yang membedakan hanya request methodnya. Sekarang kita
arahkan ke
viewnya, caranya kita cukup duplikat aja create. Jadi kita copas filenya lalu
paste ke
folder posts. Kita ubah nama filenya jadi edit

>> Selanjutnya kita benerin controllernya. function edit() untuk nampilin viewnya
dan update()
untuk prosesnya, sama seperti tambah data, create untuk nampilin viewnya, store
untuk
proses datanya. Nanti kita copas juga syntaxnya

>> Jadi kita di function edit() kita return view, kita arahin ke
dashboard.posts.edit, lalu
ada data yang kita kirimin yaitu data postnya, supaya nanti kita bisa isi.
Kalau kita
cek di web browser, maka tombol edit sudah fungsi, tetapi kolomnya belum pada
terisi

>> Nanti kita akan isi dari postnya yang ngambil dari function. kita pakai post
lalu bernilai
$post, tinggal kita pakai di editnya
Misal :
public function edit(Post $post)
{
return view('dashboard.posts.edit', [
'post' => $post,
'categories' => Category::all()
]);
}

>> Selanjutnya di bagian edit, kita akan ubah, createnya kita ganti jadi Edit Post
di tag h1
formnya, kita nanti akan ngirimin method post actionnya akan mengarah ke
/dashboard/posts/{{$post->slug}}, lalu di bawah form kita kasih methodnya,
boleh PUT atau
PATCH
Misal :
<form method = "post" class="mb-5" action = "/dashboard/posts/{{ $post-
>slug }}">
@method('put')

>> Selanjutnya kita akan isi dari nilai2nya. Cara isinya kan kita punya value old,
value
old ini nanti kalau kita udah masuk ke validasi kalau validasinya gk lolos,
kita tetap
menuliskan nilai lamanya

>> Laravel punya fitur yang keren, kalau kita tambahkan "," di parameter oldnya,
lalu
kita kasih title, maka nanti laravelnya ngecek ada old atau tidak, kalau ada
old,
tampilin isi dari post title

>> Kalau kita refresh, maka judulnya akan tampil, karena parameter 1 gk ada dan
yang ada
hanya parameter 2. Tapi kalau kita sudah klik update, misalkan kita ganti
judulnya
pada saat kita klik create, dan ternyata ada error. Maka titlenya akan
menampilkan judul
yang baru, bukan judul yang awal tadi

>> Jadi nanti kita akan kasih di setiap input yang kita butuhkan. Untuk slug, kita
lakukan
hal yang sama. Untuk category juga sama, terakhir adalah body, tinggal kita
tambahkan
di tag input type hiddennya. Karena trix-editor ini sudah langsung ngecek ke
javascript
apa isi dari input type hidden
Misal :
value="{{ old('slug', $post->slug) }}"

>> Jika sudah kita refresh, maka sekarang sudah ada isi dari postingan awal.
Tinggal kita
Ubah, buttonnya bukan create post, tapi update post. Sekarang, sebelum kita
jalankan
update post dan validasinya

>> Kita akan pikirin slugnya, slug ini agak tricky karena slug unique dan gk boleh
ada
yang sama, kalau misalnya kita mau ubah categorynya saja. Misalnya kita ganti
tadinya
Web Programming, kita ganti ke web design dan sisanya sama semua

>> Begitu di update, maka slugnya akan di update, begitu di update gk akan bisa,
karena
slugnya sama, kecuali kita ubah slugnya jadi slug yang baru. Nanti hal ini
harus kita
akalin supaya gk begitu aja ngubah

>> Sekarang kita ke controller, kita akan isi method updatenya. Kita akan lakukan
validasi
lagi, jadi kita copas validasi dari store, untuk sementara kita copas varaible
validatedData
Misal :
$validatedData = $request->validate([
'title' => 'required|Max:255',
'slug' => 'required|unique:posts',
'category_id' => 'required',
'body' => 'required'
]);

>> Kita tulis di dalam method update, kita melakukan validasi lagi dari slug.
Slugnya harus
diisi dan jug unique. Problemnya gimana kalau slugnya sama, dan kita gk mau
ubah. Ini akan
jadi problem karena slug pertama udah ada di dalam database

>> Makanya validasi untuk slug harus dikeluarin, jadi kita akan cek menggunakan
kondisi. Jadi
kita akan validasi 3 data aja. Baru kita cek di luar variable validatedData.
Dengan menggunakan
seleksi kondisi if, kalau misalnya slug yang baru itu sama dengan slug yang
lama
biarin lolos

>> Tapi kalau beda, misalnya kita mau ganti slugnya, bisa kita tulis manual atau
judulnya
juga ganti. Kalau berubah, kita validasi. Jadi if slug yang baru itu gk sama
dengan post
slug. Baru kita kasih validasi, kita akan timpa ke dalam sebuah variable

>> Makanya variable validatedData kita ubah namanya jadi rules. lalu di dalam
kondisi, rules
nya kita timpa. Jadi rules yang keynya slug, diisi dengan pemberian validasi.
Begitupun
kalau kosong, maka akan masuk ke selesi kondisi

>> Jadi untuk $request->validatenya di akhir, jadi kita bikin rulesnya dlu, baru
kita validasi
di bawah. Karena kita mau ngecek slugnya, kita keluarin dari rules, baru kita
validasi
di bawah
Misal :
public function update(Request $request, Post $post)
{
$rules = [
'title' => 'required|Max:255',
'slug' => 'required|unique:posts',
'category_id' => 'required',
'body' => 'required'
];
if ($request->slug != $post->slug) {
$rules['slug'] = 'required|unique:posts';
}
$validatedData = $request->validate($rules);

>> Jika kita cek di browser, kalau misalnya kita kosongin bodynya, sisanya kita
isi, maka ada
error, tapi slugnya gk error, karena gk ngecek seleksi kondisi. Kalau kita
pindahin
slugnya ke rulesnya dan seleksi kondisi ifnya kita kasih comment

>> Kalau kita jalanin, ceritanya kita mau ganti hanya category saja. Kalau kita
klik tombol
Update Post, maka error akan muncul di slug. Ini slugnya sudah ada, padahal
memang kita
gk mau ubah slugnya

>> Selanjutnya kita copas 4 baris terakhir dari method store


Misal :

$validatedData['user_id'] = auth()->user()->id;
$validatedData['excerpt'] = Str::limit(strip_tags($request->body), 200);

Post::create($validatedData);

return redirect('/dashboard/posts')->with('success', 'New post has been


added');

>> Kita akan ubah methodnya kita gunakan method where(). Kita lihat cara melakukan
update di
dokumentasinya laravel dengan mengetik update lalu kita cari yang ORM, di
bagian Mass
Updates, kita bisa pakai where update, ini yang akan kita lakukan
Misal :
Flight::where('active', 1)
->where('destination', 'San Diego')
->update(['delayed' => 1]);

>> Sebetulnya ada lagi caranya kita bisa pakai updateOrCreate()


Misal :
$flight = Flight::updateOrCreate(
['departure' => 'Oakland', 'destination' => 'San Diego'],
['price' => 99, 'discounted' => 1]
);

>> Kita akan pakai where, jadi where ada id, $post->id di bawahnya kita akan kasih
panah
update() di dalamnya ada parameter $validatedData, jadi update validatedData,
where
id sama dengan post->id
Misal :
Post::where('id', $post->id)
->update($validatedData);

>> Setelah itu kita redirect balik lagi ke posts, kasih success, pesannya post has
been
updated
Misal :
return redirect('/dashboard/posts')->with('success', 'New post has been
updated');

>> Jika kita coba edit data kita, maka ketika klik update, maka data judulnya
berubah,
kategorinya berubah lalu kita buka isinya, bodynya juga berubah. Edit di file
show juga
kita harus benerin

>> Jadi kita tinggal ganti linknya aja, kita arahkan hrefnya ke
/dashboard/posts/{{$post->slug}}/edit. Jika di cek di browser ke halaman show
dan kita
klik tombol edit maka akan pindah ke halaman edit
Misal :
<a href="/dashboard/posts/{{ $post->slug }}/edit" class="btn btn-warning">
<span data-feather = "edit"></span>Edit</a>

>> Jika kita edit postingan yang lain dengan slug yang sama dengan postingan yang
berbeda,
maka ketika kita klik tombol update, maka akan ada pesan error di slugnya,
yaitu
slug has already been taken

Anda mungkin juga menyukai