prepare( "SELECT COUNT(*) FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = ? AND TABLE_NAME = 'hospital_ads' AND COLUMN_NAME = ?" ); $stmt->execute([DB_NAME, $column]); return $cache[$column] = ((int) $stmt->fetchColumn() > 0); } $pdo->exec("CREATE TABLE IF NOT EXISTS hospital_ads ( id INT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(255) NULL, video_path VARCHAR(255) NOT NULL, media_type VARCHAR(20) NOT NULL DEFAULT 'video', media_path VARCHAR(255) NULL, is_active TINYINT(1) DEFAULT 1, sort_order INT DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP )"); if (!qh_ads_column_exists($pdo, 'media_type')) { $pdo->exec("ALTER TABLE hospital_ads ADD COLUMN media_type VARCHAR(20) NOT NULL DEFAULT 'video' AFTER video_path"); } if (!qh_ads_column_exists($pdo, 'media_path')) { $pdo->exec("ALTER TABLE hospital_ads ADD COLUMN media_path VARCHAR(255) NULL AFTER media_type"); } $pdo->exec("UPDATE hospital_ads SET media_type = 'video' WHERE media_type IS NULL OR media_type = ''"); $pdo->exec("UPDATE hospital_ads SET media_path = video_path WHERE (media_path IS NULL OR media_path = '') AND video_path <> ''"); $pdo->exec("CREATE TABLE IF NOT EXISTS hospital_news ( id INT AUTO_INCREMENT PRIMARY KEY, phrase VARCHAR(1000) NOT NULL, is_active TINYINT(1) DEFAULT 1, sort_order INT DEFAULT 0, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP )"); // Handle Form Submissions $message = ''; if ($_SERVER['REQUEST_METHOD'] === 'POST') { $action = (string) ($_POST['action'] ?? ''); $adId = (int) ($_POST['ad_id'] ?? $_POST['video_id'] ?? 0); if ($action === 'add_media' && !empty($_FILES['media']['name'])) { $mediaFile = $_FILES['media']; $title = trim((string) ($_POST['title'] ?? '')); $ext = strtolower(pathinfo($mediaFile['name'], PATHINFO_EXTENSION)); $typeMap = [ 'mp4' => 'video', 'webm' => 'video', 'ogg' => 'video', 'jpg' => 'image', 'jpeg' => 'image', 'png' => 'image', 'webp' => 'image', 'gif' => 'image', ]; if (!isset($typeMap[$ext])) { $message = qh_t( "Invalid media format (.$ext). Allowed formats: JPG, JPEG, PNG, WEBP, GIF, MP4, WebM, OGG.", "تنسيق وسائط غير صالح (.$ext). الصيغ المسموحة: JPG, JPEG, PNG, WEBP, GIF, MP4, WebM, OGG." ); } elseif ($mediaFile['error'] !== UPLOAD_ERR_OK) { $errorMap = [ UPLOAD_ERR_INI_SIZE => 'File exceeds max size in php.ini.', UPLOAD_ERR_FORM_SIZE => 'File exceeds max size in HTML form.', UPLOAD_ERR_PARTIAL => 'File was partially uploaded.', UPLOAD_ERR_NO_FILE => 'No file was uploaded.', UPLOAD_ERR_NO_TMP_DIR => 'Missing a temporary folder.', UPLOAD_ERR_CANT_WRITE => 'Failed to write file to disk.', UPLOAD_ERR_EXTENSION => 'A PHP extension stopped the upload.', ]; $errMsg = $errorMap[$mediaFile['error']] ?? 'Unknown error'; $message = qh_t('Upload error: ' . $errMsg, 'خطأ في الرفع: ' . $errMsg); } else { $mediaType = $typeMap[$ext]; $uploadDir = __DIR__ . ($mediaType === 'video' ? '/assets/videos/uploads/' : '/assets/images/uploads/'); if (!is_dir($uploadDir)) { mkdir($uploadDir, 0777, true); } $filename = uniqid($mediaType === 'video' ? 'vid_' : 'img_') . '.' . $ext; $dest = $uploadDir . $filename; if (move_uploaded_file($mediaFile['tmp_name'], $dest)) { $path = ($mediaType === 'video' ? 'assets/videos/uploads/' : 'assets/images/uploads/') . $filename; $legacyVideoPath = $mediaType === 'video' ? $path : ''; $stmt = $pdo->prepare( "INSERT INTO hospital_ads (title, video_path, media_type, media_path, is_active) VALUES (?, ?, ?, ?, 1)" ); $stmt->execute([$title, $legacyVideoPath, $mediaType, $path]); $message = $mediaType === 'video' ? qh_t('Video uploaded successfully.', 'تم رفع الفيديو بنجاح.') : qh_t('Image uploaded successfully.', 'تم رفع الصورة بنجاح.'); } else { $message = qh_t('Failed to save uploaded file.', 'فشل في حفظ الملف المرفوع.'); } } } elseif ($action === 'delete_media' && $adId > 0) { $stmt = $pdo->prepare( "SELECT COALESCE(NULLIF(media_path, ''), NULLIF(video_path, '')) AS file_path FROM hospital_ads WHERE id = ?" ); $stmt->execute([$adId]); $media = $stmt->fetch(); if ($media) { $filePath = (string) ($media['file_path'] ?? ''); if ($filePath !== '') { $fullPath = __DIR__ . '/' . $filePath; if (file_exists($fullPath)) { unlink($fullPath); } } $pdo->prepare("DELETE FROM hospital_ads WHERE id = ?")->execute([$adId]); $message = qh_t('Ad deleted successfully.', 'تم حذف الإعلان بنجاح.'); } } elseif ($action === 'toggle_status' && $adId > 0) { $stmt = $pdo->prepare("UPDATE hospital_ads SET is_active = NOT is_active WHERE id = ?"); $stmt->execute([$adId]); $message = qh_t('Ad status updated.', 'تم تحديث حالة الإعلان.'); } elseif ($action === 'add_news' && !empty($_POST['phrase'])) { $phrase = trim($_POST['phrase']); $stmt = $pdo->prepare("INSERT INTO hospital_news (phrase, is_active) VALUES (?, 1)"); $stmt->execute([$phrase]); $message = qh_t('Phrase added successfully.', 'تمت إضافة العبارة بنجاح.'); } elseif ($action === 'delete_news' && !empty($_POST['news_id'])) { $id = (int) $_POST['news_id']; $pdo->prepare("DELETE FROM hospital_news WHERE id = ?")->execute([$id]); $message = qh_t('Phrase deleted successfully.', 'تم حذف العبارة بنجاح.'); } elseif ($action === 'toggle_news_status' && !empty($_POST['news_id'])) { $id = (int) $_POST['news_id']; $pdo->prepare("UPDATE hospital_news SET is_active = NOT is_active WHERE id = ?")->execute([$id]); $message = qh_t('Phrase status updated.', 'تم تحديث حالة العبارة.'); } } // Fetch existing ads $stmt = $pdo->query( "SELECT *, COALESCE(NULLIF(media_type, ''), 'video') AS effective_media_type, COALESCE(NULLIF(media_path, ''), NULLIF(video_path, '')) AS effective_media_path FROM hospital_ads ORDER BY sort_order ASC, id DESC" ); $ads = $stmt->fetchAll(); $stmt2 = $pdo->query("SELECT * FROM hospital_news ORDER BY sort_order ASC, id DESC"); $newsPhrases = $stmt2->fetchAll(); qh_page_start( 'admin_ads', qh_t('Manage Advertisements', 'إدارة الإعلانات'), qh_t('Upload and manage image and video ads for the queue display.', 'رفع وإدارة إعلانات الصور والفيديوهات لعرضها على شاشة الطابور.') ); ?>
= qh_h(qh_t('Videos play until they end, while images stay on screen for 10 seconds in the same rotation.', 'تعمل الفيديوهات حتى نهايتها، بينما تبقى الصور على الشاشة لمدة 10 ثوانٍ ضمن نفس التدوير.')) ?>
| = qh_h(qh_t('Preview', 'معاينة')) ?> | = qh_h(qh_t('Title', 'العنوان')) ?> | = qh_h(qh_t('Type', 'النوع')) ?> | = qh_h(qh_t('Status', 'الحالة')) ?> | = qh_h(qh_t('Actions', 'الإجراءات')) ?> |
|---|---|---|---|---|
| = qh_h(qh_t('No ads uploaded yet.', 'لم يتم رفع أي إعلانات بعد.')) ?> | ||||
|
|
= qh_h($ad['title'] ?: qh_t('Untitled', 'بدون عنوان')) ?> | = qh_h(($ad['effective_media_type'] ?? 'video') === 'image' ? qh_t('Image', 'صورة') : qh_t('Video', 'فيديو')) ?> | = qh_h(qh_t('Active', 'مفعل')) ?> = qh_h(qh_t('Inactive', 'غير مفعل')) ?> |
|
= qh_h(qh_t('These phrases will scroll at the bottom of the display screen.', 'ستتحرك هذه العبارات في أسفل شاشة العرض.')) ?>
| = qh_h(qh_t('Phrase', 'العبارة')) ?> | = qh_h(qh_t('Status', 'الحالة')) ?> | = qh_h(qh_t('Actions', 'الإجراءات')) ?> |
|---|---|---|
| = qh_h(qh_t('No phrases added yet.', 'لم يتم إضافة عبارات بعد.')) ?> | ||
| = qh_h($n['phrase']) ?> | = qh_h(qh_t('Active', 'مفعل')) ?> = qh_h(qh_t('Inactive', 'غير مفعل')) ?> |
|