paginate(5); // <= pagination 10 item per halaman $kategoris = Kategori::all(); $fiturs = Fitur::all(); return view('admin.templates.index', compact('templates', 'kategoris', 'fiturs')); } public function show($id) { return Template::with('kategori')->findOrFail($id); } public function store(Request $request) { $data = $request->validate([ 'nama_template' => 'required|string|max:255', 'kategori_id' => 'required|exists:kategoris,id', 'fitur_id' => 'required|array', 'fitur_id.*' => 'exists:fiturs,id', 'foto' => 'nullable|image|mimes:jpg,jpeg,png,gif|max:5120', ]); // hitung total harga dari fitur yang dipilih $totalHarga = Fitur::whereIn('id', $data['fitur_id'])->sum('harga'); if ($request->hasFile('foto')) { $data['foto'] = $request->file('foto')->store('templates', 'public'); } $template = Template::create([ 'nama_template' => $data['nama_template'], 'kategori_id' => $data['kategori_id'], 'foto' => $data['foto'] ?? null, 'harga' => $totalHarga, // ✅ otomatis dari fitur ]); $template->fiturs()->sync($data['fitur_id']); return redirect()->route('templates.index')->with('success', 'Template berhasil ditambahkan!'); } public function update(Request $request, Template $template) { $data = $request->validate([ 'nama_template' => 'required|string|max:255', 'kategori_id' => 'required|exists:kategoris,id', 'fitur_id' => 'required|array', 'fitur_id.*' => 'exists:fiturs,id', 'foto' => 'nullable|image|mimes:jpg,jpeg,png,gif|max:5120', ]); // hitung ulang harga $totalHarga = Fitur::whereIn('id', $data['fitur_id'])->sum('harga'); if ($request->hasFile('foto')) { if ($template->foto && Storage::disk('public')->exists($template->foto)) { Storage::disk('public')->delete($template->foto); } $data['foto'] = $request->file('foto')->store('templates', 'public'); } $template->update([ 'nama_template' => $data['nama_template'], 'kategori_id' => $data['kategori_id'], 'foto' => $data['foto'] ?? $template->foto, 'harga' => $totalHarga, // ✅ otomatis dari fitur ]); $template->fiturs()->sync($data['fitur_id']); return redirect()->route('templates.index')->with('success', 'Template berhasil diperbarui!'); } public function destroy(Template $template) { if ($template->foto && Storage::disk('public')->exists($template->foto)) { Storage::disk('public')->delete($template->foto); } // detach fiturs otomatis karena cascade on pivot, tapi bisa explicit: $template->fiturs()->detach(); $template->delete(); return redirect()->route('templates.index')->with('success', 'Template berhasil dihapus!'); } public function byKategori($id) { $kategori = Kategori::findOrFail($id); $templates = Template::with(['kategori', 'fiturs']) ->where('kategori_id', $id) ->paginate(5); // ✅ pakai paginate $kategoris = Kategori::all(); $fiturs = Fitur::all(); return view('admin.templates.index', compact('templates', 'kategoris', 'fiturs', 'kategori')); } }