MIF_E31230892/sim-pkpps/app/Http/Controllers/Admin/BeritaController.php

215 lines
7.1 KiB
PHP

<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Berita;
use App\Models\Santri;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
class BeritaController extends Controller
{
/**
* Tampilkan daftar berita
*/
public function index(Request $request)
{
$query = Berita::query()->with('santriTertentu');
// Search
if ($request->filled('search')) {
$query->search($request->search);
}
// Filter status
if ($request->filled('status')) {
$query->status($request->status);
}
// Filter target
if ($request->filled('target')) {
$query->target($request->target);
}
$berita = $query->orderBy('created_at', 'desc')->paginate(15);
return view('admin.berita.index', compact('berita'));
}
/**
* Tampilkan form create
*/
public function create()
{
// Ambil data santri aktif - sesuaikan dengan kolom yang ada di model Santri
$santri = Santri::aktif()
->select('id_santri', 'nama_lengkap', 'kelas')
->orderBy('nama_lengkap')
->get();
$kelasOptions = ['PB', 'Lambatan', 'Cepatan'];
return view('admin.berita.create', compact('santri', 'kelasOptions'));
}
/**
* Simpan berita baru
*/
public function store(Request $request)
{
$validated = $request->validate([
'judul' => 'required|string|max:255',
'konten' => 'required|string',
'penulis' => 'required|string|max:255',
'gambar' => 'nullable|image|mimes:jpeg,png,jpg,gif|max:2048',
'status' => 'required|in:draft,published',
'target_berita' => 'required|in:semua,kelas_tertentu,santri_tertentu',
'target_kelas' => 'nullable|array',
'target_kelas.*' => 'in:PB,Lambatan,Cepatan',
'santri_tertentu' => 'nullable|array',
'santri_tertentu.*' => 'exists:santris,id_santri',
], [
'judul.required' => 'Judul berita wajib diisi',
'konten.required' => 'Konten berita wajib diisi',
'penulis.required' => 'Nama penulis wajib diisi',
'status.required' => 'Status berita wajib dipilih',
'target_berita.required' => 'Target berita wajib dipilih',
]);
// Upload gambar jika ada
if ($request->hasFile('gambar')) {
$validated['gambar'] = $request->file('gambar')->store('berita', 'public');
}
// Buat berita
$berita = Berita::create($validated);
// Attach santri jika target santri_tertentu
if ($validated['target_berita'] === 'santri_tertentu' && $request->filled('santri_tertentu')) {
$berita->santriTertentu()->attach($request->santri_tertentu);
}
// Attach santri berdasarkan kelas jika target kelas_tertentu
if ($validated['target_berita'] === 'kelas_tertentu' && $request->filled('target_kelas')) {
$santriKelas = Santri::whereIn('kelas', $request->target_kelas)
->where('status', 'Aktif')
->pluck('id_santri');
$berita->santriTertentu()->attach($santriKelas);
}
return redirect()->route('admin.berita.index')
->with('success', 'Berita berhasil ditambahkan!');
}
/**
* Tampilkan detail berita
*/
public function show(Berita $berita)
{
$berita->load('santriTertentu');
return view('admin.berita.show', compact('berita'));
}
/**
* Tampilkan form edit
*/
public function edit(Berita $berita)
{
$berita->load('santriTertentu');
// Ambil data santri aktif - sesuaikan dengan kolom yang ada di model Santri
$santri = Santri::aktif()
->select('id_santri', 'nama_lengkap', 'kelas')
->orderBy('nama_lengkap')
->get();
$kelasOptions = ['PB', 'Lambatan', 'Cepatan'];
$selectedSantri = $berita->santriTertentu->pluck('id_santri')->toArray();
return view('admin.berita.edit', compact('berita', 'santri', 'kelasOptions', 'selectedSantri'));
}
/**
* Update berita
*/
public function update(Request $request, Berita $berita)
{
$validated = $request->validate([
'judul' => 'required|string|max:255',
'konten' => 'required|string',
'penulis' => 'required|string|max:255',
'gambar' => 'nullable|image|mimes:jpeg,png,jpg,gif|max:2048',
'status' => 'required|in:draft,published',
'target_berita' => 'required|in:semua,kelas_tertentu,santri_tertentu',
'target_kelas' => 'nullable|array',
'target_kelas.*' => 'in:PB,Lambatan,Cepatan',
'santri_tertentu' => 'nullable|array',
'santri_tertentu.*' => 'exists:santris,id_santri',
]);
// Upload gambar baru jika ada
if ($request->hasFile('gambar')) {
// Hapus gambar lama
if ($berita->gambar) {
Storage::disk('public')->delete($berita->gambar);
}
$validated['gambar'] = $request->file('gambar')->store('berita', 'public');
}
// Update berita
$berita->update($validated);
// Sync santri
if ($validated['target_berita'] === 'santri_tertentu' && $request->filled('santri_tertentu')) {
$berita->santriTertentu()->sync($request->santri_tertentu);
} elseif ($validated['target_berita'] === 'kelas_tertentu' && $request->filled('target_kelas')) {
$santriKelas = Santri::whereIn('kelas', $request->target_kelas)
->where('status', 'Aktif')
->pluck('id_santri');
$berita->santriTertentu()->sync($santriKelas);
} else {
$berita->santriTertentu()->detach();
}
return redirect()->route('admin.berita.index')
->with('success', 'Berita berhasil diperbarui!');
}
/**
* Hapus berita
*/
public function destroy(Berita $berita)
{
// Hapus gambar jika ada
if ($berita->gambar) {
Storage::disk('public')->delete($berita->gambar);
}
$berita->delete();
return redirect()->route('admin.berita.index')
->with('success', 'Berita berhasil dihapus!');
}
/**
* Tampilkan statistik berita
*/
public function statistik()
{
$totalBerita = Berita::count();
$totalPublished = Berita::where('status', 'published')->count();
$totalDraft = Berita::where('status', 'draft')->count();
$beritaSemua = Berita::where('target_berita', 'semua')->count();
$beritaTertentu = Berita::where('target_berita', 'santri_tertentu')->count();
return view('admin.berita.statistik', compact(
'totalBerita',
'totalPublished',
'totalDraft',
'beritaSemua',
'beritaTertentu'
));
}
}