Fitur pertama dari CRUD Category yang akan kita buat adalah fitur create category. Untuk itu mari kita ubah kode CategoryController@create agar menjadi seperti ini:
public function create(){
return view('categories.create');
}
Membuat view untuk create category ~5
Kalo kamu coba untuk akses http://larashop.test/categories/create kamu akan mendapatkan error view not found. Itu karena kita belum membuat view categories.create. Maka, kita buat terlebih dahulu file tersebut yaitu resources/views/categories/create.blade.php, silahkan dibuat terlebih dahulu file viewnya. Buat folder baru categories di resources/views lalu buat file create.blade.php di folder categories tadi. Setelah itu buka filenya dan kita isikan kerangka view kita ini:
@extends('layouts.global')
@section('title') Create Category @endsection
@section('content')
TODO: Form create category
@endsection
Kini jika kamu merefresh halaman http://larashop.test/categories/create, error view not found tidak akan muncul lagi dan kita mendapati tampilan yang berasal dari view categories/create.blade.php.
Setelah itu di bagian section content mari kita berikan form dan inputan untuk membuat category baru
<form
enctype="multipart/form-data"
class="bg-white shadow-sm p-3"
action="{{route('categories.store')}}"
method="POST">
@csrf
</form>
Kode ini merupakan kerangka form kita, kita mengeset atribut enctype bernilai multipart/form-data karena kita akan melakukan upload file. Form ini akan mengirimkan data ke route('categories.store') alias http://larashop.test/categories dengan method POST untuk itu kita set attribute method di form ini bernilai POST. Kemudian kita tambahkan styling template
1
bootstrap 4 pada atribute class="bg-white shadow-sm p-3". Dan yang paling penting jangan ketinggal helper @csrf supaya request yang akan kita kirim melalui form ini valid.
Setelah itu kita tambahkan input untuk category name dan upload image category seperti ini:
<label>Category name</label><br>
<input
<label>Category image</label>
<input
Sehingga kini view categories/create.blade.php menjadi seperti ini:
@extends('layouts.global')
@section('title') Create Category @endsection
@section('content')
<div class="col-md-8">
<form
enctype="multipart/form-data"
class="bg-white shadow-sm p-3"
action="{{route('categories.store')}}"
method="POST">
@csrf
<label>Category name</label><br>
<input
<label>Category image</label>
<input
type="file"
class="form-control"
27
Menangkap request create categories ~5
Form create categories telah siap untuk mengirimkan data category akan tetapi controller kita belum melakukan apa-apa, kita perlu menangkap request data dari form create categories untuk kemudian membuat kategori baru di database:
public function store(Request $request){
$name = $request->get('name');
$new_category = new \App\Category;
$new_category->name = $name;
if($request->file('image')){
$image_path = $request->file('image')
Kode di atas menangkap request dengan nama 'name' ke dalam variabel $name kemudian membuat sebuah instance dari model Category baru dan memberikan nilai name = $name.
Setelah itu melakukan pengecekkan apakah ada request bertipe file dengan nama 'image', kita lakukan dengan kode if($request->file('image')). Jika ada maka kita simpan file tersebut ke dalam folder storage/app/public/category_images, penyimpanan tersebut kita lakukan dengan kode
$request->file('image')->store('category_images', 'public'); Setelah itu path dari file yang baru saja diupload tersebut kita jadikan nilai dari field 'image' pada kategori baru tadi. Kategori baru tersebut belum tersimpan didatabase selama kita belum memanggil $new_category->save(). Jangan kita save terlebih dahulu karena kita ingin memberikan nilai pada created_by, field ini mengindikasikan siapa pembuat category ini, nilai dari created_by adalah ID dari user yang melakukan pembuatan category. Maka kita perlu mengambil id dari user yang sedang login saat ini, untuk itulah sebelum menyimpan kita tambahkan kode berikut ini:
$new_category->created_by = \Auth::user()->id;
1
Kode di atas mengambil nilai id dari user yang sedang login dan berikan ke field created_by,
Ada satu lagi field yang tidak ada di form akan tetapi diperlukan di database, yaitu field slug dan kita bisa menggenerate slug dengan helper \Str::slug() yang ada di Laravel. Maka kita buat terlebih dahulu slug berdasarkan nama kategori seperti ini:
$new_category->slug = Str::slug($name, '-');
Slug merupakan karakter yang tidak menyalahi aturan URL, artinya tidak ada spasi, huruf besar kecil, dsb. Misalnya nama kategori "Sepatu Olahraga" maka dengan \Str::slug("Sepatu Olahraga",
"-") akan menghasilkan "sepatu-olahraga"
Baru setelah itu kita simpan model kategori baru tersebut ke database dengan kode ini:
$new_category->save();
Setelah itu kita redirect kembali ke halaman create category beserta dengan pesan bahwa pembuatan category telah berhasil:
return redirect()->route('categories.create')->with('status', 'Category successfully created');
Sehingga CategoryController@store kita terlihat seperti ini:
public function store(Request $request) {
$name = $request->get('name');
$new_category = new \App\Category;
$new_category->name = $name;
if($request->file('image')){
$new_category->created_by = \Auth::user()->id;
$new_category->slug = \Str::slug($name, '-');
$new_category->save();
return redirect()->route('categories.create')->with('status', 'Category successfully created');
}
Dan satu lagi jangan lupa menambahkan kode berikut ini di view categories/create.blade.php tepat di atas kode pembuka form kita agar pesan flash dapat terbaca: