39669-vm/app_settings.php
2026-04-17 03:38:41 +00:00

183 lines
10 KiB
PHP

<?php
declare(strict_types=1);
require_once __DIR__ . '/includes/app.php';
$flash = consume_flash();
$settings = get_app_settings();
$errors = [];
$values = [
'app_name' => $settings['app_name'] ?? '',
'app_slogan' => $settings['app_slogan'] ?? '',
'app_email' => $settings['app_email'] ?? '',
'app_telephone' => $settings['app_telephone'] ?? '',
'completion_certificate_template' => $settings['completion_certificate_template'] ?? 'modern',
'completion_certificate_tagline' => $settings['completion_certificate_tagline'] ?? 'شهادة إتمام وتكريم',
'completion_certificate_message' => $settings['completion_certificate_message'] ?? '',
];
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$values['app_name'] = clean_text($_POST['app_name'] ?? '', 190);
$values['app_slogan'] = clean_text($_POST['app_slogan'] ?? '', 190);
$values['app_email'] = clean_text($_POST['app_email'] ?? '', 190);
$values['app_telephone'] = clean_text($_POST['app_telephone'] ?? '', 60);
$values['completion_certificate_template'] = clean_text($_POST['completion_certificate_template'] ?? 'modern', 40);
$values['completion_certificate_tagline'] = clean_text($_POST['completion_certificate_tagline'] ?? '', 255);
$values['completion_certificate_message'] = clean_text($_POST['completion_certificate_message'] ?? '', 1200);
if ($values['app_name'] === '') $errors['app_name'] = 'مطلوب';
if (!in_array($values['completion_certificate_template'], ['modern', 'classic'], true)) {
$values['completion_certificate_template'] = 'modern';
}
if ($values['completion_certificate_tagline'] === '') {
$values['completion_certificate_tagline'] = 'شهادة إتمام وتكريم';
}
$logoPath = $settings['app_logo'] ?? '';
$faviconPath = $settings['app_favicon'] ?? '';
// Handle Uploads
$uploadDir = __DIR__ . '/assets/images/uploads/';
if (!is_dir($uploadDir)) {
mkdir($uploadDir, 0755, true);
}
if (isset($_FILES['logo']) && $_FILES['logo']['error'] === UPLOAD_ERR_OK) {
$logoExt = strtolower(pathinfo($_FILES['logo']['name'], PATHINFO_EXTENSION));
if (in_array($logoExt, ['png', 'jpg', 'jpeg', 'svg', 'gif'])) {
$logoName = 'app_logo_' . time() . '.' . $logoExt;
if (move_uploaded_file($_FILES['logo']['tmp_name'], $uploadDir . $logoName)) {
$logoPath = 'assets/images/uploads/' . $logoName;
}
} else {
$errors['logo'] = 'صيغة غير مدعومة';
}
}
if (isset($_FILES['favicon']) && $_FILES['favicon']['error'] === UPLOAD_ERR_OK) {
$faviconExt = strtolower(pathinfo($_FILES['favicon']['name'], PATHINFO_EXTENSION));
if (in_array($faviconExt, ['png', 'ico', 'svg'])) {
$faviconName = 'app_favicon_' . time() . '.' . $faviconExt;
if (move_uploaded_file($_FILES['favicon']['tmp_name'], $uploadDir . $faviconName)) {
$faviconPath = 'assets/images/uploads/' . $faviconName;
}
} else {
$errors['favicon'] = 'صيغة غير مدعومة';
}
}
if (empty($errors)) {
try {
$stmt = db()->prepare('UPDATE app_settings SET app_name = ?, app_slogan = ?, app_email = ?, app_telephone = ?, app_logo = ?, app_favicon = ?, completion_certificate_template = ?, completion_certificate_tagline = ?, completion_certificate_message = ?, updated_at = NOW() WHERE id = 1');
$stmt->execute([
$values['app_name'],
$values['app_slogan'],
$values['app_email'],
$values['app_telephone'],
$logoPath,
$faviconPath,
$values['completion_certificate_template'],
$values['completion_certificate_tagline'],
$values['completion_certificate_message']
]);
set_flash('success', 'تم تحديث الإعدادات العامة بنجاح.');
header('Location: app_settings.php');
exit;
} catch (Throwable $e) {
$errors['form'] = 'تعذر الحفظ.';
}
}
}
render_page_start('إعدادات النظام', 'app_settings', 'إعدادات النظام العامة');
render_flash($flash);
?>
<section class="py-4 py-lg-5">
<div class="container-xxl">
<div class="admin-layout row g-4 align-items-start">
<div class="col-lg-3 layout-sidebar-column">
<?php require __DIR__ . '/includes/sidebar.php'; ?>
</div>
<div class="col-lg-9 layout-content-column">
<div class="page-banner mb-4">
<h1 class="page-title mb-2">الإعدادات العامة للنظام</h1>
<p class="page-copy mb-0">تعديل اسم النظام، الشعار (Logo)، الأيقونة (Favicon)، وبيانات التواصل.</p>
</div>
<div class="app-card form-card">
<?php if (!empty($errors['form'])): ?>
<div class="alert alert-danger mb-4"><?= e($errors['form']) ?></div>
<?php endif; ?>
<form method="post" enctype="multipart/form-data" novalidate>
<div class="row g-4">
<div class="col-md-6">
<label class="form-label">اسم النظام (المنصة)</label>
<input class="form-control <?= isset($errors['app_name']) ? 'is-invalid' : '' ?>" name="app_name" value="<?= e($values['app_name']) ?>">
<?php if (isset($errors['app_name'])): ?><div class="invalid-feedback"><?= e($errors['app_name']) ?></div><?php endif; ?>
</div>
<div class="col-md-6">
<label class="form-label">الشعار اللفظي (Slogan)</label>
<input class="form-control <?= isset($errors['app_slogan']) ? 'is-invalid' : '' ?>" name="app_slogan" value="<?= e($values['app_slogan']) ?>">
<?php if (isset($errors['app_slogan'])): ?><div class="invalid-feedback"><?= e($errors['app_slogan']) ?></div><?php endif; ?>
</div>
<div class="col-md-6">
<label class="form-label">البريد الإلكتروني العام</label>
<input type="email" class="form-control <?= isset($errors['app_email']) ? 'is-invalid' : '' ?>" name="app_email" value="<?= e($values['app_email']) ?>">
<?php if (isset($errors['app_email'])): ?><div class="invalid-feedback"><?= e($errors['app_email']) ?></div><?php endif; ?>
</div>
<div class="col-md-6">
<label class="form-label">رقم الهاتف العام</label>
<input class="form-control <?= isset($errors['app_telephone']) ? 'is-invalid' : '' ?>" name="app_telephone" value="<?= e($values['app_telephone']) ?>">
<?php if (isset($errors['app_telephone'])): ?><div class="invalid-feedback"><?= e($errors['app_telephone']) ?></div><?php endif; ?>
</div>
<div class="col-md-6">
<label class="form-label">الشعار (Logo)</label>
<?php if (!empty($settings['app_logo'])): ?>
<div class="mb-2"><img src="<?= e((string)$settings['app_logo']) ?>" alt="Logo" style="max-height: 80px; max-width: 100%; border-radius: 8px;"></div>
<?php endif; ?>
<input type="file" class="form-control <?= isset($errors['logo']) ? 'is-invalid' : '' ?>" name="logo" accept="image/*">
<?php if (isset($errors['logo'])): ?><div class="invalid-feedback"><?= e($errors['logo']) ?></div><?php endif; ?>
</div>
<div class="col-md-6">
<label class="form-label">الأيقونة (Favicon)</label>
<?php if (!empty($settings['app_favicon'])): ?>
<div class="mb-2"><img src="<?= e((string)$settings['app_favicon']) ?>" alt="Favicon" style="max-height: 40px; max-width: 100%; border-radius: 4px;"></div>
<?php endif; ?>
<input type="file" class="form-control <?= isset($errors['favicon']) ? 'is-invalid' : '' ?>" name="favicon" accept=".ico,.png,.svg">
<?php if (isset($errors['favicon'])): ?><div class="invalid-feedback"><?= e($errors['favicon']) ?></div><?php endif; ?>
</div>
<div class="col-12"><hr class="my-1"></div>
<div class="col-md-6">
<label class="form-label">قالب شهادة الإتمام</label>
<select class="form-select" name="completion_certificate_template">
<option value="modern" <?= $values['completion_certificate_template'] === 'modern' ? 'selected' : '' ?>>Modern / عصري</option>
<option value="classic" <?= $values['completion_certificate_template'] === 'classic' ? 'selected' : '' ?>>Classic / رسمي</option>
</select>
<div class="form-text">يغيّر شكل شهادة الإتمام والتكريم فقط، بدون التأثير على كشف الدرجات.</div>
</div>
<div class="col-md-6">
<label class="form-label">عنوان الشهادة</label>
<input class="form-control" name="completion_certificate_tagline" value="<?= e($values['completion_certificate_tagline']) ?>">
<div class="form-text">مثال: شهادة إتمام وتكريم أو شهادة تفوق.</div>
</div>
<div class="col-12">
<label class="form-label">نص شهادة الإتمام</label>
<textarea class="form-control" name="completion_certificate_message" rows="4"><?= e($values['completion_certificate_message']) ?></textarea>
<div class="form-text">يمكنك استخدام المتغيرات: {student} {center} {cycle} {performance} {honor} {percentage}</div>
</div>
</div>
<div class="form-actions mt-4">
<button class="btn btn-primary px-4" type="submit">حفظ التغييرات</button>
</div>
</form>
</div>
</div>
</div>
</div>
</section>
<?php render_page_end(); ?>