MIF_E31221225/app/Http/Controllers/Guru/MateriController.php

225 lines
6.8 KiB
PHP

<?php
namespace App\Http\Controllers\Guru;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use App\Models\Materi;
use App\Models\Tugas;
use App\Models\Guru;
use App\Models\Kelas;
class MateriController extends Controller
{
protected function getGuruId()
{
$guru = Guru::where('user_id', auth()->id())->firstOrFail();
return $guru->id;
}
public function index(Request $request)
{
$guruId = $this->getGuruId();
$mapelIds = Guru::find($guruId)->mapel()->pluck('mapels.id')->toArray();
$materi = Materi::with('children')
->whereNull('parent_id')
->where('guru_id', $guruId)
->whereIn('mapel_id', $mapelIds)
->get();
$mapel = Guru::find($guruId)->mapel()->first(); // ambil mapel pertama untuk passing ke view
return view('guru.materi.index', compact('materi', 'mapel'));
}
public function preview($id)
{
$materi = Materi::findOrFail($id);
$tugas = Tugas::where('materi_id', $id)->get();
return view('guru.materi.tab', compact('materi', 'tugas'));
}
public function create()
{
$guruId = auth()->user()->guru->id; // atau cara dapat guru_id sesuai setup kamu
$mapel = Guru::find($guruId)->mapel()->first();
$daftarMateriInduk = Materi::where('guru_id', $guruId)
->whereNull('parent_id')
->get();
$kelasList = Kelas::all();
return view('guru.materi.create', compact('mapel', 'daftarMateriInduk', 'kelasList'));
}
public function store(Request $request)
{
$request->validate([
'judul' => 'required',
'mapel_id' => 'required|exists:mapels,id',
'kelas_id' => 'array',
'kelas_id.*' => 'exists:kelas,id',
'tanggal_terbit' => 'array',
'tanggal_terbit.*' => 'nullable|date',
'parent_id' => 'nullable|exists:materi,id',
'is_parent' => 'required|in:0,1',
]);
$guruId = $this->getGuruId();
$materi = Materi::create([
'guru_id' => $guruId,
'mapel_id' => $request->mapel_id,
'judul' => $request->judul,
'parent_id' => $request->is_parent == 0 ? $request->parent_id : null,
'isi' => '',
]);
if ($request->has('kelas_id')) {
$kelasSyncData = [];
foreach ($request->kelas_id as $kelasId) {
$kelasSyncData[$kelasId] = [
'tanggal_terbit' => $request->tanggal_terbit[$kelasId] ?? null,
];
}
$materi->kelas()->sync($kelasSyncData);
}
return redirect()->route('guru.materi.index')
->with('success', 'Materi berhasil disimpan. Silakan isi konten materi.');
}
public function edit($id)
{
$materi = Materi::with('kelas')->findOrFail($id);
$guru = Guru::where('user_id', auth()->id())->firstOrFail();
$daftarMateriInduk = Materi::whereNull('parent_id')
->where('guru_id', $guru->id)
->where('id', '!=', $id)
->get();
$daftarMapel = $guru->mapel; // <== Tambahkan ini
$kelasList = Kelas::all();
return view('guru.materi.edit', compact('materi', 'daftarMateriInduk', 'kelasList', 'daftarMapel'));
}
public function update(Request $request, $id)
{
$materi = Materi::findOrFail($id);
$request->validate([
'judul' => 'required',
'mapel_id' => 'required|exists:mapels,id',
'kelas_id' => 'array',
'kelas_id.*' => 'exists:kelas,id',
'tanggal_terbit' => 'array',
'tanggal_terbit.*' => 'nullable|date',
'parent_id' => 'nullable|exists:materi,id',
'is_parent' => 'required|in:0,1',
]);
$materi->update([
'judul' => $request->judul,
'mapel_id' => $request->mapel_id,
'parent_id' => $request->is_parent == 0 ? $request->parent_id : null,
]);
if ($request->has('kelas_id')) {
$kelasSyncData = [];
foreach ($request->kelas_id as $kelasId) {
$kelasSyncData[$kelasId] = [
'tanggal_terbit' => $request->tanggal_terbit[$kelasId] ?? null,
];
}
$materi->kelas()->sync($kelasSyncData);
}
return redirect()->route('guru.materi.index')->with('success', 'Materi diperbarui');
}
public function editIsi($id)
{
$materi = Materi::findOrFail($id);
return view('guru.materi.edit_isi', compact('materi'));
}
public function updateIsi(Request $request, $id)
{
$materi = Materi::findOrFail($id);
$request->validate([
'isi' => 'required',
'file' => 'nullable|file|mimes:jpeg,jpg,png,gif,svg,pdf,docx,xlsx,mp4,mov|max:20480',
]);
$data = ['isi' => $request->isi];
if ($request->hasFile('file')) {
$file = $request->file('file');
$ext = $file->getClientOriginalExtension();
if (in_array($ext, ['jpg', 'jpeg', 'png', 'gif', 'svg'])) {
$path = $file->store('materi_images', 'public');
} elseif (in_array($ext, ['pdf', 'docx', 'xlsx'])) {
$path = $file->store('materi_documents', 'public');
} elseif (in_array($ext, ['mp4', 'mov'])) {
$path = $file->store('materi_videos', 'public');
} else {
return redirect()->back()->withErrors('Format file tidak didukung');
}
$data['file'] = $path;
}
$materi->update($data);
return redirect()->route('guru.materi.index')->with('success', 'Isi materi berhasil diperbarui.');
}
public function destroy($id)
{
$materi = Materi::findOrFail($id);
$materi->delete();
return redirect()->route('guru.materi.index')->with('success', 'Materi dihapus');
}
public function upload(Request $request)
{
$request->validate([
'file' => 'required|file|mimes:jpeg,jpg,png,gif,svg,pdf,docx,xlsx,mp4|max:20480',
]);
if ($request->hasFile('file')) {
$file = $request->file('file');
$ext = $file->getClientOriginalExtension();
if (in_array($ext, ['jpg', 'jpeg', 'png', 'gif', 'svg'])) {
$path = $file->store('materi_images', 'public');
} elseif (in_array($ext, ['pdf', 'docx', 'xlsx'])) {
$path = $file->store('materi_documents', 'public');
} elseif ($ext === 'mp4') {
$path = $file->store('materi_videos', 'public');
} else {
return response()->json(['error' => 'Format file tidak didukung'], 400);
}
return response()->json([
'location' => asset('storage/' . $path)
]);
}
return response()->json(['error' => 'Upload gagal'], 400);
}
}