<?php
// Start session
session_start();
// Include database configuration
require_once '../config/database.php';
// Check if user is logged in and has admin role
if (!isset($_SESSION['user_id']) || $_SESSION['role'] !== 'admin') {
header("Location: ../login.php");
exit();
}
// Handle form submissions
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// Create new question bank
if (isset($_POST['create_bank'])) {
$title = trim($_POST['title']);
$description = trim($_POST['description']);
$course_id = isset($_POST['course_id']) ? intval($_POST['course_id']) : null;
if (empty($title)) {
$error_message = "Question bank title is required";
} else {
// Check if bank with same title exists
$check_query = "SELECT id FROM question_banks WHERE title = ?";
$stmt = $conn->prepare($check_query);
$stmt->bind_param("s", $title);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows > 0) {
$error_message = "A question bank with this title already exists";
} else {
// Insert new question bank
$insert_query = "INSERT INTO question_banks (title, description, course_id, created_at) VALUES (?, ?, ?, NOW())";
$stmt = $conn->prepare($insert_query);
$stmt->bind_param("ssi", $title, $description, $course_id);
if ($stmt->execute()) {
$success_message = "Question bank created successfully";
} else {
$error_message = "Failed to create question bank: " . $conn->error;
}
}
}
}
// Delete question bank
if (isset($_POST['delete_bank'])) {
$bank_id = $_POST['bank_id'];
// Check if there are questions in this bank
$check_query = "SELECT COUNT(*) as count FROM questions WHERE question_bank_id = ?";
$stmt = $conn->prepare($check_query);
$stmt->bind_param("i", $bank_id);
$stmt->execute();
$count_result = $stmt->get_result()->fetch_assoc();
if ($count_result['count'] > 0) {
$error_message = "Cannot delete question bank that contains questions. Remove all questions first.";
} else {
// Delete the question bank
$delete_query = "DELETE FROM question_banks WHERE id = ?";
$stmt = $conn->prepare($delete_query);
$stmt->bind_param("i", $bank_id);
if ($stmt->execute()) {
$success_message = "Question bank deleted successfully";
} else {
$error_message = "Failed to delete question bank: " . $conn->error;
}
}
}
}
// Get course filter if it exists
$course_filter = isset($_GET['course_id']) ? intval($_GET['course_id']) : 0;
// Get list of all courses for dropdown
$courses_query = "SELECT id, title FROM courses ORDER BY title";
$courses_result = $conn->query($courses_query);
$courses = [];
if ($courses_result && $courses_result->num_rows > 0) {
while ($course = $courses_result->fetch_assoc()) {
$courses[] = $course;
}
}
// Get list of question banks with course filter
$banks_query = "SELECT qb.*,
c.title as course_title,
(SELECT COUNT(*) FROM questions WHERE question_bank_id = qb.id) as question_count
FROM question_banks qb
LEFT JOIN courses c ON qb.course_id = c.id
WHERE 1=1 ";
// Add course filter if selected
if ($course_filter > 0) {
$banks_query .= "AND qb.course_id = $course_filter ";
} else if ($course_filter === -1) {
$banks_query .= "AND qb.course_id IS NULL ";
}
$banks_query .= "ORDER BY qb.title";
$banks_result = $conn->query($banks_query);
$question_banks = [];
if ($banks_result && $banks_result->num_rows > 0) {
while ($bank = $banks_result->fetch_assoc()) {
$question_banks[] = $bank;
}
}
// Include header
include 'includes/header.php';
?>
<div class="container-fluid">
<div class="d-sm-flex align-items-center justify-content-between mb-4">
<h1 class="h3 mb-0 text-gray-800">Question Banks</h1>
<div>
<a href="manage_exams.php" class="d-none d-sm-inline-block btn btn-sm btn-info shadow-sm me-2">
<i class="fas fa-list fa-sm text-white-50"></i> Manage Exams
</a>
<button type="button" class="d-none d-sm-inline-block btn btn-sm btn-primary shadow-sm"
data-bs-toggle="modal" data-bs-target="#createBankModal">
<i class="fas fa-plus fa-sm text-white-50"></i> Create Question Bank
</button>
</div>
</div>
<!-- Check for database message first -->
<?php if (isset($_SESSION['success_message'])): ?>
<div class="alert alert-success alert-dismissible fade show" role="alert">
<?php echo $_SESSION['success_message']; unset($_SESSION['success_message']); ?>
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
<?php endif; ?>
<?php if (isset($_SESSION['error_message'])): ?>
<div class="alert alert-danger alert-dismissible fade show" role="alert">
<?php echo $_SESSION['error_message']; unset($_SESSION['error_message']); ?>
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
<?php endif; ?>
<!-- Normal form messages -->
<?php if (isset($success_message)): ?>
<div class="alert alert-success alert-dismissible fade show" role="alert">
<?php echo $success_message; ?>
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
<?php endif; ?>
<?php if (isset($error_message)): ?>
<div class="alert alert-danger alert-dismissible fade show" role="alert">
<?php echo $error_message; ?>
<button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
</div>
<?php endif; ?>
<!-- Course Filter -->
<div class="card shadow mb-4">
<div class="card-header py-3">
<h6 class="m-0 font-weight-bold text-primary">Filter Question Banks</h6>
</div>
<div class="card-body">
<form method="get" action="" class="row align-items-end">
<div class="col-md-4 mb-2">
<label for="course_id">Course:</label>
<select class="form-control" id="course_id" name="course_id">
<option value="0">All Courses</option>
<option value="-1" <?php echo $course_filter === -1 ? 'selected' : ''; ?>>General (No Course)</option>
<?php foreach ($courses as $course): ?>
<option value="<?php echo $course['id']; ?>" <?php echo $course_filter === $course['id'] ? 'selected' : ''; ?>>
<?php echo htmlspecialchars($course['title']); ?>
</option>
<?php endforeach; ?>
</select>
</div>
<div class="col-md-2 mb-2">
<button type="submit" class="btn btn-primary">Filter</button>
<?php if ($course_filter): ?>
<a href="banks.php" class="btn btn-secondary">Clear</a>
<?php endif; ?>
</div>
</form>
</div>
</div>
<!-- Question Banks Table -->
<div class="card shadow mb-4">
<div class="card-header py-3 d-flex justify-content-between align-items-center">
<h6 class="m-0 font-weight-bold text-primary">Question Banks</h6>
<a href="database/create_question_banks_table.php" class="btn btn-sm btn-info">
<i class="fas fa-database"></i> Setup Question Banks Table
</a>
</div>
<div class="card-body">
<?php if (empty($question_banks)): ?>
<div class="alert alert-info">
<?php if ($course_filter): ?>
No question banks found for this course. <a href="#" data-bs-toggle="modal" data-bs-target="#createBankModal">Create a new question bank</a> or <a href="banks.php">view all question banks</a>.
<?php else: ?>
No question banks found. <a href="#" data-bs-toggle="modal" data-bs-target="#createBankModal">Create your first question bank</a> to get started.
<?php endif; ?>
</div>
<?php else: ?>
<div class="table-responsive">
<table class="table table-bordered" id="bankTable" width="100%" cellspacing="0">
<thead>
<tr>
<th>Title</th>
<th>Description</th>
<th>Course</th>
<th>Questions</th>
<th>Created</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
<?php foreach ($question_banks as $bank): ?>
<tr>
<td><?php echo htmlspecialchars($bank['title']); ?></td>
<td><?php echo htmlspecialchars($bank['description'] ?? ''); ?></td>
<td>
<?php if ($bank['course_id']): ?>
<span class="badge bg-info"><?php echo htmlspecialchars($bank['course_title']); ?></span>
<?php else: ?>
<span class="badge bg-secondary">General</span>
<?php endif; ?>
</td>
<td>
<span class="badge bg-primary"><?php echo $bank['question_count']; ?></span>
</td>
<td><?php echo date('M d, Y', strtotime($bank['created_at'])); ?></td>
<td>
<a href="questions.php?bank_id=<?php echo $bank['id']; ?>"
class="btn btn-info btn-sm">
<i class="fas fa-question-circle"></i> Questions
</a>
<a href="add_question.php?bank_id=<?php echo $bank['id']; ?>"
class="btn btn-success btn-sm">
<i class="fas fa-plus-circle"></i> Add Question
</a>
<?php if ($bank['question_count'] == 0): ?>
<button type="button" class="btn btn-danger btn-sm"
onclick="confirmDeleteBank(<?php echo $bank['id']; ?>, '<?php echo htmlspecialchars($bank['title']); ?>')">
<i class="fas fa-trash"></i>
</button>
<?php endif; ?>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<?php endif; ?>
</div>
</div>
</div>
<!-- Create Question Bank Modal -->
<div class="modal fade" id="createBankModal" tabindex="-1" role="dialog" aria-labelledby="createBankModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="createBankModalLabel">Create Question Bank</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<form method="post" action="">
<div class="modal-body">
<div class="form-group mb-3">
<label for="title">Title <span class="text-danger">*</span></label>
<input type="text" class="form-control" id="title" name="title" required>
<small class="form-text text-muted">Give your question bank a descriptive name</small>
</div>
<div class="form-group mb-3">
<label for="description">Description</label>
<textarea class="form-control" id="description" name="description" rows="3"></textarea>
<small class="form-text text-muted">Optional description of the question bank</small>
</div>
<div class="form-group mb-3">
<label for="modal_course_id">Course</label>
<select class="form-control" id="modal_course_id" name="course_id">
<option value="">General (No Course)</option>
<?php foreach ($courses as $course): ?>
<option value="<?php echo $course['id']; ?>">
<?php echo htmlspecialchars($course['title']); ?>
</option>
<?php endforeach; ?>
</select>
<small class="form-text text-muted">Associate this question bank with a course (optional)</small>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancel</button>
<button type="submit" name="create_bank" class="btn btn-primary">Create</button>
</div>
</form>
</div>
</div>
</div>
<!-- Delete Confirmation Modal -->
<div class="modal fade" id="deleteBankModal" tabindex="-1" role="dialog" aria-labelledby="deleteBankModalLabel" aria-hidden="true">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="deleteBankModalLabel">Confirm Delete</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<p>Are you sure you want to delete the question bank: <span id="bankTitleToDelete"></span>?</p>
<p class="text-danger">This action cannot be undone.</p>
</div>
<div class="modal-footer">
<form method="post" action="">
<input type="hidden" id="bankIdToDelete" name="bank_id">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancel</button>
<button type="submit" name="delete_bank" class="btn btn-danger">Delete</button>
</form>
</div>
</div>
</div>
</div>
<script>
$(document).ready(function() {
// Initialize datatable
$('#bankTable').DataTable();
});
function confirmDeleteBank(bankId, bankTitle) {
$('#bankIdToDelete').val(bankId);
$('#bankTitleToDelete').text(bankTitle);
var deleteModal = new bootstrap.Modal(document.getElementById('deleteBankModal'));
deleteModal.show();
}
</script>
<?php
// Include footer
include 'includes/footer.php';
?>