Sindbad~EG File Manager
<?php
require_once '../config/config.php';
require_once '../classes/Location.php';
require_login();
$database = new Database();
$conn = $database->getConnection();
$news = new News($conn);
$category = new Category($conn);
$location = new Location($conn);
$error = '';
$success = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
error_log('POST request received for news creation');
$title = sanitize_input($_POST['title'] ?? '');
$location_id = $_POST['location'] ?? '';
$description = sanitize_input($_POST['description'] ?? '');
$content = $_POST['content'] ?? '';
$written_by = sanitize_input($_POST['written_by'] ?? '');
$category_id = $_POST['category_id'] ?? null;
$status = $_POST['status'] ?? 'draft';
error_log('Form data: ' . json_encode([
'title' => $title,
'location_id' => $location_id,
'content_length' => strlen($content),
'written_by' => $written_by
]));
if (empty($title) || empty($location_id) || empty($content) || empty($written_by)) {
$error = 'Please fill in all required fields';
error_log('Validation failed: missing required fields');
} else {
try {
$news_data = [
'title' => $title,
'location_id' => $location_id,
'description' => $description,
'content' => $content,
'written_by' => $written_by,
'category_id' => $category_id ?: null,
'user_id' => $_SESSION['user_id'],
'status' => $status
];
error_log('Attempting to create news with data: ' . json_encode($news_data));
$news_id = $news->create($news_data);
if ($news_id) {
error_log('News created successfully with ID: ' . $news_id);
flash_message('News article created successfully!', 'success');
header('Location: view.php?id=' . $news_id);
exit();
} else {
$error = 'Failed to create news article. Please try again.';
error_log('News creation failed - no ID returned');
}
} catch (Exception $e) {
$error = 'Database error: ' . $e->getMessage();
error_log('News creation exception: ' . $e->getMessage());
}
}
}
$categories = $category->getAll();
$locations = $location->getAll();
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Create News Article - COP News Portal</title>
<link rel="stylesheet" href="../assets/css/style.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
<script src="https://cdn.tiny.cloud/1/<?php echo get_setting('tinymce_api_key', 'no-api-key'); ?>/tinymce/6/tinymce.min.js" referrerpolicy="origin"></script>
</head>
<body>
<header class="header">
<nav class="navbar">
<a href="../dashboard.php" class="logo">
<i class="fas fa-church"></i>
COP News Portal
</a>
<ul class="nav-links">
<li><a href="../dashboard.php"><i class="fas fa-tachometer-alt"></i> Dashboard</a></li>
<li><a href="index.php"><i class="fas fa-newspaper"></i> News</a></li>
<li><a href="create.php" class="active"><i class="fas fa-plus"></i> Add News</a></li>
<?php if ($_SESSION['account_type'] === 'admin' || $_SESSION['account_type'] === 'superuser'): ?>
<li><a href="../admin/"><i class="fas fa-cog"></i> Admin</a></li>
<?php endif; ?>
<li><a href="../profile.php"><i class="fas fa-user"></i> Profile</a></li>
<li><a href="../logout.php"><i class="fas fa-sign-out-alt"></i> Logout</a></li>
</ul>
</nav>
</header>
<main class="container" style="margin-top: 2rem;">
<div class="card">
<div class="card-header">
<h1><i class="fas fa-plus"></i> Create News Article</h1>
</div>
<div class="card-body">
<?php if ($error): ?>
<div class="alert alert-error">
<i class="fas fa-exclamation-circle"></i> <?php echo $error; ?>
</div>
<?php endif; ?>
<form method="POST" action="">
<div class="grid grid-2">
<div class="form-group">
<label for="title" class="form-label">News Title *</label>
<input type="text" id="title" name="title" class="form-control"
value="<?php echo htmlspecialchars($_POST['title'] ?? ''); ?>"
placeholder="Enter news title..." required>
</div>
<div class="form-group">
<label for="location" class="form-label">Location *</label>
<select id="location" name="location" class="form-control form-select" required>
<option value="">Select Location</option>
<?php foreach ($locations as $loc): ?>
<option value="<?php echo $loc['id']; ?>"
<?php echo ($_POST['location'] ?? '') == $loc['id'] ? 'selected' : ''; ?>>
<?php echo htmlspecialchars($loc['name'] . ' (' . ucfirst($loc['type']) . ')'); ?>
</option>
<?php endforeach; ?>
</select>
</div>
<div class="form-group">
<label for="written_by" class="form-label">Written By *</label>
<input type="text" id="written_by" name="written_by" class="form-control"
value="<?php echo htmlspecialchars($_POST['written_by'] ?? $_SESSION['user_name']); ?>"
placeholder="Author name" required>
</div>
<div class="form-group">
<label for="category_id" class="form-label">Category</label>
<select id="category_id" name="category_id" class="form-control form-select">
<option value="">Select Category</option>
<?php foreach ($categories as $cat): ?>
<option value="<?php echo $cat['id']; ?>"
<?php echo ($_POST['category_id'] ?? '') == $cat['id'] ? 'selected' : ''; ?>>
<?php echo htmlspecialchars($cat['name']); ?>
</option>
<?php endforeach; ?>
</select>
</div>
</div>
<div class="form-group">
<label for="description" class="form-label">Description</label>
<textarea id="description" name="description" class="form-control" rows="3"
placeholder="Brief description of the news article..."><?php echo htmlspecialchars($_POST['description'] ?? ''); ?></textarea>
</div>
<div class="form-group">
<label for="content">Content *</label>
<textarea id="content" name="content" class="form-control" rows="10"><?php echo htmlspecialchars($_POST['content'] ?? ''); ?></textarea>
</div>
<div class="form-group">
<label for="status" class="form-label">Status</label>
<select id="status" name="status" class="form-control form-select">
<option value="draft" <?php echo ($_POST['status'] ?? 'draft') === 'draft' ? 'selected' : ''; ?>>Draft</option>
<option value="published" <?php echo ($_POST['status'] ?? '') === 'published' ? 'selected' : ''; ?>>Published</option>
</select>
<small style="color: var(--primary-grey);">
Draft articles are only visible to you. Published articles are visible to all users.
</small>
</div>
<div class="flex gap-2 mt-4">
<button type="submit" class="btn btn-primary">
<i class="fas fa-save"></i> Create Article
</button>
<a href="index.php" class="btn btn-secondary">
<i class="fas fa-times"></i> Cancel
</a>
</div>
</form>
</div>
</div>
</main>
<script>
// Initialize TinyMCE for rich text editing
tinymce.init({
selector: '#content',
height: 400,
menubar: false,
plugins: [
'advlist', 'autolink', 'lists', 'link', 'image', 'charmap', 'preview',
'anchor', 'searchreplace', 'visualblocks', 'code', 'fullscreen',
'insertdatetime', 'media', 'table', 'help', 'wordcount'
],
toolbar: 'undo redo | blocks | ' +
'bold italic forecolor | alignleft aligncenter ' +
'alignright alignjustify | bullist numlist outdent indent | ' +
'removeformat | help',
content_style: 'body { font-family: Inter, sans-serif; font-size: 14px }',
branding: false,
setup: function (editor) {
editor.on('init', function () {
console.log('TinyMCE initialized successfully');
});
}
});
// Form validation with TinyMCE content check
document.querySelector('form').addEventListener('submit', function(e) {
console.log('Form submission started');
const title = document.getElementById('title').value.trim();
const location = document.getElementById('location').value.trim();
const writtenBy = document.getElementById('written_by').value.trim();
console.log('Form values:', { title, location, writtenBy });
if (!title || !location || !writtenBy) {
e.preventDefault();
alert('Please fill in all required fields: Title, Location, and Written By.');
return false;
}
// Check TinyMCE content
let content = '';
try {
const editor = tinymce.get('content');
if (editor) {
content = editor.getContent().trim();
editor.save(); // Sync content to textarea
console.log('TinyMCE content synced');
} else {
content = document.getElementById('content').value.trim();
}
} catch (error) {
console.log('TinyMCE sync error:', error);
content = document.getElementById('content').value.trim();
}
if (!content) {
e.preventDefault();
alert('Please enter the article content.');
return false;
}
console.log('Form validation passed, submitting...');
return true;
});
</script>
<style>
.active {
color: var(--primary-blue) !important;
font-weight: 600;
}
</style>
</body>
</html>
Sindbad File Manager Version 1.0, Coded By Sindbad EG ~ The Terrorists