const MONTHS = ['январь', 'февраль', 'март', 'апрель', 'май', 'июнь', 'июль', 'август', 'сентябрь', 'октябрь', 'ноябрь', 'декабрь']; const UP_DIR = '/up'; const UP_DIR_PATH = __DIR__ . UP_DIR; const PAGE_ITEMS = 15; function generateResult($sort = SCANDIR_SORT_DESCENDING, $offset = 0) { $result = ['html' => '', 'galleryEnd' => false]; $galleryItems = loadGalleryItems($sort, $offset); if (!empty($galleryItems)) { foreach ($galleryItems as $key => $item) { $keyParts = explode('/', $key); list($year, $month) = explode('_', $keyParts[0]); $result['html'] .= << thumbnail_$key HTML; } } else { $result['galleryEnd'] = true; } return json_encode($result); } if (isset($_POST['sort'], $_POST['offset'])) { echo generateResult($_POST['sort'] === 'true' ? 1 : 0, (int)$_POST['offset']); } function loadGalleryItems($sort = SCANDIR_SORT_DESCENDING, $offset = 0) { $galleryItems = []; if ($dateDirs = scandir(UP_DIR_PATH)) { $dateDirs = sortDateDirs($dateDirs, $sort); foreach ($dateDirs as $dateDir) { if ($timeDirs = scandir(UP_DIR_PATH . '/' . $dateDir, $sort)) { $timeDirs = sortTimeDirs($timeDirs, $sort); foreach ($timeDirs as $timeDir) { $images[$timeDir] = []; $dirHandle = opendir(UP_DIR_PATH . '/' . $dateDir . '/' . $timeDir); while (false !== ($fileId = readdir($dirHandle))) { if (isNotDotDir($fileId)) { $src = UP_DIR_PATH . '/' . $dateDir . '/' . $timeDir; if (($thumb = thumbExists($src . '/t')) && file_exists($html = $src . '/index.html')) { $dirIdPath = UP_DIR . '/' . $dateDir . '/' . $timeDir . '/'; list($month, $year) = getDateMonthAndYear($dateDir); $galleryItems[$year . '_' . $month . '/' . $timeDir] = [ 'thumbnail' => $dirIdPath . basename($thumb), 'html' => $dirIdPath . basename($html), 'month' => $month, 'year' => $year, ]; } } } } } } } return array_slice($galleryItems, $offset * PAGE_ITEMS, PAGE_ITEMS); } function sortDateDirs(array $dateDirs, $sort) { $sortAsc = $sort === SCANDIR_SORT_ASCENDING; $dateDirs = array_filter($dateDirs, static function ($dir) { return isNotDotDir($dir); }); usort($dateDirs, static function ($one, $two) use ($sortAsc) { if ($one === $two) { return 0; } $one = normalizeDate($one); $two = normalizeDate($two); if ($sortAsc) { return ($one < $two) ? -1 : 1; } return ($one < $two) ? 1 : -1; }); return $dateDirs; } function sortTimeDirs(array $timeDirs, $sort) { $timeDirs = array_filter($timeDirs, static function ($dir) { return isNotDotDir($dir); }); if ($sort === SCANDIR_SORT_ASCENDING) { sort($timeDirs); } else { rsort($timeDirs); } return $timeDirs; } function isNotDotDir($dir) { return !in_array($dir, ['.', '..'], true); } function normalizeDate($date) { return substr($date, 4, 6) . substr($date, 2, 2) . substr($date, 0, 2); } function getDateMonthAndYear($date) { $month = substr($date, 2, 2); $year = substr($date, 4, 4); return [(int)$month, (int)$year]; } function getCurrentMonth() { return MONTHS[date('m') - 1]; } function thumbExists($imagePath) { $validExtension = ['png', 'jpg', 'jpeg', 'gif']; foreach ($validExtension as $ext) { if (file_exists($file = $imagePath . '.' . $ext)) { return $file; } } return false; }