Участник
Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013
Помог: 91 раз(а)
|
[ Этот класс устарел, новый здесь:
http://forum.php.su/topic.php?fo...ostid=1415290936 ]
Привет. Думаю тема достаточно актуальная и хорошо всегда иметь под рукой пагинатор, что бы не приходилось писать его каждый раз. Накатал класс, кому нужно - пользуйтесь. Кому не нравится класс - просьба писать что именно не нравится, адекватные и полезные замечания будут учтены и возможно реализованы.
Код класса. Отформатирован хреново ввиду того, что не вмещается нормально в блок. В файле с кодом, который я приложил к теме, таких проблем нет.
Спойлер (Отобразить)
PHP:
скопировать код в буфер обмена
final class Pagination{ private $_dbh, $_page, $_onePage, $_table, $_fields, $_count, $_start, $_mode, $_filter, $_queryParams; const STANDART_MODE = 'standart'; const FILTER_MODE = 'filter'; public function __construct ($onePage, $param, $table, array $fields, $mode = self::STANDART_MODE, $filter = null, array $queryParams = array()){ $this->_dbh = new PDO('mysql:host=localhost;dbname=test', 'root', ''); $this->_onePage = $onePage; $this->_page = $param; $this->_table = $table; $this->_fields = implode(', ' ,$fields); $this->_filter = $filter; $this->_mode = $mode; $this->_queryParams = $queryParams; } private function calculateParams(){ $stmt = $this->_dbh->prepare("SELECT COUNT(*) FROM ".$this->_table); $stmt->execute(); $counter = $stmt->fetchColumn(); $count = $counter / $this->_onePage; $this->_count = ceil($count); $this->_start = $this->_page * $this->_onePage - $this->_onePage; } private function setQuery(){ $query = ''; switch($this->_mode){ case 'standart': $query = "SELECT ".$this->_fields." FROM ".$this->_table." LIMIT ".$this->_start.', '.$this->_onePage; break; case 'filter': $query = "SELECT ".$this->_fields." FROM ".$this->_table . " ".$this->_filter." LIMIT ".$this->_start.", ".$this->_onePage; break; default: throw new InvalidArgumentException('Mode is not allowed'); } return $query; } public function getPageContent(){ $this->calculateParams(); $stmt = $this->_dbh->prepare($this->setQuery()); if(count($this->_queryParams ) == 0 ){ $stmt->execute(); }else{ $stmt->execute($this->_queryParams); } $row = $stmt->fetchAll(PDO::FETCH_ASSOC); return count($row) != 0 ? $row : false; } public function showPages($url){ if($this->_page != 1) $firstpage = "<a href=\"$url". 1 . "\">В начало</a>"; if($this->_page != $this->_count) $lastpage = "<a href=\"$url$this->_count\"> В конец</a>"; if($this->_page - 1 > 0) $prevpage = " <a href=\"$url". ($this->_page - 1) .'">'. ($this->_page - 1) .'</a> | '; if($this->_page + 1 <= $this->_count) $nextpage = ' | '."<a href=\"$url". ($this->_page + 1) .'">'. ($this->_page + 1) .'</a>'; return $firstpage.$prevpage.'<b>'.$this->_page.'</b>'.$nextpage.$lastpage; } public function __destruct(){ } }
Данный класс может работать в двух режимах, в стандартном и в режиме с фильтром. Отличие режимов будет описано ниже.
Пример использования в стандартном режиме. Инициализация параметров.
Значение параметров
1. Количество записей, выводимых на одну страницу.
2. $_GET параметр, по которому осуществляется выборка(номер страницы).
3. Таблица, из которой нужно забрать записи
4. Массив, в который нужно передать нужные поля для выборки.
PHP:
скопировать код в буфер обмена
$content = $pagination->getPageContent(); if($content){ var_dump($pagination->showPages('http://site.ru/pagination.php?page='));//а здесь лежит навигация(кнопочки вперед, назад, 123). В скобках указываем ссылку, по которой должен работать пагинатор. }else{ //страница не найдена }
Пример использования в режиме с фильтром. Инициализация параметров.
PHP:
скопировать код в буфер обмена
$page = isset($_GET['page']) ? (int )$_GET['page'] : 1; $pagi = new Pagination (10 , $page, 'items', array('item', 'description'), Pagination ::FILTER_MODE, "WHERE `price` > :price", array(':price' => $price));
Первые 4 параметра такие же как и в первом примере.
5. Параметр это константа FILTER_MODE которая сообщает классу, что запрос будет будет содержать фильтр(лимит указывать не нужно).
6. Собственно сам фильр, извращайтесь там как угодно, сортируйте, группируйте и т.д
Фактически если следовать данному примеру, то фильтр придется в эту часть запроса:
7. Массив, который передается для значений параметров, которые были переданы в запрос.
Остальное все то же самое, как в вышеуказанном примере. Страницы и контент получается стандартным образом.
Примечание:
Классу безразлично ЧПУ у Вас или нет. Если ЧПУ, тогда в метод showPages передайте соответствующую ссылку.
Так же хочу заметить, класс использует PDO для работы с БД. Для тех кто пользуется mysql или mysqli нужно будет изменить пару строчек, но это я оставлю на Вас
Вроде бы всё.
(Отредактировано автором: 06 Ноября, 2014 - 18:27:45)
|