get(); return view('admin.produk-buket.index', compact('buket')); } public function store(Request $request) { $validator = Validator::make($request->all(), [ 'nama' => 'required|string|min:3|max:100', 'ukuran' => 'required|in:S,M,L', 'kategori' => 'required|in:single,fresh,premium_fresh,artificial', 'harga' => 'required|numeric|min:0', 'request_khusus' => 'nullable|string|max:255', 'deskripsi' => 'required|string|min:10', 'foto' => 'required|image|mimes:jpeg,png,jpg|max:2048', ], [ // Detail Pesan Kustom menggunakan :attribute 'required' => 'Kolom :attribute tidak boleh kosong.', 'string' => 'Input :attribute harus berupa teks valid.', 'min' => ':attribute terlalu pendek, minimal harus :min karakter.', 'max' => ':attribute melebihi batas, maksimal :max karakter/KB.', 'in' => 'Pilihan :attribute tidak sesuai dengan data yang tersedia.', 'numeric' => ':attribute harus berupa angka.', 'image' => ':attribute harus berupa file gambar (foto).', 'mimes' => 'Format :attribute tidak didukung. Gunakan format: jpeg, png, atau jpg.', 'max.file' => 'Ukuran :attribute terlalu besar, maksimal adalah 2MB.', ], [ // Alias Atribut agar pesan lebih ramah pengguna 'nama' => 'nama buket', 'ukuran' => 'ukuran buket', 'kategori' => 'kategori buket', 'harga' => 'harga', 'request_khusus' => 'request khusus', 'deskripsi' => 'deskripsi produk', 'foto' => 'foto produk', ]); if ($validator->fails()) { return redirect()->back() ->withErrors($validator) ->withInput() ->with('error_modal', 'create'); } $path = null; if ($request->hasFile('foto')) { $file = $request->file('foto'); $filename = time() . '_' . $file->getClientOriginalName(); $file->move(public_path('img/buket'), $filename); $path = 'img/buket/' . $filename; } Buket::create([ 'nama' => $request->nama, 'ukuran' => $request->ukuran, 'kategori' => $request->kategori, 'harga' => $request->harga, 'request_khusus' => $request->request_khusus, 'deskripsi' => $request->deskripsi, 'foto' => $path, ]); return redirect()->back()->with('success', 'Produk buket berhasil ditambahkan!'); } public function update(Request $request, string $id) { $buket = Buket::findOrFail($id); $validator = Validator::make($request->all(), [ 'nama' => 'required|string|min:3|max:100', 'ukuran' => 'required|in:S,M,L', 'kategori' => 'required|in:single,fresh,premium_fresh,artificial', 'harga' => 'required|numeric|min:0', 'request_khusus' => 'nullable|string|max:255', 'deskripsi' => 'required|string|min:10', 'foto' => 'nullable|image|mimes:jpeg,png,jpg|max:2048', ], [ // Detail Pesan Kustom menggunakan :attribute 'required' => 'Kolom :attribute tidak boleh kosong.', 'string' => 'Input :attribute harus berupa teks valid.', 'min' => ':attribute terlalu pendek, minimal harus :min karakter.', 'max' => ':attribute melebihi batas, maksimal :max karakter/KB.', 'in' => 'Pilihan :attribute tidak sesuai dengan data yang tersedia.', 'numeric' => ':attribute harus berupa angka.', 'image' => ':attribute harus berupa file gambar (foto).', 'mimes' => 'Format :attribute tidak didukung. Gunakan format: jpeg, png, atau jpg.', 'max.file' => 'Ukuran :attribute terlalu besar, maksimal adalah 2MB.', ], [ // Alias Atribut agar pesan lebih ramah pengguna 'nama' => 'nama buket', 'ukuran' => 'ukuran buket', 'kategori' => 'kategori buket', 'harga' => 'harga', 'request_khusus' => 'request khusus', 'deskripsi' => 'deskripsi produk', 'foto' => 'foto produk', ]); if ($validator->fails()) { return redirect()->back() ->withErrors($validator) ->withInput() ->with('error_id', $id); } $data = $request->only(['nama', 'ukuran', 'kategori', 'harga', 'request_khusus', 'deskripsi']); if ($request->hasFile('foto')) { // 1. Hapus foto lama jika ada if ($buket->foto && file_exists(public_path($buket->foto))) { File::delete(public_path($buket->foto)); } // 2. Upload foto baru $file = $request->file('foto'); $filename = time() . '_' . $file->getClientOriginalName(); $file->move(public_path('img/buket'), $filename); $data['foto'] = 'img/buket/' . $filename; } $buket->update($data); return redirect()->back()->with('success', 'Produk buket berhasil diperbarui!'); } public function destroy(string $id) { $buket = Buket::findOrFail($id); if ($buket->foto && File::exists(public_path($buket->foto))) { File::delete(public_path($buket->foto)); } $buket->delete(); return redirect()->back()->with('success', 'Produk dan foto berhasil dihapus permanen!'); } }