feat: complete photo gallery implementation with album management and lightbox viewer
- Added photo gallery carousel view (gallery.php) with all member albums - Implemented album detail view with responsive photo grid and lightbox - Created album creation/editing form with drag-and-drop photo uploads - Added backend processors for album CRUD operations and photo management - Implemented API endpoints for fetching and deleting photos - Added database migration for photo_albums and photos tables - Included comprehensive feature documentation with testing checklist - Updated .htaccess with URL rewrite rules for gallery routes - Added Gallery link to Members Area menu in header - Created upload directory structure (/assets/uploads/gallery/) - Implemented security: CSRF tokens, ownership verification, file validation - Added transaction safety with rollback on errors and cleanup - Features: Lightbox with keyboard navigation, drag-and-drop uploads, responsive design
This commit is contained in:
97
src/processors/delete_album.php
Normal file
97
src/processors/delete_album.php
Normal file
@@ -0,0 +1,97 @@
|
||||
<?php
|
||||
session_start();
|
||||
|
||||
if (!isset($_SESSION['user_id'])) {
|
||||
http_response_code(403);
|
||||
exit('Forbidden');
|
||||
}
|
||||
|
||||
$rootPath = dirname(dirname(dirname(__DIR__)));
|
||||
require_once($rootPath . '/connection.php');
|
||||
|
||||
$album_id = intval($_GET['id'] ?? 0);
|
||||
|
||||
if (!$album_id) {
|
||||
http_response_code(400);
|
||||
exit('Album ID is required');
|
||||
}
|
||||
|
||||
$conn = openDatabaseConnection();
|
||||
|
||||
// Verify ownership
|
||||
$albumCheck = $conn->prepare("SELECT user_id FROM photo_albums WHERE album_id = ?");
|
||||
$albumCheck->bind_param("i", $album_id);
|
||||
$albumCheck->execute();
|
||||
$albumResult = $albumCheck->get_result();
|
||||
|
||||
if ($albumResult->num_rows === 0) {
|
||||
$conn->close();
|
||||
http_response_code(404);
|
||||
header('Location: gallery');
|
||||
exit;
|
||||
}
|
||||
|
||||
$album = $albumResult->fetch_assoc();
|
||||
if ($album['user_id'] !== $_SESSION['user_id']) {
|
||||
$conn->close();
|
||||
http_response_code(403);
|
||||
header('Location: gallery');
|
||||
exit;
|
||||
}
|
||||
$albumCheck->close();
|
||||
|
||||
try {
|
||||
// Start transaction
|
||||
$conn->begin_transaction();
|
||||
|
||||
// Get all photos for this album
|
||||
$photoStmt = $conn->prepare("SELECT file_path FROM photos WHERE album_id = ?");
|
||||
$photoStmt->bind_param("i", $album_id);
|
||||
$photoStmt->execute();
|
||||
$photoResult = $photoStmt->get_result();
|
||||
|
||||
// Delete photo files
|
||||
while ($photo = $photoResult->fetch_assoc()) {
|
||||
$photoPath = $_SERVER['DOCUMENT_ROOT'] . $photo['file_path'];
|
||||
if (file_exists($photoPath)) {
|
||||
unlink($photoPath);
|
||||
}
|
||||
}
|
||||
$photoStmt->close();
|
||||
|
||||
// Delete photos from database (cascade should handle this)
|
||||
$deletePhotosStmt = $conn->prepare("DELETE FROM photos WHERE album_id = ?");
|
||||
$deletePhotosStmt->bind_param("i", $album_id);
|
||||
$deletePhotosStmt->execute();
|
||||
$deletePhotosStmt->close();
|
||||
|
||||
// Delete album from database
|
||||
$deleteAlbumStmt = $conn->prepare("DELETE FROM photo_albums WHERE album_id = ?");
|
||||
$deleteAlbumStmt->bind_param("i", $album_id);
|
||||
$deleteAlbumStmt->execute();
|
||||
$deleteAlbumStmt->close();
|
||||
|
||||
// Delete album directory
|
||||
$albumDir = $rootPath . '/assets/uploads/gallery/' . $album_id;
|
||||
if (is_dir($albumDir)) {
|
||||
rmdir($albumDir);
|
||||
}
|
||||
|
||||
// Commit transaction
|
||||
$conn->commit();
|
||||
$conn->close();
|
||||
|
||||
// Redirect to gallery
|
||||
header('Location: gallery');
|
||||
exit;
|
||||
|
||||
} catch (Exception $e) {
|
||||
// Rollback on error
|
||||
$conn->rollback();
|
||||
$conn->close();
|
||||
|
||||
http_response_code(400);
|
||||
echo 'Error deleting album: ' . htmlspecialchars($e->getMessage());
|
||||
exit;
|
||||
}
|
||||
?>
|
||||
Reference in New Issue
Block a user