<?php ob_start(); // Start reading html define("urlParam", "path"); define("photoRoot", "photos_folders/photos"); /** * Get active path from url and prevent from seeing folders before 'photos/' * @return string current path */ function getActivePath() { $dir = ''; if (isset($_GET[urlParam])) $dir = $_GET[urlParam]; $folders = explode(DIRECTORY_SEPARATOR, $dir); $currentPath = ""; foreach ($folders as $value) { if ($value != ".." && $value != "." && $value != "") { $currentPath .= DIRECTORY_SEPARATOR . $value; } } return $currentPath; } /** * Get active folder from the active path * @param string $path path representing the active folder * @return string active folder name */ function GetActiveFolder($path) { $dir = explode(DIRECTORY_SEPARATOR, $path); return $dir[sizeof($dir) - 1]; // Last item after / } /** * Check whether the current album is available for download as a .zip file * @param string $path path to search the album in * @return bool True if an album is available, false otherwise */ function isAlbumAvailable($path) { $dir = photoRoot . $path; $files = scandir($dir); $valid = false; foreach ($files as $key => $value) { $path = realpath($dir . DIRECTORY_SEPARATOR . $value); if (!is_dir($path)) { $valid = pathinfo($path, PATHINFO_EXTENSION) == "zip"; if ($valid) break; } } return $valid; } /** * Get all directories in the specified path and creates them on the page * @param string $path path to search directories in */ function createDirectories($path) { $path = photoRoot . $path; $displayedItems = 0; $folders = getDirectories($path); foreach ($folders as $key => $value) { $folderTitle = $value; $photos = getTotalPhotoCount($path . DIRECTORY_SEPARATOR . $value); $albums = getTotalAlbumCount($path . DIRECTORY_SEPARATOR . $value); $folderLink = "?" . urlParam . "=" . getActivePath() . DIRECTORY_SEPARATOR . $value; include("includes/photos/folder_template.php"); $displayedItems++; } } /** * Get all photos in the specified path and creates them on the page * @param string $path path to search photos in */ function createPhotos($path) { $path = photoRoot . "_thumb" . $path; $files = scandir($path); $displayedItems = 0; foreach ($files as $key => $value) { $realPath = realpath($path . DIRECTORY_SEPARATOR . $value); if (isValidImage($realPath)) { $imageSrc = $path . DIRECTORY_SEPARATOR . $value; $imageId = "photo-" . $displayedItems; include("includes/photos/photo_template.php"); $displayedItems++; } } } /** * get folders in the given path * @param string $path path to search folders in * @return array array of folders */ function getDirectories($path) { $files = scandir($path); $folders = []; foreach ($files as $key => $value) { $realPath = realpath($path . DIRECTORY_SEPARATOR . $value); if (isValidDirectory($realPath, $value)) { array_push($folders, $value); } } return $folders; } /** * Counts directories in the specified folder * @param string $path path to search directories in * @return int directories count */ function getDirectoriesCount($path) { $files = scandir($path); $dirCount = 0; foreach ($files as $key => $value) { $realPath = realpath($path . DIRECTORY_SEPARATOR . $value); if (isValidDirectory($realPath, $value)) { $dirCount++; } } return $dirCount; } /** * Counts images in the specified folder * @param string $path path to search photos in * @return int photo count */ function getPhotoCount($path) { $files = scandir($path); $fileCount = 0; foreach ($files as $key => $value) { $realPath = realpath($path . DIRECTORY_SEPARATOR . $value); if (isValidImage($realPath)) { $fileCount++; } } return $fileCount; } /** * Get the count of all directories, recursively from the path specified * @param string $path root for search * @return int total number of directories */ function getTotalAlbumCount($path) { $folders = getDirectories($path); $total = sizeof($folders); foreach ($folders as $key => $value) { $total += getTotalAlbumCount($path . DIRECTORY_SEPARATOR . $value); } return $total; } function getTotalPhotoCount($path) { $folders = getDirectories($path); $total = getPhotoCount($path); foreach ($folders as $key => $value) { $total += getTotalPhotoCount($path . DIRECTORY_SEPARATOR . $value); } return $total; } /** * Check if the given image is valid * @param string $imagePath absolute path of the image * @return bool True if the file is a jpg, jpeg or png, false otherwise */ function isValidImage($imagePath) { $ext = pathinfo($imagePath, PATHINFO_EXTENSION); return !is_dir($imagePath) && ($ext == "jpg" || $ext == "JPG" || $ext == "jpeg" || $ext == "JPEG" || $ext == "png" || $ext == "PNG"); } /** * Check if the given folder is valid (is not '.' or '..') * @param string $directoryPath directory path * @param string $directory directory name * @return bool True if the directory is valid, false otherwise */ function isValidDirectory($directoryPath, $directory) { return is_dir($directoryPath) && $directory != "." && $directory != ".." && substr($directory, 0, 1) !== "."; } /** * Creates buttons representing the actual path for easier navigation * @param string $path Actual Path */ function generatePath($path) { $folders = explode(DIRECTORY_SEPARATOR, $path); $currentPath = ""; $pathTitle = "Menu"; $pathLink = "?" . urlParam . "="; include("includes/photos/path_template.php"); foreach ($folders as $value) { if ($value != "") { $pathTitle = $value; $currentPath .= DIRECTORY_SEPARATOR . $value; $pathLink = "?" . urlParam . "=" . $currentPath; include("includes/photos/path_template.php"); } } } ?> <div class="inner"> <div id="photoOverlay" style="display:none"> <img src="" id="imgBig"> <div id="closeBack" onclick="closeBig()"></div> <div id="loadingIconContainer" onclick="closeBig()"> <i class="fas fa-spinner fa-spin"></i> </div> <div id="photoButtonsContainer"> <div id="rightButton" onclick="displayNext(1)"> <i class="fas fa-arrow-right"></i> </div> <div id="leftButton" onclick="displayNext(-1)"> <i class="fas fa-arrow-left"></i> </div> <a id="downloadButton" download="" href=""> <i class="fas fa-download"></i> </a> <div id="closeButton"> <i class="fas fa-times" onclick="closeBig()"></i> </div> </div> </div> <h1 id="photosTitle">Photos</h1> <p>Clique sur le dossier de ton choix pour afficher les photos. Il faut que tu sois inscrit à l'INSA pour pouvoir les regarder (et oui, pas de spoiler). </p> <p> Si tu ne peux pas voir les photos (la fenêtre pour entrer le mot de passe ne s'affiche pas), ouvre cette page avec un autre navigateur. </p> <ul class="photos-path"> <li><p>Chemin : </p></li> <?php generatePath(getActivePath()); ?> </ul> </div> <div id="photoContainer"> <?php if (getDirectoriesCount(photoRoot . getActivePath()) > 0): ?> <div class="photos-folder-container"> <?php createDirectories(getActivePath()); ?> </div> <?php endif; ?> <?php if (isAlbumAvailable(getActivePath())): ?> <a download="" href="photos_folders/photos<?php echo getActivePath() . DIRECTORY_SEPARATOR . GetActiveFolder(getActivePath()) ?>.zip" id="downloadAlbum"> <span id="downloadText"><i class="fas fa-download"></i>Télécharger</span> <span id="albumPhotoCount"><?php echo getPhotoCount(photoRoot . getActivePath()) ?> photos</span> </a> <?php endif; ?> <?php if (getPhotoCount(photoRoot . getActivePath()) > 0): ?> <div class="photos"> <?php createPhotos(getActivePath()); ?> </div> <?php endif; ?> </div> <br> <link rel="stylesheet" type="text/css" media="screen" href="assets/css/photos.css"> <?php $pageContent = ob_get_clean(); // Store html content in variable $pageTitle = "Photos"; $pageScripts = "<script src=\"assets/js/photos.js\"></script><script type=\"text/javascript\" src=\"assets/js/jquery.mousewheel.min.js\"></script>"; include("includes/template.php"); // Display template with variable content ?>