get(); $additional = Additional::latest()->get(); // Kirim keduanya ke view paket-foto.index return view('admin.paket-foto.index', compact('foto', 'additional')); } public function store(Request $request) { $validator = Validator::make($request->all(), [ 'nama' => 'required|string|min:3|max:100', 'harga' => 'required|numeric|min:0', 'durasi' => 'required|integer|min:0', 'deskripsi' => 'required|string|min:10', 'foto' => 'required|image|mimes:jpeg,png,jpg|max:2048', ], [ 'required' => 'Kolom :attribute wajib diisi.', 'string' => 'Input :attribute harus berupa teks valid.', 'integer' => 'Input :attribute harus berupa angka valid.', 'max' => ':attribute melebihi batas, maksimal :max karakter/KB.', 'image' => ':attribute harus berupa file gambar (foto).', 'mimes' => 'Format :attribute tidak didukung. Gunakan format: jpeg, png, atau jpg.', 'max.file' => 'Ukuran :attribute maksimal 2MB.', 'min' => ':attribute minimal harus :min karakter/nilai.', 'numeric' => ':attribute harus berupa angka.', ], [ 'nama' => 'nama paket', 'harga' => 'harga paket', 'durasi' => 'durasi paket', 'foto' => 'foto paket', ]); if ($validator->fails()) { return redirect()->back() ->withErrors($validator) ->withInput() ->with('error_modal', 'createFoto'); // Agar modal terbuka otomatis saat error } $path = null; if ($request->hasFile('foto')) { $file = $request->file('foto'); $filename = time() . '_' . $file->getClientOriginalName(); // Simpan langsung ke folder public untuk asset() $file->move(public_path('img/foto'), $filename); $path = 'img/foto/' . $filename; } PaketFoto::create([ 'nama' => $request->nama, 'harga' => $request->harga, 'durasi' => $request->durasi, 'deskripsi' => $request->deskripsi, 'foto' => $path, ]); return redirect()->back()->with('success', 'Paket foto baru berhasil ditambahkan!'); } public function update(Request $request, string $id) { $paket = PaketFoto::findOrFail($id); $validator = Validator::make($request->all(), [ 'nama' => 'required|string|min:3|max:100', 'harga' => 'required|numeric|min:0', 'durasi' => 'required|integer|min:0', 'deskripsi' => 'required|string|min:10', 'foto' => 'nullable|image|mimes:jpeg,png,jpg|max:2048', ], [ 'required' => 'Kolom :attribute wajib diisi.', 'string' => 'Input :attribute harus berupa teks valid.', 'integer' => 'Input :attribute harus berupa angka valid.', 'max' => ':attribute melebihi batas, maksimal :max karakter/KB.', 'image' => ':attribute harus berupa file gambar (foto).', 'mimes' => 'Format :attribute tidak didukung. Gunakan format: jpeg, png, atau jpg.', 'max.file' => 'Ukuran :attribute maksimal 2MB.', 'min' => ':attribute minimal harus :min karakter/nilai.', 'numeric' => ':attribute harus berupa angka.', ], [ 'nama' => 'nama paket', 'harga' => 'harga paket', 'durasi' => 'durasi paket', 'foto' => 'foto paket', ]); if ($validator->fails()) { return redirect()->back() ->withErrors($validator) ->withInput() ->with('error_id_foto', $id); // Membuka modal edit yang error otomatis } $data = $request->only(['nama', 'harga', 'durasi', 'deskripsi']); if ($request->hasFile('foto')) { // Hapus file lama jika ada foto baru yang diunggah if ($paket->foto) { File::delete(public_path($paket->foto)); } $file = $request->file('foto'); $filename = time() . '_' . $file->getClientOriginalName(); $file->move(public_path('img/foto'), $filename); $data['foto'] = 'img/foto/' . $filename; } $paket->update($data); return redirect()->back()->with('success', 'Paket foto berhasil diperbarui!'); } public function destroy(string $id) { // Cari data berdasarkan primary key id_paket $paket = PaketFoto::where('id_paket', $id)->firstOrFail(); // 1. Cek dan hapus file foto dari folder public if ($paket->foto) { File::delete(public_path($paket->foto)); } // 2. Hapus data dari database $paket->delete(); return redirect()->back()->with('success', 'Paket foto dan filenya berhasil dihapus!'); } }