За последние 24 часа нас посетили 52567 программистов и 1799 роботов. Сейчас ищут 895 программистов ...

Пагинация «flat file»

Тема в разделе "PHP для новичков", создана пользователем Linne, 13 сен 2014.

  1. Linne

    Linne Активный пользователь

    С нами с:
    19 июл 2014
    Сообщения:
    44
    Симпатии:
    0
    Здравствуйте, товарищи. У меня как всегда интересная задача :).

    Есть скрипт вывода постранично файлов из каталога. Очень он замечательный. Но, я не могу его должным образом прикрутить. Казалось бы все просто, но… Чем я только не пробовал©.
    Собственно скрипт:
    Код (Text):
    1. <?php
    2. // количество изображений на странице
    3. define( 'PERPAGE', 10 );
    4. $directory = 'small';
    5. $dir = new DirectoryItems($directory);
    6. // Отфильтровываем все файлы, которые не являются изображениями
    7. $dir->filter();
    8. // Сортируем картинки
    9. $dir->indexOrder();
    10. // Общее количество изображений в директории
    11. $totalCount = $dir->getCount();
    12. // Текущая страница
    13. if ( isset( $_GET['page'] ) )
    14.   $page = $_GET['page'];
    15. else
    16.   $page = 1;
    17. $numPages = ceil($totalCount/PERPAGE);
    18. if ( $page < 1 ) $page = 1;
    19. if ( $page > $numPages ) $page = $numPages;
    20. // Получаем часть массива
    21. $filearray = $dir->getFileArraySlice( ($page-1)*PERPAGE, PERPAGE);
    22.  
    23. foreach( $filearray as $value) {
    24.   $path = $dir->getDirectoryName().'/'.$value;
    25.   echo '<img src="'.$path.'" alt="" />'."\n";
    26. }
    27.  
    28. // Создавать постраничную навигацию есть смысл, только если
    29. // есть больше одной страницы
    30. if($numPages > 1) {
    31.   // Создаем навигатор
    32.   $nav = new PageNavigator($totalCount, PERPAGE, $page);
    33.   echo $nav->getNavigator();
    34. }
    35.  
    36. class DirectoryItems {
    37.   private $filearray = array();
    38.   private $directory;
    39.  
    40.   public function __construct($directory) {
    41.     $this->directory = $directory;
    42.     if ( is_dir($directory) ) {
    43.       $d = opendir( $directory ) or die("Failed to open directory.");
    44.       while ( false !== ($f = readdir($d)) ) {
    45.         if( is_file($directory.'/'.$f) ) {
    46.           $this->filearray[] = $f;
    47.         }
    48.       }
    49.       closedir($d);
    50.     } else {
    51.       die("Must pass in a directory.");
    52.     }
    53.   }
    54.  
    55.   public function __destruct(){
    56.     unset($this->filearray);
    57.   }
    58.  
    59.   public function getDirectoryName(){
    60.     return $this->directory;
    61.   }
    62.    
    63.   public function indexOrder(){
    64.     sort($this->filearray);
    65.   }
    66.  
    67.   public function getCount() {
    68.     return count($this->filearray);
    69.   }
    70.  
    71.   public function getFileArray() {
    72.     return $this->filearray;
    73.   }
    74.    
    75.   public function getFileArraySlice($start, $numberitems) {
    76.     return array_slice($this->filearray, $start, $numberitems);
    77.   }
    78.  
    79.   // исключить из массива все элементы с недопустимым расширением
    80.   public function filter(){
    81.     $extensions = array("jpg", "jpeg", "gif", "png");
    82.     foreach ($this->filearray as $key => $value) {
    83.       $ext = substr($value,(strpos($value, ".")+1));
    84.       $ext =  strtolower($ext);
    85.       if(!in_array($ext, $extensions)){
    86.         unset($this->filearray[$key]);
    87.       }
    88.     }
    89.   }  
    90. }
    91.  
    92. class PageNavigator {
    93.   // общее число страниц, необходимых для вывода всего списка изображений
    94.   private $totalpages;
    95.   // число изображений на одной странице
    96.   private $recordsperpage;
    97.   // текущая страница
    98.   private $currentpage;
    99.   // текст для навигации
    100.   private $strfirst = 'Первая';
    101.   private $strlast = 'Последняя';
    102.  
    103.   public function __construct($totalrecords, $recordsperpage = 10, $currentpage = 1){
    104.     $this->totalrecords = $totalrecords;
    105.     $this->recordsperpage = $recordsperpage;
    106.     $this->currentpage = $currentpage;  
    107.     $this->setTotalPages($totalrecords, $recordsperpage);
    108.   }
    109.   // Возвращает HTML код навигатора
    110.   public function getNavigator(){
    111.     $strnavigator = '<div>'."\n";
    112.     // Ссылка "Первая страница"  
    113.     if($this->currentpage != 1) {
    114.       $strnavigator .= $this->createLink(1, $this->strfirst);
    115.       $strnavigator .= ' ... ';
    116.     }
    117.     // Две страницы назад + текущая страница + две страницы вперед
    118.     for($i = $this->currentpage - 2; $i <= $this->currentpage + 2; $i++) {
    119.       if($i < 1 or $i > $this->totalpages) continue;
    120.       if($i == $this->currentpage) {
    121.         $strnavigator .= '<b>';
    122.         $strnavigator .= $i;
    123.         $strnavigator .= '</b>'."\n";
    124.       } else {
    125.         $strnavigator .= $this->createLink($i, $i);
    126.       }
    127.       if ($i != $this->totalpages) $strnavigator .= ' | ';
    128.     }
    129.     // Ссылка "Последняя страница"  
    130.     if($this->currentpage != $this->totalpages){
    131.       $strnavigator .= ' ... ';
    132.       $strnavigator .= $this->createLink($this->totalpages, $this->strlast);
    133.     }
    134.     $strnavigator .= '</div>'."\n";
    135.     return $strnavigator;
    136.   }
    137.  
    138.   private function createLink($offset, $strdisplay ){
    139.     $strtemp = '<a href="'.$_SERVER['PHP_SELF'].'?page='.$offset.'">'.$strdisplay.'</a>'."\n";
    140.     return $strtemp;
    141.   }
    142.   // всего страниц
    143.   private function setTotalPages($totalrecords, $recordsperpage){
    144.     $this->totalpages = ceil($totalrecords/$recordsperpage);
    145.   }
    146. }
    147. ?>
    Мне же изображения выводить не требуется, а требуется выводить значения двух тегов xml-документов. В связи с этим, я его немного изменил:
    Код (Text):
    1. <?php
    2. // количество изображений на странице
    3. define( 'PERPAGE', 5 );
    4. $directory = $fileDir;
    5. $dir = new DirectoryItems($directory);
    6. // Отфильтровываем все файлы, которые не являются изображениями
    7. $dir->filter();
    8. // Сортируем картинки
    9. $dir->indexOrder();
    10. // Общее количество изображений в директории
    11. $totalCount = $dir->getCount();
    12. // Текущая страница
    13. if ( isset( $_GET['page'] ) )
    14.   $page = $_GET['page'];
    15. else
    16.   $page = 1;
    17. $numPages = ceil($totalCount/PERPAGE);
    18. if ( $page < 1 ) $page = 1;
    19. if ( $page > $numPages ) $page = $numPages;
    20. // Получаем часть массива
    21. $filearray = $dir->getFileArraySlice( ($page-1)*PERPAGE, PERPAGE);
    22.  
    23. foreach( $filearray as $value) {
    24.   $path = $value;
    25.   echo '<h1>' . $path . '</h1>'."\n";
    26. }
    27.  
    28. // Создавать постраничную навигацию есть смысл, только если
    29. // есть больше одной страницы
    30. if($numPages > 1) {
    31.   // Создаем навигатор
    32.   $nav = new PageNavigator($totalCount, PERPAGE, $page);
    33.   echo $nav->getNavigator();
    34. }
    35.  
    36. class DirectoryItems {
    37.   private $filearray = array();
    38.   private $directory;
    39.  
    40.   public function __construct($directory) {
    41.     $this->directory = $directory;
    42.     if ( is_dir($directory) ) {
    43.       $d = opendir( $directory ) or die("Failed to open directory.");
    44.       while ( false !== ($f = readdir($d)) ) {
    45.         if( is_file($directory.'/'.$f) ) {
    46.           $this->filearray[] = $f;
    47.         }
    48.       }
    49.       closedir($d);
    50.     } else {
    51.       die("Must pass in a directory.");
    52.     }
    53.   }
    54.  
    55.   public function __destruct(){
    56.     unset($this->filearray);
    57.   }
    58.  
    59.   public function getDirectoryName(){
    60.     return $this->directory;
    61.   }
    62.    
    63.   public function indexOrder(){
    64.     sort($this->filearray);
    65.   }
    66.  
    67.   public function getCount() {
    68.     return count($this->filearray);
    69.   }
    70.  
    71.   public function getFileArray() {
    72.     return $this->filearray;
    73.   }
    74.    
    75.   public function getFileArraySlice($start, $numberitems) {
    76.     return array_slice($this->filearray, $start, $numberitems);
    77.   }
    78.  
    79.   // исключить из массива все элементы с недопустимым расширением
    80.   public function filter(){
    81.     $extensions = array("xml");
    82.     foreach ($this->filearray as $key => $value) {
    83.       $ext = substr($value,(strpos($value, ".")+1));
    84.       $ext =  strtolower($ext);
    85.       if(!in_array($ext, $extensions)){
    86.         unset($this->filearray[$key]);
    87.       }
    88.     }
    89.   }  
    90. }
    91.  
    92. class PageNavigator {
    93.   // общее число страниц, необходимых для вывода всего списка изображений
    94.   private $totalpages;
    95.   // число изображений на одной странице
    96.   private $recordsperpage;
    97.   // текущая страница
    98.   private $currentpage;
    99.   // текст для навигации
    100.   private $strfirst = 'Первая';
    101.   private $strlast = 'Последняя';
    102.  
    103.   public function __construct($totalrecords, $recordsperpage = 10, $currentpage = 1){
    104.     $this->totalrecords = $totalrecords;
    105.     $this->recordsperpage = $recordsperpage;
    106.     $this->currentpage = $currentpage;  
    107.     $this->setTotalPages($totalrecords, $recordsperpage);
    108.   }
    109.   // Возвращает HTML код навигатора
    110.   public function getNavigator(){
    111.     $strnavigator = '<div>'."\n";
    112.     // Ссылка "Первая страница"  
    113.     if($this->currentpage != 1) {
    114.       $strnavigator .= $this->createLink(1, $this->strfirst);
    115.       $strnavigator .= ' ... ';
    116.     }
    117.     // Две страницы назад + текущая страница + две страницы вперед
    118.     for($i = $this->currentpage - 2; $i <= $this->currentpage + 2; $i++) {
    119.       if($i < 1 or $i > $this->totalpages) continue;
    120.       if($i == $this->currentpage) {
    121.         $strnavigator .= '<b>';
    122.         $strnavigator .= $i;
    123.         $strnavigator .= '</b>'."\n";
    124.       } else {
    125.         $strnavigator .= $this->createLink($i, $i);
    126.       }
    127.       if ($i != $this->totalpages) $strnavigator .= ' | ';
    128.     }
    129.     // Ссылка "Последняя страница"  
    130.     if($this->currentpage != $this->totalpages){
    131.       $strnavigator .= ' ... ';
    132.       $strnavigator .= $this->createLink($this->totalpages, $this->strlast);
    133.     }
    134.     $strnavigator .= '</div>'."\n";
    135.     return $strnavigator;
    136.   }
    137.  
    138.   private function createLink($offset, $strdisplay ){
    139.     $strtemp = '<a href="'.$_SERVER['PHP_SELF'].'?page='.$offset.'">'.$strdisplay.'</a>'."\n";
    140.     return $strtemp;
    141.   }
    142.   // всего страниц
    143.   private function setTotalPages($totalrecords, $recordsperpage){
    144.     $this->totalpages = ceil($totalrecords/$recordsperpage);
    145.   }
    146. }
    147. ?>
    Но, он выводит только имена файлов из заданного каталога. То, что мне необходимо выводится вот таким образом:
    Код (Text):
    1. <?php
    2. $handle = opendir($fileDir);
    3. while (($file = readdir($handle)) !== FALSE)
    4.     if (!is_dir($fileDir . $file) && eregi('^news.*\.xml$', $file))
    5.     $files[]=$file;
    6.     rsort($files);
    7.     for ($i=0; $i<10; $i+=1) {
    8.         $news = simplexml_load_file($fileDir . $files[$i]);
    9.         $id = htmlentities($news['id']);
    10.         echo '<div class="anons">';
    11.         echo '<h1>' . $news->headline . '</h1><div id="description">' . $news->description . '</div>';
    12.         echo '<span class="more">&#91;<a href="' . $id . '">' . $lang["MORE"] . '</a>&#93;</span>';
    13.         echo '</div>';
    14.            
    15.     }
    16. ?>
    хотя, вот это «for ($i=0; $i<10; $i+=1) {» теперь конечно не нужно.
    Помогите пожалуйста друзья объединить все это в рабочий скрипт. Я уже отчаялся прямо.
     
  2. Linne

    Linne Активный пользователь

    С нами с:
    19 июл 2014
    Сообщения:
    44
    Симпатии:
    0
    Не уж то никто не поможет? Товарищи! Очень необходимо.
     
  3. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Офигеть. Что за любовь копипастить скрипты, даже не пытаясь разобраться, что там и зачем?
    Код (PHP):
    1. foreach( $filearray as $value) {
    2.   $news = simplexml_load_file($fileDir . $value); // Если не сработает, надо посмотреть, что в $value - выведете его, а то мне не совсем понятно
    3.       $id = htmlentities($news['id']);
    4.       echo '<div class="anons">';
    5.       echo '<h1>' . $news->headline . '</h1><div id="description">' . $news->description . '</div>';
    6.       echo '<span class="more">[[url="' . $id . '"]' . $lang["MORE"] . '[/url]]</span>';
    7.       echo '</div>';
    8. }
    9.  
     
  4. Linne

    Linne Активный пользователь

    С нами с:
    19 июл 2014
    Сообщения:
    44
    Симпатии:
    0
    Спасибо большое, mkramer, все теперь работает :).

    Я честно пытался разобраться, но как-то не выходит (. Будем учиться!
     
  5. dcc0

    dcc0 Активный пользователь

    С нами с:
    27 июн 2014
    Сообщения:
    217
    Симпатии:
    4
    mkramer, если человек с программированием не знаком, то такой код для него - кусок из "Книги Перемен".
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.600
    Симпатии:
    1.764
    Linne, просто, прежде чем писать сайты, почитать https://php.net/manual/ru/langref.php. Синтаксис php не настолько сложен. Недели за 2 осилить можно.