225 lines
6.8 KiB
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);
|
|
}
|
|
}
|