- Подробности
-
Категория: PHP. Графика
Фотогалерея: просмотр файлов в каталоге с постраничной навигацией
8 Июль 2008, 10:40
Пусть у нас есть каталог (директория), содержащий файлы изображений и мы хотим создать удобный интерфейс для их просмотра. Было бы неудобно выводить все файлы изображений в каталоге — ведь их может быть очень много. Следовательно, необходимо сделать постраничный вывод: по 10 (20, 30) изображений на страницу, а внизу — ссылки на остальные страницы.
Для этого мы должны прочитать все содержимое каталога (исключив директории и файлы, не являющиеся картинками), записать в массив, отсортировать, а потом просто вывести не все содержимое массива, а только нужные элементы (например, с 0 до 9 или с 10 по 19).
<?php
// количество изображений на странице
define( 'PERPAGE', 10 );
$directory = 'small';
$dir = new DirectoryItems($directory);
// Отфильтровываем все файлы, которые не являются изображениями
$dir->filter();
// Сортируем картинки
$dir->indexOrder();
// Общее количество изображений в директории
$totalCount = $dir->getCount();
// Текущая страница
if ( isset( $_GET['page'] ) )
$page = $_GET['page'];
else
$page = 1;
$numPages = ceil($totalCount/PERPAGE);
if ( $page < 1 ) $page = 1;
if ( $page > $numPages ) $page = $numPages;
// Получаем часть массива
$filearray = $dir->getFileArraySlice( ($page-1)*PERPAGE, PERPAGE);
foreach( $filearray as $value) {
$path = $dir->getDirectoryName().'/'.$value;
echo '<img src="'.$path.'" alt="" />'."n";
}
// Создавать постраничную навигацию есть смысл, только если
// есть больше одной страницы
if($numPages > 1) {
// Создаем навигатор
$nav = new PageNavigator($totalCount, PERPAGE, $page);
echo $nav->getNavigator();
}
class DirectoryItems {
private $filearray = array();
private $directory;
public function __construct($directory) {
$this->directory = $directory;
if ( is_dir($directory) ) {
$d = opendir( $directory ) or die("Failed to open directory.");
while ( false !== ($f = readdir($d)) ) {
if( is_file($directory.'/'.$f) ) {
$this->filearray[] = $f;
}
}
closedir($d);
} else {
die("Must pass in a directory.");
}
}
public function __destruct(){
unset($this->filearray);
}
public function getDirectoryName(){
return $this->directory;
}
public function indexOrder(){
sort($this->filearray);
}
public function getCount() {
return count($this->filearray);
}
public function getFileArray() {
return $this->filearray;
}
public function getFileArraySlice($start, $numberitems) {
return array_slice($this->filearray, $start, $numberitems);
}
// исключить из массива все элементы с недопустимым расширением
public function filter(){
$extensions = array("jpg", "jpeg", "gif", "png");
foreach ($this->filearray as $key => $value) {
$ext = substr($value,(strpos($value, ".")+1));
$ext = strtolower($ext);
if(!in_array($ext, $extensions)){
unset($this->filearray[$key]);
}
}
}
}
class PageNavigator {
// общее число страниц, необходимых для вывода всего списка изображений
private $totalpages;
// число изображений на одной странице
private $recordsperpage;
// текущая страница
private $currentpage;
// текст для навигации
private $strfirst = 'Первая';
private $strlast = 'Последняя';
public function __construct($totalrecords, $recordsperpage = 10, $currentpage = 1){
$this->totalrecords = $totalrecords;
$this->recordsperpage = $recordsperpage;
$this->currentpage = $currentpage;
$this->setTotalPages($totalrecords, $recordsperpage);
}
// Возвращает HTML код навигатора
public function getNavigator(){
$strnavigator = '<div>'."n";
// Ссылка "Первая страница"
if($this->currentpage != 1) {
$strnavigator .= $this->createLink(1, $this->strfirst);
$strnavigator .= ' … ';
}
// Две страницы назад + текущая страница + две страницы вперед
for($i = $this->currentpage — 2; $i <= $this->currentpage + 2; $i++) {
if($i < 1 or $i > $this->totalpages) continue;
if($i == $this->currentpage) {
$strnavigator .= '<b>';
$strnavigator .= $i;
$strnavigator .= '</b>'."n";
} else {
$strnavigator .= $this->createLink($i, $i);
}
if ($i != $this->totalpages) $strnavigator .= ' ';
}
// Ссылка "Последняя страница"
if($this->currentpage != $this->totalpages){
$strnavigator .= ' … ';
$strnavigator .= $this->createLink($this->totalpages, $this->strlast);
}
$strnavigator .= '</div>'."n";
return $strnavigator;
}
private function createLink($offset, $strdisplay ){
$strtemp = '<a href="'.$_SERVER['PHP_SELF'].'?page='.$offset.'">'.$strdisplay.'</a>'."n";
return $strtemp;
}
// всего страниц
private function setTotalPages($totalrecords, $recordsperpage){
$this->totalpages = ceil($totalrecords/$recordsperpage);
}
}
?>