From 22c2a878c1f05a6267df1772552cbeafaed468c2 Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Mon, 6 Apr 2026 04:42:01 +0000 Subject: [PATCH] update forms to modal --- admin.php | 4 +- admin_classes.php | 177 +++++++++++++++---------- admin_subjects.php | 318 ++++++++++++++++++++++++++------------------- admin_teachers.php | 282 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 578 insertions(+), 203 deletions(-) create mode 100644 admin_teachers.php diff --git a/admin.php b/admin.php index f49ef43..1cd5fcc 100644 --- a/admin.php +++ b/admin.php @@ -160,7 +160,7 @@ render_head(
- +
@@ -244,6 +244,8 @@ render_head( + +
diff --git a/admin_classes.php b/admin_classes.php index 02a025f..e1c3cb0 100644 --- a/admin_classes.php +++ b/admin_classes.php @@ -6,22 +6,27 @@ $action = $_GET['action'] ?? 'list'; $id = (int)($_GET['id'] ?? 0); if ($_SERVER['REQUEST_METHOD'] === 'POST') { - if ($action === 'delete' && $id > 0) { + // If modal is submitted, action is typically passed as a POST variable. + // However, delete still uses the URL action. Let's support both. + $post_action = $_POST['action'] ?? $action; + $post_id = (int)($_POST['id'] ?? $id); + + if ($post_action === 'delete' && $post_id > 0) { $stmt = db()->prepare("DELETE FROM classes WHERE id = ?"); - $stmt->execute([$id]); + $stmt->execute([$post_id]); header('Location: ' . app_url('admin.php', ['page' => 'classes'])); exit; } - if ($action === 'edit' || $action === 'add') { + if ($post_action === 'edit' || $post_action === 'add') { $name_en = $_POST['name_en'] ?? ''; $name_ar = $_POST['name_ar'] ?? ''; $desc_en = $_POST['description_en'] ?? ''; $desc_ar = $_POST['description_ar'] ?? ''; - if ($action === 'edit' && $id > 0) { + if ($post_action === 'edit' && $post_id > 0) { $stmt = db()->prepare("UPDATE classes SET name_en=?, name_ar=?, description_en=?, description_ar=? WHERE id=?"); - $stmt->execute([$name_en, $name_ar, $desc_en, $desc_ar, $id]); + $stmt->execute([$name_en, $name_ar, $desc_en, $desc_ar, $post_id]); } else { $stmt = db()->prepare("INSERT INTO classes (name_en, name_ar, description_en, description_ar) VALUES (?, ?, ?, ?)"); $stmt->execute([$name_en, $name_ar, $desc_en, $desc_ar]); @@ -31,72 +36,34 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST') { } } -if ($action === 'edit' || $action === 'add'): - $item = ['name_en'=>'', 'name_ar'=>'', 'description_en'=>'', 'description_ar'=>'']; - if ($action === 'edit' && $id > 0) { - $stmt = db()->prepare("SELECT * FROM classes WHERE id = ?"); - $stmt->execute([$id]); - $item = $stmt->fetch(PDO::FETCH_ASSOC) ?: $item; - } -?> -
-
-

-
-
-
-
-
- - -
-
- - -
-
- - -
-
- - -
- - - -
+// list view +$search = $_GET['search'] ?? ''; +$page_num = max(1, (int)($_GET['p'] ?? 1)); +$limit = 10; +$offset = ($page_num - 1) * $limit; -prepare("SELECT COUNT(*) FROM classes $where"); +$total_stmt->execute($params); +$total = $total_stmt->fetchColumn(); +$pages = ceil($total / $limit); - $total_stmt = db()->prepare("SELECT COUNT(*) FROM classes $where"); - $total_stmt->execute($params); - $total = $total_stmt->fetchColumn(); - $pages = ceil($total / $limit); - - $stmt = db()->prepare("SELECT * FROM classes $where ORDER BY id DESC LIMIT $limit OFFSET $offset"); - $stmt->execute($params); - $items = $stmt->fetchAll(PDO::FETCH_ASSOC); +$stmt = db()->prepare("SELECT * FROM classes $where ORDER BY id DESC LIMIT $limit OFFSET $offset"); +$stmt->execute($params); +$items = $stmt->fetchAll(PDO::FETCH_ASSOC); ?>

- + +
@@ -132,12 +99,54 @@ if ($action === 'edit' || $action === 'add'):
+ + + + + @@ -159,4 +168,40 @@ if ($action === 'edit' || $action === 'add'): - + + + \ No newline at end of file diff --git a/admin_subjects.php b/admin_subjects.php index 1c4edef..3b692d6 100644 --- a/admin_subjects.php +++ b/admin_subjects.php @@ -10,167 +10,92 @@ $classes_stmt = db()->query("SELECT id, name_en, name_ar FROM classes ORDER BY i $all_classes = $classes_stmt->fetchAll(PDO::FETCH_ASSOC); if ($_SERVER['REQUEST_METHOD'] === 'POST') { - if ($action === 'delete' && $id > 0) { + $post_action = $_POST['action'] ?? $action; + $post_id = (int)($_POST['id'] ?? $id); + + if ($post_action === 'delete' && $post_id > 0) { $stmt = db()->prepare("DELETE FROM subjects WHERE id = ?"); - $stmt->execute([$id]); + $stmt->execute([$post_id]); header('Location: ' . app_url('admin.php', ['page' => 'subjects'])); exit; } - if ($action === 'edit' || $action === 'add') { - $slug = $_POST['slug'] ?? ''; + if ($post_action === 'edit' || $post_action === 'add') { $class_id = !empty($_POST['class_id']) ? (int)$_POST['class_id'] : null; $title_en = $_POST['title_en'] ?? ''; $title_ar = $_POST['title_ar'] ?? ''; $summary_en = $_POST['summary_en'] ?? ''; $summary_ar = $_POST['summary_ar'] ?? ''; - $teacher_en = $_POST['teacher_en'] ?? ''; - $teacher_ar = $_POST['teacher_ar'] ?? ''; - $meet_url = $_POST['meet_url'] ?? ''; - if ($action === 'edit' && $id > 0) { - $stmt = db()->prepare("UPDATE subjects SET slug=?, class_id=?, title_en=?, title_ar=?, summary_en=?, summary_ar=?, teacher_en=?, teacher_ar=?, meet_url=? WHERE id=?"); - $stmt->execute([$slug, $class_id, $title_en, $title_ar, $summary_en, $summary_ar, $teacher_en, $teacher_ar, $meet_url, $id]); + if ($post_action === 'edit' && $post_id > 0) { + $stmt = db()->prepare("UPDATE subjects SET class_id=?, title_en=?, title_ar=?, summary_en=?, summary_ar=? WHERE id=?"); + $stmt->execute([$class_id, $title_en, $title_ar, $summary_en, $summary_ar, $post_id]); } else { - $stmt = db()->prepare("INSERT INTO subjects (slug, class_id, title_en, title_ar, summary_en, summary_ar, teacher_en, teacher_ar, meet_url) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)"); - $stmt->execute([$slug, $class_id, $title_en, $title_ar, $summary_en, $summary_ar, $teacher_en, $teacher_ar, $meet_url]); + $slug = strtolower(trim(preg_replace('/[^A-Za-z0-9-]+/', '-', $title_en))); + if (empty($slug)) $slug = 'subject'; + $slug .= '-' . substr(md5(uniqid()), 0, 5); + + $stmt = db()->prepare("INSERT INTO subjects (slug, class_id, title_en, title_ar, summary_en, summary_ar) VALUES (?, ?, ?, ?, ?, ?)"); + $stmt->execute([$slug, $class_id, $title_en, $title_ar, $summary_en, $summary_ar]); } header('Location: ' . app_url('admin.php', ['page' => 'subjects'])); exit; } } -if ($action === 'edit' || $action === 'add'): - $item = ['slug'=>'', 'class_id'=>null, 'title_en'=>'', 'title_ar'=>'', 'summary_en'=>'', 'summary_ar'=>'', 'teacher_en'=>'', 'teacher_ar'=>'', 'meet_url'=>'']; - if ($action === 'edit' && $id > 0) { - $stmt = db()->prepare("SELECT * FROM subjects WHERE id = ?"); - $stmt->execute([$id]); - $item = $stmt->fetch(PDO::FETCH_ASSOC) ?: $item; - } -?> -
-
-

-
-
-
-
-
-
- - -
-
- - -
-
+// list view +$search = $_GET['search'] ?? ''; +$filter_class = $_GET['class_id'] ?? ''; +$page_num = max(1, (int)($_GET['p'] ?? 1)); +$limit = 10; +$offset = ($page_num - 1) * $limit; -
-
- - -
-
- - -
-
+$where_clauses = []; +$params = []; -
-
- - -
-
- - -
-
+if ($search !== '') { + $where_clauses[] = "(s.title_en LIKE ? OR s.title_ar LIKE ?)"; + $params[] = "%$search%"; + $params[] = "%$search%"; +} +if ($filter_class !== '') { + $where_clauses[] = "s.class_id = ?"; + $params[] = $filter_class; +} -
-
- - -
-
- - -
-
+$where = ""; +if (count($where_clauses) > 0) { + $where = "WHERE " . implode(" AND ", $where_clauses); +} -
- - -
+$total_stmt = db()->prepare("SELECT COUNT(*) FROM subjects s $where"); +$total_stmt->execute($params); +$total = $total_stmt->fetchColumn(); +$pages = ceil($total / $limit); - - - -
- - 0) { - $where = "WHERE " . implode(" AND ", $where_clauses); - } - - $total_stmt = db()->prepare("SELECT COUNT(*) FROM subjects s $where"); - $total_stmt->execute($params); - $total = $total_stmt->fetchColumn(); - $pages = ceil($total / $limit); - - $stmt = db()->prepare(" - SELECT s.*, c.name_en AS class_name_en, c.name_ar AS class_name_ar - FROM subjects s - LEFT JOIN classes c ON s.class_id = c.id - $where - ORDER BY s.id DESC - LIMIT $limit OFFSET $offset - "); - $stmt->execute($params); - $items = $stmt->fetchAll(PDO::FETCH_ASSOC); +$stmt = db()->prepare(" + SELECT s.*, c.name_en AS class_name_en, c.name_ar AS class_name_ar + FROM subjects s + LEFT JOIN classes c ON s.class_id = c.id + $where + ORDER BY s.id DESC + LIMIT $limit OFFSET $offset +"); +$stmt->execute($params); +$items = $stmt->fetchAll(PDO::FETCH_ASSOC); ?>

- + +
- +
- + + - @@ -206,7 +131,11 @@ if ($action === 'edit' || $action === 'add'): + - + + + + + @@ -248,4 +237,61 @@ if ($action === 'edit' || $action === 'add'): - + + + diff --git a/admin_teachers.php b/admin_teachers.php new file mode 100644 index 0000000..b439d1e --- /dev/null +++ b/admin_teachers.php @@ -0,0 +1,282 @@ + 0) { + $stmt = db()->prepare("DELETE FROM teachers WHERE id = ?"); + $stmt->execute([$post_id]); + header('Location: ' . app_url('admin.php', ['page' => 'teachers'])); + exit; + } + + if ($post_action === 'edit' || $post_action === 'add') { + $name = $_POST['name'] ?? ''; + $email = $_POST['email'] ?? ''; + $phone = $_POST['phone'] ?? ''; + $bio = $_POST['bio'] ?? ''; + $raw_password = $_POST['password'] ?? ''; + $photo_path = ''; + $existing_password = ''; + + if ($post_action === 'edit' && $post_id > 0) { + $stmt = db()->prepare("SELECT photo_path, password FROM teachers WHERE id = ?"); + $stmt->execute([$post_id]); + $existing = $stmt->fetch(PDO::FETCH_ASSOC); + if ($existing) { + $photo_path = $existing['photo_path']; + $existing_password = $existing['password']; + } + } + + $upload_dir = __DIR__ . '/assets/images/uploads/'; + if (!is_dir($upload_dir)) { + mkdir($upload_dir, 0777, true); + } + + if (!empty($_FILES['photo']['tmp_name'])) { + $filename = 'teacher_' . time() . '_' . basename($_FILES['photo']['name']); + $target = $upload_dir . $filename; + if (move_uploaded_file($_FILES['photo']['tmp_name'], $target)) { + $photo_path = 'assets/images/uploads/' . $filename; + } + } + + $final_password = ''; + if ($post_action === 'add') { + $final_password = $raw_password ? password_hash($raw_password, PASSWORD_DEFAULT) : ''; + } else { + if ($raw_password) { + $final_password = password_hash($raw_password, PASSWORD_DEFAULT); + } else { + $final_password = $existing_password; + } + } + + if ($post_action === 'edit' && $post_id > 0) { + $stmt = db()->prepare("UPDATE teachers SET name=?, email=?, phone=?, bio=?, photo_path=?, password=? WHERE id=?"); + $stmt->execute([$name, $email, $phone, $bio, $photo_path, $final_password, $post_id]); + } else { + $stmt = db()->prepare("INSERT INTO teachers (name, email, phone, bio, photo_path, password) VALUES (?, ?, ?, ?, ?, ?)"); + $stmt->execute([$name, $email, $phone, $bio, $photo_path, $final_password]); + } + header('Location: ' . app_url('admin.php', ['page' => 'teachers'])); + exit; + } +} + +// list view +$search = $_GET['search'] ?? ''; +$page_num = max(1, (int)($_GET['p'] ?? 1)); +$limit = 10; +$offset = ($page_num - 1) * $limit; + +$where = ""; +$params = []; +if ($search !== '') { + $where = "WHERE name LIKE ? OR email LIKE ? OR phone LIKE ?"; + $params[] = "%$search%"; + $params[] = "%$search%"; + $params[] = "%$search%"; +} + +$total_stmt = db()->prepare("SELECT COUNT(*) FROM teachers $where"); +$total_stmt->execute($params); +$total = $total_stmt->fetchColumn(); +$pages = ceil($total / $limit); + +$stmt = db()->prepare("SELECT * FROM teachers $where ORDER BY id DESC LIMIT $limit OFFSET $offset"); +$stmt->execute($params); +$items = $stmt->fetchAll(PDO::FETCH_ASSOC); +?> +
+
+

+
+ +
+ +
+
+ + + + + + + +
+ +
+
+
- +
- +
ID
-
+
+
+ +
@@ -218,15 +147,75 @@ if ($action === 'edit' || $action === 'add'): - - - + - +
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + +
+ +
+ +
+
+
+
+
+
+ +
+ +
+
+
+ + + 1): ?> + + + + + +