Здравствуйте, товарищи. У меня как всегда интересная задача . Есть скрипт вывода постранично файлов из каталога. Очень он замечательный. Но, я не могу его должным образом прикрутить. Казалось бы все просто, но… Чем я только не пробовал©. Собственно скрипт: Код (Text): <?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); } } ?> Мне же изображения выводить не требуется, а требуется выводить значения двух тегов xml-документов. В связи с этим, я его немного изменил: Код (Text): <?php // количество изображений на странице define( 'PERPAGE', 5 ); $directory = $fileDir; $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 = $value; echo '<h1>' . $path . '</h1>'."\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("xml"); 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); } } ?> Но, он выводит только имена файлов из заданного каталога. То, что мне необходимо выводится вот таким образом: Код (Text): <?php $handle = opendir($fileDir); while (($file = readdir($handle)) !== FALSE) if (!is_dir($fileDir . $file) && eregi('^news.*\.xml$', $file)) $files[]=$file; rsort($files); for ($i=0; $i<10; $i+=1) { $news = simplexml_load_file($fileDir . $files[$i]); $id = htmlentities($news['id']); echo '<div class="anons">'; echo '<h1>' . $news->headline . '</h1><div id="description">' . $news->description . '</div>'; echo '<span class="more">[<a href="' . $id . '">' . $lang["MORE"] . '</a>]</span>'; echo '</div>'; } ?> хотя, вот это «for ($i=0; $i<10; $i+=1) {» теперь конечно не нужно. Помогите пожалуйста друзья объединить все это в рабочий скрипт. Я уже отчаялся прямо.
Офигеть. Что за любовь копипастить скрипты, даже не пытаясь разобраться, что там и зачем? Код (PHP): foreach( $filearray as $value) { $news = simplexml_load_file($fileDir . $value); // Если не сработает, надо посмотреть, что в $value - выведете его, а то мне не совсем понятно $id = htmlentities($news['id']); echo '<div class="anons">'; echo '<h1>' . $news->headline . '</h1><div id="description">' . $news->description . '</div>'; echo '<span class="more">[[url="' . $id . '"]' . $lang["MORE"] . '[/url]]</span>'; echo '</div>'; }
Спасибо большое, mkramer, все теперь работает . Я честно пытался разобраться, но как-то не выходит (. Будем учиться!
mkramer, если человек с программированием не знаком, то такой код для него - кусок из "Книги Перемен".
Linne, просто, прежде чем писать сайты, почитать https://php.net/manual/ru/langref.php. Синтаксис php не настолько сложен. Недели за 2 осилить можно.