X7ROOT File Manager
Current Path:
/home/u126090504/domains/sketkaranjia.com/public_html/admin
home
/
u126090504
/
domains
/
sketkaranjia.com
/
public_html
/
admin
/
๐
..
๐
achievers.php
(21.44 KB)
๐
achv_cat_manage.php
(7.99 KB)
๐
achv_edit.php
(9.58 KB)
๐
achv_list.php
(8.08 KB)
๐
achv_upload.php
(13.39 KB)
๐
admin-academic-calendar.php
(20.41 KB)
๐
admin-public-disclosure.php
(18.36 KB)
๐
admissions.php
(28.76 KB)
๐
admissions_error.log
(56 KB)
๐
assets
๐
banners.php
(9.78 KB)
๐
branding_settings.php
(5.93 KB)
๐
change_password.php
(3.01 KB)
๐
class_master.php
(4.32 KB)
๐
contacts.php
(3.83 KB)
๐
dashboard.php
(27.76 KB)
๐
downloads.php
(4.91 KB)
๐
edit_faculty.php
(6.85 KB)
๐
events.php
(920 B)
๐
export_franchise.php
(930 B)
๐
faculty.php
(8.36 KB)
๐
fees_list.php
(8.48 KB)
๐
fees_upload.php
(6.19 KB)
๐
forgot_password.php
(5.76 KB)
๐
franchise.php
(7.28 KB)
๐
gallery.php
(3.08 KB)
๐
grievance-update.php
(1003 B)
๐
grievance-view.php
(8.51 KB)
๐
grievances.php
(9.55 KB)
๐
homework_add.php
(5.98 KB)
๐
homework_edit.php
(9.39 KB)
๐
homework_list.php
(2.24 KB)
๐
img
๐
includes
๐
index.php
(82 B)
๐
login.php
(13.47 KB)
๐
logout.php
(102 B)
๐
manage_albums.php
(10.82 KB)
๐
manage_media.php
(11.77 KB)
๐
manage_photos.php
(6.35 KB)
๐
manage_videos.php
(18.38 KB)
๐
managing-committee.php
(13.64 KB)
๐
master_menu.php
(5.75 KB)
๐
master_menu_debug.php
(3.73 KB)
๐
new_password.php
(3.9 KB)
๐
non_academic_achievers.php
(21.2 KB)
๐
notice.php
(15.52 KB)
๐
notice_error.log
(38.45 KB)
๐
notices.php
(8.24 KB)
๐
payments.php
(14.96 KB)
๐
phpmailer
๐
popup.php
(14.07 KB)
๐
reset_password.php
(2.27 KB)
๐
section_master.php
(6.59 KB)
๐
sections_by_class.php
(346 B)
๐
secure_session.php
(1000 B)
๐
settings.php
(8.34 KB)
๐
student_photo_update.php
(1.8 KB)
๐
subject_master.php
(6.16 KB)
๐
submit-grievance.php
(4.97 KB)
๐
testimonials.php
(15.15 KB)
๐
update_status.php
(1.66 KB)
๐
upi_settings.php
(1.52 KB)
Editing: admissions.php
<?php // admin/admissions.php โ Admin list aligned to FRONTEND fields + your legacy schema include 'secure_session.php'; include 'includes/auth.php'; require_once '../config.php'; // ===== CSRF ===== if (empty($_SESSION['csrf'])) { $_SESSION['csrf'] = bin2hex(random_bytes(32)); } $CSRF = $_SESSION['csrf']; // ===== Helpers ===== function e($v){ return htmlspecialchars((string)$v, ENT_QUOTES, 'UTF-8'); } function safe_redirect($url){ if (!headers_sent()) { header("Location: ".$url); exit; } $u = e($url); echo "<script>location.replace('{$u}');</script>"; echo "<noscript><meta http-equiv='refresh' content='0;url={$u}'></noscript>"; exit; } if (!function_exists('mb_strimwidth')) { function mb_strimwidth($s,$start,$width,$trim=''){ $s=(string)$s; $cut=substr($s,$start,$width); return (strlen($s)>$width+$start)?$cut.$trim:$cut; } } // ---- mysqli get_result compatibility (no mysqlnd) ---- if (!function_exists('mysqli_stmt_get_result')) { function _stmt_fetch_all_assoc(mysqli_stmt $stmt) { $stmt->store_result(); $meta = $stmt->result_metadata(); if (!$meta) return array(); $fields = array(); $row = array(); $bind = array(); while ($f = $meta->fetch_field()) { $fields[] = $f->name; $row[$f->name] = null; $bind[] = &$row[$f->name]; } call_user_func_array(array($stmt, 'bind_result'), $bind); $out = array(); while ($stmt->fetch()) { $copy = array(); foreach ($fields as $f) { $copy[$f] = $row[$f]; } $out[] = $copy; } return $out; } function stmt_rows_assoc(mysqli_stmt $stmt){ return _stmt_fetch_all_assoc($stmt); } } else { function stmt_rows_assoc(mysqli_stmt $stmt){ $res = $stmt->get_result(); $rows = array(); if ($res) while ($r = $res->fetch_assoc()) $rows[] = $r; return $rows; } } // Column detector (cached) function table_cols(mysqli $conn, $table) { static $cache = array(); if (isset($cache[$table])) return $cache[$table]; $cols = array(); // Try INFORMATION_SCHEMA $sql = "SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = DATABASE() AND TABLE_NAME = ?"; if ($st = $conn->prepare($sql)) { $st->bind_param("s",$table); if ($st->execute()) { foreach (stmt_rows_assoc($st) as $r) $cols[strtolower($r['COLUMN_NAME'])] = true; } } // Fallback SHOW COLUMNS if (!$cols) { if ($res = $conn->query("SHOW COLUMNS FROM `".$conn->real_escape_string($table)."`")) { while ($r = $res->fetch_assoc()) $cols[strtolower($r['Field'])] = true; } } $cache[$table] = $cols; return $cols; } function table_has_col(mysqli $conn, $table, $col){ $cols = table_cols($conn,$table); return isset($cols[strtolower($col)]); } // ===== Filters (aligned + legacy) ===== $q = isset($_GET['q']) ? trim($_GET['q']) : ''; $classF = isset($_GET['class']) ? trim($_GET['class']) : ''; $sexF = isset($_GET['sex']) ? trim($_GET['sex']) : ''; $courseF = isset($_GET['course']) ? trim($_GET['course']) : ''; $from = isset($_GET['from']) ? trim($_GET['from']) : ''; $to = isset($_GET['to']) ? trim($_GET['to']) : ''; $per = (int)(isset($_GET['per']) ? $_GET['per'] : 20); if ($per<5) $per=10; if ($per>200) $per=200; $page = (int)(isset($_GET['page']) ? $_GET['page'] : 1); if ($page<1) $page=1; $offset = ($page - 1) * $per; // Sort allow list (frontend + legacy) $sortableAllow = array( 'id','student_name','name','father_name','mother_name','dob','school','class','sex','caste', 'blood_group','aadhaar','created_at','photo_path','age_years','mobile','phone','email','address','course' ); $sort = isset($_GET['sort']) ? $_GET['sort'] : 'id'; $sortDir = (isset($_GET['dir']) && strtolower($_GET['dir'])==='asc') ? 'ASC' : 'DESC'; if (!in_array($sort, $sortableAllow, true)) $sort = 'id'; // WHERE builder $where = array(); $params = array(); $types = ''; // ๐ Search across both new + legacy fields if ($q !== '') { $searchCols = array( 'student_name','name','father_name','mother_name', 'school','aadhaar','message', 'mobile','phone','email','address','course' ); $searchWhere = array(); foreach ($searchCols as $sc){ if (table_has_col($conn,'admissions',$sc)) { $searchWhere[] = "$sc LIKE ?"; $params[] = "%".$q."%"; $types .= 's'; } } if ($searchWhere) $where[] = '('.implode(' OR ',$searchWhere).')'; } if ($classF !== '' && table_has_col($conn,'admissions','class')) { $where[] = "class = ?"; $params[]=$classF; $types.='s'; } if ($sexF !== '' && table_has_col($conn,'admissions','sex')) { $where[] = "sex = ?"; $params[]=$sexF; $types.='s'; } if ($courseF!== '' && table_has_col($conn,'admissions','course')){ $where[] = "course = ?";$params[]=$courseF;$types.='s'; } if ($from !== '' && table_has_col($conn,'admissions','created_at')) { $where[] = "DATE(created_at) >= ?"; $params[]=$from; $types.='s'; } if ($to !== '' && table_has_col($conn,'admissions','created_at')) { $where[] = "DATE(created_at) <= ?"; $params[]=$to; $types.='s'; } $whereSql = $where ? ('WHERE '.implode(' AND ',$where)) : ''; // ===== POST actions ===== if ($_SERVER['REQUEST_METHOD']==='POST') { if (!isset($_POST['csrf']) || !hash_equals($_SESSION['csrf'], $_POST['csrf'])) { die("โ CSRF validation failed."); } if (isset($_POST['delete_id'])) { $id = (int)$_POST['delete_id']; $stmt = $conn->prepare("DELETE FROM admissions WHERE id=?"); $stmt->bind_param("i",$id); $stmt->execute(); safe_redirect("admissions.php?msg=deleted"); } if (!empty($_POST['bulk_action']) && $_POST['bulk_action']==='delete' && !empty($_POST['ids']) && is_array($_POST['ids'])) { $ids = array(); foreach ($_POST['ids'] as $x) { $x = (int)$x; if ($x>0) $ids[] = $x; } if ($ids){ $place = implode(',', array_fill(0, count($ids), '?')); $typesDel = str_repeat('i', count($ids)); $sql = "DELETE FROM admissions WHERE id IN ($place)"; $stmt = $conn->prepare($sql); $tmp = array_merge(array($typesDel), $ids); $refs = array(); foreach ($tmp as $k => $v) $refs[$k] = &$tmp[$k]; call_user_func_array(array($stmt, 'bind_param'), $refs); $stmt->execute(); } safe_redirect("admissions.php?msg=bulk_deleted"); } } // ===== Export ===== if (isset($_GET['export'])) { $export = $_GET['export']; // Decide visible columns with aliases (Student Name / Mobile label) $hasStudent = table_has_col($conn,'admissions','student_name'); $hasName = table_has_col($conn,'admissions','name'); $hasMobile = table_has_col($conn,'admissions','mobile'); $hasPhone = table_has_col($conn,'admissions','phone'); $cols = array('id'); // Student Name column (alias to student_name OR name) if ($hasStudent) $cols[] = 'student_name'; elseif ($hasName) $cols[] = 'name'; if (table_has_col($conn,'admissions','father_name')) $cols[] = 'father_name'; if (table_has_col($conn,'admissions','mother_name')) $cols[] = 'mother_name'; if (table_has_col($conn,'admissions','dob')) $cols[] = 'dob'; $cols[] = 'age_years'; // computed if (table_has_col($conn,'admissions','class')) $cols[] = 'class'; if (table_has_col($conn,'admissions','sex')) $cols[] = 'sex'; if (table_has_col($conn,'admissions','caste')) $cols[] = 'caste'; if (table_has_col($conn,'admissions','blood_group')) $cols[] = 'blood_group'; if (table_has_col($conn,'admissions','aadhaar')) $cols[] = 'aadhaar'; if (table_has_col($conn,'admissions','school')) $cols[] = 'school'; // Contact legacy if ($hasMobile) $cols[] = 'mobile'; elseif ($hasPhone) $cols[] = 'phone'; if (table_has_col($conn,'admissions','email')) $cols[] = 'email'; if (table_has_col($conn,'admissions','address')) $cols[] = 'address'; if (table_has_col($conn,'admissions','course')) $cols[] = 'course'; if (table_has_col($conn,'admissions','message')) $cols[] = 'message'; if (table_has_col($conn,'admissions','photo_path')) $cols[] = 'photo_path'; if (table_has_col($conn,'admissions','created_at')) $cols[] = 'created_at'; // SELECT parts with age + aliases (Aadhaar FULL โ no masking) $parts = array(); foreach ($cols as $c) { if ($c==='aadhaar') { $parts[] = "aadhaar"; // โฌ full show } elseif ($c==='age_years') { if (table_has_col($conn,'admissions','dob')) $parts[] = "TIMESTAMPDIFF(YEAR, dob, CURDATE()) AS age_years"; else $parts[] = "NULL AS age_years"; } elseif ($c==='student_name' && !$hasStudent && $hasName) { $parts[] = "name AS student_name"; // normalize header } elseif ($c==='mobile' && !$hasMobile && $hasPhone) { $parts[] = "phone AS mobile"; // normalize header } else { $parts[] = $c; } } if (!$parts) $parts[] = 'id'; $selectList = implode(',', $parts); // sort normalization $sortSql = $sort; if ($sort==='student_name' && !$hasStudent && $hasName) $sortSql = 'name'; if ($sort==='mobile' && !$hasMobile && $hasPhone) $sortSql = 'phone'; $sqlExport = "SELECT $selectList FROM admissions $whereSql ORDER BY $sortSql $sortDir"; $stx = $conn->prepare($sqlExport); if ($types) { $tmp = array_merge(array($types), $params); $refs = array(); foreach ($tmp as $k => $v) $refs[$k] = &$tmp[$k]; call_user_func_array(array($stx, 'bind_param'), $refs); } $stx->execute(); $rows = stmt_rows_assoc($stx); if ($export === 'csv') { if (ob_get_length()) { ob_end_clean(); } header('Content-Type: text/csv; charset=utf-8'); header('Content-Disposition: attachment; filename=admissions_export.csv'); $out = fopen("php://output","w"); // Nice headers $headers = array(); foreach ($cols as $h) { $label = $h; if ($h==='student_name' || $h==='name') $label = 'Student Name'; if ($h==='mobile' || $h==='phone') $label = 'Mobile'; $headers[] = ucwords(str_replace('_',' ', $label)); } fputcsv($out, $headers); foreach ($rows as $r) { $line = array(); foreach ($cols as $k) { $key = $k; if ($k==='name') $key = 'student_name'; // because we aliased if ($k==='phone') $key = 'mobile'; // aliased $line[] = isset($r[$key]) ? $r[$key] : (isset($r[$k])?$r[$k]:''); } fputcsv($out, $line); } fclose($out); exit; } if ($export === 'pdf') { $tcpdfPath = __DIR__."/../tcpdf/tcpdf.php"; if (!file_exists($tcpdfPath)) { die("โ ๏ธ TCPDF not found at /tcpdf/tcpdf.php"); } require_once($tcpdfPath); if (ob_get_length()) { ob_end_clean(); } $pdf = new TCPDF(); $pdf->AddPage(); $pdf->SetFont("dejavusans","",9); $thead = ''; foreach ($cols as $h) { if ($h==='message') continue; $label = $h; if ($h==='student_name' || $h==='name') $label = 'Student Name'; if ($h==='mobile' || $h==='phone') $label = 'Mobile'; $thead .= "<th><b>".e(ucwords(str_replace('_',' ',$label)))."</b></th>"; } $html = "<h3>Admission Applications</h3><table border='1' cellpadding='4' cellspacing='0'><tr>$thead</tr>"; foreach ($rows as $r) { $html .= "<tr>"; foreach ($cols as $c) { if ($c==='message') continue; $key = $c; if ($c==='name') $key = 'student_name'; if ($c==='phone') $key = 'mobile'; $val = isset($r[$key]) ? $r[$key] : (isset($r[$c])?$r[$c]:''); if ($c==='photo_path' && $val) $val = basename($val); $html .= "<td>".e($val)."</td>"; } $html .= "</tr>"; } $html .= "</table>"; $pdf->writeHTML($html); $pdf->Output("admissions_export.pdf","D"); exit; } } // ===== Distinct filters (Class / Sex / Course) ===== $classes = array(); if (table_has_col($conn,'admissions','class')) { if ($c = $conn->query("SELECT DISTINCT class FROM admissions WHERE class<>'' ORDER BY class")) { while ($r = $c->fetch_assoc()) $classes[] = $r['class']; } } $sexes = array(); if (table_has_col($conn,'admissions','sex')) { if ($c = $conn->query("SELECT DISTINCT sex FROM admissions WHERE sex<>'' ORDER BY sex")) { while ($r = $c->fetch_assoc()) $sexes[] = $r['sex']; } } $courses = array(); if (table_has_col($conn,'admissions','course')) { if ($c = $conn->query("SELECT DISTINCT course FROM admissions WHERE course<>'' ORDER BY course")) { while ($r = $c->fetch_assoc()) $courses[] = $r['course']; } } // Count filtered $countSql = "SELECT COUNT(*) AS c FROM admissions $whereSql"; $stc = $conn->prepare($countSql); if ($types) { $tmp = array_merge(array($types), $params); $refs = array(); foreach ($tmp as $k => $v) $refs[$k] = &$tmp[$k]; call_user_func_array(array($stc, 'bind_param'), $refs); } $stc->execute(); $tmpRows = stmt_rows_assoc($stc); $totalFiltered = isset($tmpRows[0]['c']) ? (int)$tmpRows[0]['c'] : 0; // Preserve query for links $qs = $_GET; unset($qs['export'],$qs['msg'],$qs['delete'],$qs['csrf'],$qs['page']); $qsStrBase = http_build_query($qs); $csvURL = '?export=csv' . ($qsStrBase ? '&'.$qsStrBase : ''); $pdfURL = '?export=pdf' . ($qsStrBase ? '&'.$qsStrBase : ''); // ===== View columns (pretty labels, with fallbacks) ===== $hasStudent = table_has_col($conn,'admissions','student_name'); $hasName = table_has_col($conn,'admissions','name'); $hasMobile = table_has_col($conn,'admissions','mobile'); $hasPhone = table_has_col($conn,'admissions','phone'); $viewCols = array('id'); if ($hasStudent) $viewCols[] = 'student_name'; elseif ($hasName) $viewCols[] = 'name'; if (table_has_col($conn,'admissions','father_name')) $viewCols[] = 'father_name'; if (table_has_col($conn,'admissions','mother_name')) $viewCols[] = 'mother_name'; if (table_has_col($conn,'admissions','dob')) $viewCols[] = 'dob'; $viewCols[] = 'age_years'; if (table_has_col($conn,'admissions','class')) $viewCols[] = 'class'; if (table_has_col($conn,'admissions','sex')) $viewCols[] = 'sex'; if (table_has_col($conn,'admissions','caste')) $viewCols[] = 'caste'; if (table_has_col($conn,'admissions','blood_group')) $viewCols[] = 'blood_group'; if (table_has_col($conn,'admissions','aadhaar')) $viewCols[] = 'aadhaar'; if (table_has_col($conn,'admissions','school')) $viewCols[] = 'school'; // Contact block if ($hasMobile) $viewCols[] = 'mobile'; elseif ($hasPhone) $viewCols[] = 'phone'; if (table_has_col($conn,'admissions','email')) $viewCols[] = 'email'; if (table_has_col($conn,'admissions','address')) $viewCols[] = 'address'; if (table_has_col($conn,'admissions','course')) $viewCols[] = 'course'; if (table_has_col($conn,'admissions','message')) $viewCols[] = 'message'; if (table_has_col($conn,'admissions','photo_path')) $viewCols[] = 'photo_path'; if (table_has_col($conn,'admissions','created_at')) $viewCols[] = 'created_at'; // ===== SELECT list for table (Aadhaar FULL, compute Age, alias student_name/mobile) ===== $selectParts = array(); foreach ($viewCols as $c){ if ($c==='aadhaar' && table_has_col($conn,'admissions','aadhaar')) { $selectParts[] = "aadhaar"; // โฌ full show } elseif ($c==='age_years') { if (table_has_col($conn,'admissions','dob')) $selectParts[] = "TIMESTAMPDIFF(YEAR, dob, CURDATE()) AS age_years"; else $selectParts[] = "NULL AS age_years"; } elseif ($c==='student_name' && !$hasStudent && $hasName) { $selectParts[] = "name AS student_name"; } elseif ($c==='mobile' && !$hasMobile && $hasPhone) { $selectParts[] = "phone AS mobile"; } else { $selectParts[] = $c; } } $selectListTable = implode(',', $selectParts); // Sort column normalization $sortSql = $sort; if ($sort==='student_name' && !$hasStudent && $hasName) $sortSql = 'name'; if ($sort==='mobile' && !$hasMobile && $hasPhone) $sortSql = 'phone'; // Main query with pagination $sql = "SELECT $selectListTable FROM admissions $whereSql ORDER BY $sortSql $sortDir LIMIT ? OFFSET ?"; $stmt = $conn->prepare($sql); if ($types) { $typesWith = $types.'ii'; $tmp = array_merge(array($typesWith), $params, array($per, $offset)); $refs = array(); foreach ($tmp as $k => $v) $refs[$k] = &$tmp[$k]; call_user_func_array(array($stmt, 'bind_param'), $refs); } else { $stmt->bind_param('ii', $per, $offset); } $stmt->execute(); $rowsTbl = stmt_rows_assoc($stmt); // Total overall $totalCount = 0; if ($ct = $conn->query("SELECT COUNT(*) AS c FROM admissions")) { $totalCount = (int)$ct->fetch_assoc()['c']; } // ===== Layout ===== include 'includes/header.php'; ?> <style> :root{ --brand:#e40000; --brand-2:#ffe0e0; --ink:#14171a; --muted:#6b7280; --bg:#f6f7fb; --card:rgba(255,255,255,.88); --ring:rgba(228,0,0,.18); --radius:16px; } body{ background:var(--bg); } .top-bar{ height:5px; background:linear-gradient(90deg,var(--brand),#ff5757); border-radius:8px; } .card{ border:0; border-radius:var(--radius); background:var(--card); backdrop-filter: blur(8px); box-shadow:0 8px 26px rgba(30,30,30,.08); } .card-header{ background:transparent; border-bottom:1px solid rgba(0,0,0,.06); font-weight:600; } .badge-soft{ background:var(--brand-2); color:var(--brand); border-radius:999px; padding:.35rem .6rem; font-weight:700; } .btn-brand{ background:var(--brand); border-color:var(--brand); color:#fff!important; border-radius:14px; box-shadow:0 8px 18px var(--ring); } .btn-brand:hover{ filter:brightness(.95); } .btn-ghost{ background:#fff; border:1px solid rgba(0,0,0,.08); color:var(--ink); border-radius:14px; } .chip{ border:1px solid rgba(0,0,0,.08); background:#fff; border-radius:999px; padding:6px 12px; font-size:.85rem; } .help-text{ color:var(--muted); font-size:.82rem; } .table-modern thead th{ background:#fff; border-bottom:1px solid rgba(0,0,0,.08); font-size:.82rem; text-transform:uppercase; letter-spacing:.02em; white-space:nowrap; } .table-modern tbody td{ vertical-align:middle; } .table-modern tbody tr{ border-bottom:1px solid rgba(0,0,0,.05); } .table-modern tbody tr:hover{ background:#fff; box-shadow:inset 0 0 0 9999px rgba(228,0,0,.02); } .sort a{ text-decoration:none; color:inherit; } .sort a.active{ text-decoration:underline; text-underline-offset:3px; } .thumbnail{ width:40px; height:40px; object-fit:cover; border-radius:6px; border:1px solid rgba(0,0,0,.08); } </style> <div class="container mt-3 mb-4"> <div class="d-flex align-items-center justify-content-between mb-2"> <h4 class="m-0">๐ Admission Applications</h4> <div class="d-flex align-items-center gap-2"> <div class="chip"><strong>Total:</strong> <?= (int)$totalCount ?></div> <div class="chip"><strong>Filtered:</strong> <?= (int)$totalFiltered ?></div> <div class="chip"><strong>Export:</strong> <a class="btn btn-ghost btn-sm ms-2" href="<?= e($csvURL) ?>">CSV</a> <a class="btn btn-ghost btn-sm ms-1" href="<?= e($pdfURL) ?>">PDF</a> </div> </div> </div> <div class="top-bar mb-3"></div> <?php if (!empty($_GET['msg']) && $_GET['msg']==='deleted'): ?> <div class="alert alert-success shadow-sm">๐๏ธ Admission record deleted.</div> <?php elseif (!empty($_GET['msg']) && $_GET['msg']==='bulk_deleted'): ?> <div class="alert alert-success shadow-sm">๐๏ธ Selected records deleted.</div> <?php endif; ?> <!-- Filters --> <form id="filterForm" class="card mb-3 p-3" method="get" action=""> <div class="row g-3 align-items-end"> <div class="col-md-4"> <label class="mb-1"><strong>Search</strong></label> <input type="text" name="q" class="form-control" placeholder="Student/Father/Mother/School/Mobile/Email/Aadhaar/Notes..." value="<?= e($q) ?>"> </div> <?php if ($classes): ?> <div class="col-md-3"> <label class="mb-1"><strong>Class</strong></label> <select name="class" class="form-select"> <option value="">All</option> <?php foreach ($classes as $c): ?> <option value="<?= e($c) ?>" <?= $classF===$c?'selected':'' ?>><?= e($c) ?></option> <?php endforeach; ?> </select> </div> <?php endif; ?> <?php if ($sexes): ?> <div class="col-md-2"> <label class="mb-1"><strong>Sex</strong></label> <select name="sex" class="form-select"> <option value="">All</option> <?php foreach ($sexes as $s): ?> <option value="<?= e($s) ?>" <?= $sexF===$s?'selected':'' ?>><?= e($s) ?></option> <?php endforeach; ?> </select> </div> <?php endif; ?> <?php if ($courses): ?> <div class="col-md-2"> <label class="mb-1"><strong>Course</strong></label> <select name="course" class="form-select"> <option value="">All</option> <?php foreach ($courses as $c): ?> <option value="<?= e($c) ?>" <?= $courseF===$c?'selected':'' ?>><?= e($c) ?></option> <?php endforeach; ?> </select> </div> <?php endif; ?> <div class="col-md-1"> <label class="mb-1"><strong>From</strong></label> <input type="date" name="from" class="form-control" value="<?= e($from) ?>"> </div> <div class="col-md-1"> <label class="mb-1"><strong>To</strong></label> <input type="date" name="to" class="form-control" value="<?= e($to) ?>"> </div> <div class="col-md-1 d-grid"> <button class="btn btn-ghost" type="submit">Search</button> </div> <div class="col-12 d-flex align-items-center gap-3 mt-2"> <?php if ($q || $classF || $sexF || $courseF || $from || $to): ?> <a class="btn btn-link p-0" href="<?= e(strtok($_SERVER['REQUEST_URI'],'?')) ?>">Clear filters</a> <?php else: ?> <span class="help-text">Tip: Filter by Class/Sex/Course or Date to narrow down records.</span> <?php endif; ?> <div class="ms-auto d-flex align-items-center gap-2"> <label class="help-text mb-0">Per page</label> <select class="form-select" style="width:auto" name="per" onchange="this.form.submit()"> <?php foreach (array(10,20,50,100,200) as $n): ?> <option value="<?= $n ?>" <?= $per===$n?'selected':'' ?>><?= $n ?></option> <?php endforeach; ?> </select> </div> </div> </div> </form> <!-- Bulk + Table --> <form method="post" id="bulkForm" onsubmit="return confirm('Delete selected records?');"> <input type="hidden" name="csrf" value="<?= e($CSRF) ?>"> <div class="card"> <div class="card-header d-flex align-items-center justify-content-between"> <span>All Applications</span> <div class="d-flex align-items-center gap-2"> <select name="bulk_action" class="form-select" style="width:auto"> <option value="">Bulk action</option> <option value="delete">Delete</option> </select> <button type="submit" class="btn btn-brand btn-sm">Apply</button> <span class="badge-soft">List View</span> </div> </div> <div class="table-responsive"> <table class="table table-modern table-borderless align-middle mb-0"> <thead> <tr> <th><input type="checkbox" id="checkAll"></th> <?php foreach ($viewCols as $c){ $label = $c; if ($c==='student_name' || $c==='name') $label = 'Student Name'; if ($c==='mobile' || $c==='phone') $label = 'Mobile'; $dirNext = ($sort===$c && $sortDir==='ASC') ? 'desc' : 'asc'; $qsH = $_GET; $qsH['sort']=$c; $qsH['dir']=$dirNext; $qsH['page']=1; $link = '?'.http_build_query($qsH); $active = ($sort===$c) ? 'active' : ''; echo "<th class='sort'><a class='$active' href='".e($link)."'>".e(ucwords(str_replace('_',' ', $label)))."</a></th>"; } ?> <th>Action</th> </tr> </thead> <tbody> <?php if (!empty($rowsTbl)): foreach ($rowsTbl as $row): ?> <tr> <td><input type="checkbox" name="ids[]" value="<?= (int)$row['id'] ?>"></td> <?php foreach ($viewCols as $c): ?> <?php $key = $c; if ($c==='name') $key = 'student_name'; if ($c==='phone') $key = 'mobile'; $val = isset($row[$key]) ? $row[$key] : (isset($row[$c])?$row[$c]:''); if ($c==='message'){ $short = mb_strimwidth((string)$val,0,60,'โฆ'); echo "<td title='".e((string)$val)."'>".e($short)."</td>"; } elseif ($c==='photo_path' && !empty($val)) { // Build a safe URL from site root so /admin/... doesn't break $p = trim((string)$val); if (preg_match('~^(https?://|/)~i', $p)) { $web = $p; // already absolute or root-relative } else { $web = '/'.ltrim($p,'/'); // make root-relative } $fs = $_SERVER['DOCUMENT_ROOT'] . (strpos($web,'/')===0 ? $web : '/'.$web); $url = e($web); if (is_file($fs)) { echo "<td><a href='$url' target='_blank' rel='noopener'><img src='$url' class='thumbnail' alt='photo'></a></td>"; } else { echo "<td><a href='$url' target='_blank' rel='noopener'>".e(basename($p))."</a></td>"; } } elseif (($c==='mobile' || $c==='phone') && $val) { $tel = preg_replace('/\D+/','',$val); echo "<td><a href='tel:$tel'>".e($val)."</a></td>"; } else { echo "<td>".e($val)."</td>"; } ?> <?php endforeach; ?> <td class="text-nowrap"> <form method="post" class="d-inline" onsubmit="return confirm('Delete this admission?')"> <input type="hidden" name="csrf" value="<?= e($CSRF) ?>"> <input type="hidden" name="delete_id" value="<?= (int)$row['id'] ?>"> <button class="btn btn-brand btn-sm" type="submit">Delete</button> </form> </td> </tr> <?php endforeach; else: ?> <tr><td colspan="<?= (count($viewCols)+2) ?>" class="text-muted text-center py-4">No admissions found</td></tr> <?php endif; ?> </tbody> </table> </div> </div> </form> <!-- Pagination --> <?php $pages = (int)ceil(($totalFiltered ?: 0) / $per); if ($pages < 1) $pages = 1; if ($page > $pages) $page = $pages; if ($pages > 1): $buildLink = function($p) use ($qsStrBase){ $q = $qsStrBase ? $qsStrBase.'&' : ''; return '?'.$q.'page='.$p; }; ?> <nav class="mt-3"> <ul class="pagination"> <li class="page-item <?= $page<=1?'disabled':'' ?>"> <a class="page-link" href="<?= e(($qsStrBase?('?'.$qsStrBase.'&page='.max(1,$page-1)):'?page='.max(1,$page-1))) ?>">ยซ Prev</a> </li> <?php $start=max(1,$page-2); $end=min($pages,$page+2); for ($p=$start;$p<=$end;$p++): ?> <li class="page-item <?= $p===$page?'active':'' ?>"> <a class="page-link" href="<?= e(($qsStrBase?('?'.$qsStrBase.'&page='.$p):'?page='.$p)) ?>"><?= $p ?></a> </li> <?php endfor; ?> <li class="page-item <?= $page>=$pages?'disabled':'' ?>"> <a class="page-link" href="<?= e(($qsStrBase?('?'.$qsStrBase.'&page='.min($pages,$page+1)):'?page='.min($pages,$page+1))) ?>">Next ยป</a> </li> </ul> </nav> <?php endif; ?> </div> <!-- Auto Search + CheckAll --> <script> (function(){ var form = document.getElementById('filterForm'); if (!form) return; function autoSubmit(delay){ clearTimeout(window.__t); window.__t = setTimeout(function(){ if (form.requestSubmit) form.requestSubmit(); else form.submit(); }, delay); } ['q','class','sex','course','from','to'].forEach(function(n){ var el = form.querySelector('[name="'+n+'"]'); if (!el) return; el.addEventListener('input', function(){ autoSubmit(500); }); el.addEventListener('change', function(){ autoSubmit(50); }); }); var checkAll = document.getElementById('checkAll'); if (checkAll){ checkAll.addEventListener('change', function(){ var boxes = document.querySelectorAll('input[name="ids[]"]'); for (var i=0;i<boxes.length;i++) boxes[i].checked = checkAll.checked; }); } })(); </script> <?php include 'includes/footer.php'; ?>
Upload File
Create Folder