Имеем такой код.
Свернутый текст
<?php
class Paginator{
public $id; // Page on which the user is currently
public $not_active; // Class of links where you are
public $active; // Class of links which is active
public $link; // Links to Page Navigator
public $table; // The selected table
public $countRow; // Counting all the required rows in the table
public $per_page; // How many pages will be on the right and left
public $db; // DB connect
public $counts; // Calculation of the necessary lines in the system
public $begin; // The beginning of the sample
private $firstPage = '←';
private $lastPage = '→';
function __construct($id, $link, $table, $per_page, $design = array()){
$this->id = $id;
$this->link = M4A1_HOST.$link;
$this->table = $table;
$this->per_page = $per_page;
$this->active = $design[0];
$this->not_active = $design[1];
$this->begin = ($this->id-1)*$this->per_page;
$this->db = Registry::get('DB');
$this->countRow = $this->db->query("SELECT COUNT(*) FROM `".$this->table."`")->fetchColumn();
$this->counts = ceil($this->countRow/$this->per_page);
}
public function getPage(){
return $this->db->query("SELECT * FROM `".$this->table."` LIMIT ".$this->begin.", ".$this->per_page)->fetchAll(PDO::FETCH_CLASS, "stdClass");
}
public function paginate(){
if($this->id != 1){
$numbers[] = $this->FisrtPage();
}
if($this->id > $this->per_page+1){
for($i=$this->id-$this->per_page; $i<$this->id; $i++){
$numbers[] = $this->activeLink($i);
}
}else{
for($i=1; $i<$this->id; $i++){
$numbers[] = $this->activeLink($i);
}
}
$numbers[] = $this->nowPage();
if($this->id + $this->per_page < $this->counts){
for($i=$this->id+1; $i<=$this->id+$this->per_page; $i++){
$numbers[] = $this->activeLink($i);
}
}else{
for($i=$this->id+1; $i<=$this->counts; $i++){
$numbers[] = $this->activeLink($i);
}
}
$numbers[] = $this->LastPage($this->counts);
return $numbers;
}
function FisrtPage(){
return '<a href="'.$this->link.'" class="'.$this->active.'">'.$this->firstPage.'</a>';
}
function nowPage(){
return '<span class="'.$this->not_active.'">'.$this->id.'</span>';
}
function activeLink($page){
return '<a href="'.($this->link).$page.'" class="'.$this->active.'">'.$page.'</a>';
}
function LastPage($page){
return '<a href="'.$this->link.$page.'" class="'.$this->active.'">'.$this->lastPage.'</a>';
}
}
Подключение происходит так
$pagination = new Paginator($id, 'url', 'user', 3, array('active', 'not_active'));
$result = $pagination ->getPage();
$numbers = $pagination ->paginate();
Что в конструкторе, аргументы -
1. $id - собственно сам номер передаваемой страницы
2. 'url' - ссылка на страницу
3. 'user' - БД из кот. выбираются данные
4. 3 - кол-во ссылок справа и слева
5. array('active', 'not_active') - массив с классами css. Как понятно из названия активные ссылки и ссылка на кот. сейчас находится пользователь.
Спустя 3 минуты, 43 секунды (26.04.2012 - 12:29) vasa_c написал(а):
День пагинаторов на phpforum
Спустя 54 секунды (26.04.2012 - 12:29) m4a1fox написал(а):
vasa_c
Цитата |
День пагинаторов на phpforum |
А где еще есть?
Спустя 2 минуты, 32 секунды (26.04.2012 - 12:32) m4a1fox написал(а):
Я вот думаю.... может разбить метод paginate() на другие методы... а то он какой-то громоздкий получается...
Спустя 1 минута, 20 секунд (26.04.2012 - 12:33) Nikitian написал(а):
Вижу сразу проблему выборки с фильтром по данным. Оно тут не предусмотрено.
Использую собственную реализацию, где работа с бд отдельно, генерация пагинатора отдельно. Использую уже довольно давно и успешно
Где-то на форуме выкладывал уже.
Использую собственную реализацию, где работа с бд отдельно, генерация пагинатора отдельно. Использую уже довольно давно и успешно

Спустя 46 секунд (26.04.2012 - 12:34) vasa_c написал(а):
Цитата (m4a1fox @ 26.04.2012 - 14:29) | ||
vasa_c
А где еще есть? |
Спустя 15 минут, 44 секунды (26.04.2012 - 12:50) m4a1fox написал(а):
Nikitian
Цитата |
Вижу сразу проблему выборки с фильтром по данным. |
Это есть такое...э проблемка. Но она как бы не критична. Поправлю. Спасибо что напомнили!
Спустя 1 час, 37 минут, 24 секунды (26.04.2012 - 14:27) vital написал(а):
Вижу сразу проблему с английским.
Цитата |
page in what user is now |
Страница что такое пользователь сейчас
Цитата |
css class to link where you now is |
цсс класс что бы ссылка где вы сейчас есть
ну и так далее. Безграмотно вобщем) Не стоит публиковать такое)
Спустя 1 час, 27 минут, 6 секунд (26.04.2012 - 15:54) m4a1fox написал(а):
vital
Цитата |
ну и так далее. Безграмотно вобщем) Не стоит публиковать такое) |
Ну вот ты опять... ну так поправь. Делов то... коли умный такой. Напиши как правильно. В чем проблема?
P.S. И еще. Если уж на то пошло.
Цитата |
css class to link where you now is |
css класс к ссылки где вы сейчас есть(находитесь)
Цитата |
page in what user is now |
Страница на кот. пользователь сейчас
Спустя 11 минут, 9 секунд (26.04.2012 - 16:06) m4a1fox написал(а):
vital
Исправил как google подсказал! Полегчало?
Исправил как google подсказал! Полегчало?
Спустя 1 минута, 29 секунд (26.04.2012 - 16:07) m4a1fox написал(а):
Лучше подскажите как вот от этого наплыва избавится?
Как то же можно упростить?
function FisrtPage(){
return '<a href="'.$this->link.'" class="'.$this->active.'">'.$this->firstPage.'</a>';
}
function nowPage(){
return '<span class="'.$this->not_active.'">'.$this->id.'</span>';
}
function activeLink($page){
return '<a href="'.($this->link).$page.'" class="'.$this->active.'">'.$page.'</a>';
}
function LastPage($page){
return '<a href="'.$this->link.$page.'" class="'.$this->active.'">'.$this->lastPage.'</a>';
}
Как то же можно упростить?
Спустя 2 минуты, 31 секунда (26.04.2012 - 16:10) glock18 написал(а):
m4a1fox
он прав, неграмотно написано, сразу виден русский-английский
он прав, неграмотно написано, сразу виден русский-английский

Цитата |
css class to link where you now is |
можно, например, заменить так:
Цитата |
active link element css class |
или если хочется сохранить фразу в точности, то что-то типа
Цитата |
css class for the page you are currently on |
а изначальный смысл действительно близок к тому, что vital привел

Спустя 4 минуты, 16 секунд (26.04.2012 - 16:14) m4a1fox написал(а):
glock18
Да я ж не против. И полностью согласен. На что меня хватило сходу, так и написал. Уже поправил
Да я ж не против. И полностью согласен. На что меня хватило сходу, так и написал. Уже поправил

Спустя 15 секунд (26.04.2012 - 16:14) glock18 написал(а):
Цитата (m4a1fox @ 26.04.2012 - 14:06) |
Исправил как google подсказал! Полегчало? |
стало получше, но тоже слабовато.
например,
public $not_active; // Class of links where you are
public $active; // Class of links which is active
комментарии означают примерно одно и то же, хотя по названию переменных они противоположные. во втором глагол to be во мн. числе должен быть, как и links, к которому относится.
да и в целом, чувствуется неестественность фраз
Спустя 2 минуты, 58 секунд (26.04.2012 - 16:17) glock18 написал(а):
m4a1fox
подтягивай английский, в общем
желание на нем писать - похвально, но писать надо стараться правильно. неграмотные комментарии все таки не очень приятно читать.
грамматику в школе изучал только? надо как-то тебе базу подтянуть, тогда щелкать лучше меня будешь
подтягивай английский, в общем

грамматику в школе изучал только? надо как-то тебе базу подтянуть, тогда щелкать лучше меня будешь

Спустя 2 минуты, 33 секунды (26.04.2012 - 16:20) m4a1fox написал(а):
glock18
Цитата |
да и в целом, чувствуется неестественность фраз |
Дык translate.google.ru

Давайте Вашу версию перевода. Там то всего строчек 9-10.
Спустя 9 минут, 52 секунды (26.04.2012 - 16:29) glock18 написал(а):
public $id; // Page on which the user is currently
public $not_active; // Class of links where you are
public $active; // Class of links which is active
public $link; // Links to Page Navigator
public $table; // The selected table
public $countRow; // Counting all the required rows in the table
public $per_page; // How many pages will be on the right and left
public $db; // DB connect
public $counts; // Calculation of the necessary lines in the system
public $begin; // The beginning of the sample
для всего этого русские комментарии мне дай, чтобы я понял что нужно, после этого напишу
Спустя 46 минут, 38 секунд (26.04.2012 - 17:16) m4a1fox написал(а):
public $id; // Страница на которой находится пользователь сейчас
public $not_active; // сss Класс для не активной странице. Т.е. странице $id
public $active; // css Класс для всех остальных страниц - активный
public $link; // Ссылка для навигатора
public $table; // Таблица из кот. происходит выборка
public $countRow; // Подсчет всех выбранных строк из таблицы
public $per_page; // Сколько страниц будет слева и справа от текущей
public $db; // Соединение с БД
public $counts; // Подсчет, сколько необходимо сделать страниц в навигаторе
public $begin; // С какой цифры начинается выборка из БД. То есть LIMIT $begin
Спустя 14 минут, 44 секунды (26.04.2012 - 17:31) vital написал(а):
Цитата |
Исправил как google подсказал! Полегчало? |
Злой ты. Я же из лучших побуждений. Грамотность не только в пхп нужна - английский язык часто второй рабочий инструмент. Если что - буржуи больше платят

Поэтому если пишешь на буржуинском(а зачем?), то это тоже стоит делать правильно.
Код же ты пытаешься совершенствовать. Вот и буржуинский заодно подтягивай а не злись и ругайся. 2 в 1.
Спустя 5 минут (26.04.2012 - 17:36) m4a1fox написал(а):
vital
Цитата |
Я же из лучших побуждений. |
Верю. Извини. Чет меня занесло.
Спустя 13 минут, 18 секунд (26.04.2012 - 17:49) m4a1fox написал(а):
Теперь так. Гляньте так, на вскидку... лучше стало, или нет?
Свернутый текст
<?php
class Paginator{
private $id; // Page on which the user is currently
private $not_active; // Class of links where you are
private $active; // Class of links which is active
private $link; // Links to Page Navigator
private $table; // The selected table
private $countRow; // Counting all the required rows in the table
private $per_page; // How many pages will be on the right and left
private $db; // DB connect
private $counts; // Calculation of the necessary lines in the system
private $begin; // The beginning of the sample
private $leftLink;
private $rightLink;
private $firstPage = '←';
private $lastPage = '→';
function __construct($id, $link, $table, $per_page, $design = array()){
$this->id = $id;
$this->link = M4A1_HOST.$link;
$this->table = $table;
$this->per_page = $per_page;
$this->active = $design[0];
$this->not_active = $design[1];
$this->begin = ($this->id-1)*$this->per_page;
$this->db = Registry::get('DB');
$this->countRow = $this->db->query("SELECT COUNT(*) FROM `".$this->table."`")->fetchColumn();
$this->counts = ceil($this->countRow/$this->per_page);
}
public function getPage(){
return $this->db->query("SELECT * FROM `".$this->table."` LIMIT ".$this->begin.", ".$this->per_page)->fetchAll(PDO::FETCH_CLASS, "stdClass");
}
public function paginate(){
return array($this->FisrtPage(), $this->leftLink(), $this->nowPage(), $this->rightLink(), $this->LastPage());
}
private function leftLink(){
if($this->id > $this->per_page+1){
for($i=$this->id-$this->per_page; $i<$this->id; $i++){
$this->leftLink .= $this->activeLink($i);
}
}else{
for($i=1; $i<$this->id; $i++){
$this->leftLink .= $this->activeLink($i);
}
}
return $this->leftLink;
}
private function rightLink(){
if($this->id + $this->per_page < $this->counts){
for($i=$this->id+1; $i<=$this->id+$this->per_page; $i++){
$this->rightLink .= $this->activeLink($i);
}
}else{
for($i=$this->id+1; $i<=$this->counts; $i++){
$this->rightLink .= $this->activeLink($i);
}
}
return $this->rightLink;
}
private function FisrtPage(){
if($this->id != 1)
return '<a href="'.$this->link.'" class="'.$this->active.'">'.$this->firstPage.'</a>';
}
private function nowPage(){
return '<span class="'.$this->not_active.'">'.$this->id.'</span>';
}
private function LastPage(){
if($this->id != $this->counts)
return '<a href="'.$this->link.$this->counts.'" class="'.$this->active.'">'.$this->lastPage.'</a>';
}
private function activeLink($page){
return '<a href="'.($this->link).$page.'" class="'.$this->active.'">'.$page.'</a>';
}
}
Спустя 2 минуты, 15 секунд (26.04.2012 - 17:51) glock18 написал(а):
public $id; // Страница на которой находится пользователь сейчас
public $not_active; // сss Класс для не активной странице. Т.е. странице $id
public $active; // css Класс для всех остальных страниц - активный
public $link; // Ссылка для навигатора
public $table; // Таблица из кот. происходит выборка
public $countRow; // Подсчет всех выбранных строк из таблицы
public $per_page; // Сколько страниц будет слева и справа от текущей
public $db; // Соединение с БД
public $counts; // Подсчет, сколько необходимо сделать страниц в навигаторе
public $begin; // С какой цифры начинается выборка из БД. То есть LIMIT $begin
->
public $id; // Page the user is currently on
public $not_active; // сss class of non-clickable elements (current page)
public $active; // css class of clickable elements
public $link; // some link for some weird navigator
public $table; // db table to fetch data from
public $countRow; // supposed to be a total number of pagenable items
public $per_page; // amount of pages to the right and to the left from current page
public $db; // database connection
public $counts; // another weird variable
public $begin; // elements offset
эти два:
public $link; // Ссылка для навигатора
public $counts; // Подсчет, сколько необходимо сделать страниц в навигаторе
не понял, что за навигатор такой, и что за подсчет
Спустя 1 минута, 27 секунд (26.04.2012 - 17:53) m4a1fox написал(а):
Упс... а чего он навигатор, когда он пагинатор. Sorry. Опечатка вышла.
Спустя 38 минут, 10 секунд (26.04.2012 - 18:31) m4a1fox написал(а):
В общем... мой извращенный мозг вот до чего дошел
Свернутый текст
<?php
class Paginator{
private $id; // Page on which the user is currently
private $not_active; // Class of links where you are
private $active; // Class of links which is active
private $link; // Links to Page Navigator
private $table; // The selected table
private $countRow; // Counting all the required rows in the table
private $per_page; // How many pages will be on the right and left
private $db; // DB connect
private $counts; // Calculation of the necessary lines in the system
private $begin; // The beginning of the sample
private $leftLink;
private $rightLink;
private $firstPage = '←';
private $lastPage = '→';
function __construct($id, $link, $table, $per_page, $design = array()){
$this->id = $id;
$this->link = M4A1_HOST.$link;
$this->table = $table;
$this->per_page = $per_page;
$this->active = $design[0];
$this->not_active = $design[1];
$this->begin = ($this->id-1)*$this->per_page;
$this->db = Registry::get('DB');
$this->countRow = $this->db->query("SELECT COUNT(*) FROM `".$this->table."`")->fetchColumn();
$this->counts = ceil($this->countRow/$this->per_page);
}
public function getPage(){
return $this->db->query("SELECT * FROM `".$this->table."` LIMIT ".$this->begin.", ".$this->per_page)->fetchAll(PDO::FETCH_CLASS, "stdClass");
}
public function paginate(){
return array($this->FisrtPage(), $this->leftLink(), $this->nowPage(), $this->rightLink(), $this->LastPage());
}
private function FisrtPage(){
if($this->id != 1)
return $this->links($this->firstPage);
}
private function leftLink(){
if($this->id > $this->per_page+1){
for($i=$this->id-$this->per_page; $i<$this->id; $i++)
$this->leftLink .= $this->activeLink($i);
}else{
for($i=1; $i<$this->id; $i++)
$this->leftLink .= $this->activeLink($i);
}
return $this->leftLink;
}
private function nowPage(){
return '<span class="'.$this->not_active.'">'.$this->id.'</span>';
}
private function rightLink(){
if($this->id + $this->per_page < $this->counts){
for($i=$this->id+1; $i<=$this->id+$this->per_page; $i++)
$this->rightLink .= $this->activeLink($i);
}else{
for($i=$this->id+1; $i<=$this->counts; $i++)
$this->rightLink .= $this->activeLink($i);
}
return $this->rightLink;
}
private function LastPage(){
if($this->id != $this->counts)
return $this->links($this->lastPage, $this->counts);
}
private function activeLink($page){
return $this->links($page, $page);
}
private function links($page, $second=true){
return '<a href="'.$this->link.$second.'" class="'.$this->active.'">'.$page.'</a>';
}
}
Спустя 8 минут, 52 секунды (26.04.2012 - 18:40) m4a1fox написал(а):
Мне вот эта часть
не нравится совсем. Выглядит как-то ужасно.
private function activeLink($page){
return $this->links($page, $page);
}
не нравится совсем. Выглядит как-то ужасно.
Спустя 5 дней, 14 часов, 13 минут, 25 секунд (2.05.2012 - 08:53) minor написал(а):
Я бы все же придерживался mvc, зачем погинатору знать о БД когда можно передать туда нужные параметры при выборки, все что связано с отображением в хелпер вьюшки.
Спустя 15 часов, 39 минут, 10 секунд (3.05.2012 - 00:32) SlavaFr написал(а):
Проблематичные места найденые в конструкторе
1)
классом нельзя пользоватся до тех пор, пока не будет дефенирована константа M4A1_HOST. Это первый признак того, что класс для библиотеки не подходит и может быть использован только в контексте фрамеворк.
2)
а если $design[0] нет?
а как догодатся пользователю что туда надо вставить, если потеряется твое example которое только в форуме докуметнированно, но не в программном техте?
та же проблема с
3)
Опять зависимости и причем от класса Regestry и от класса который делает query. Тоесть можно только в фрамеворке такое делать и только при условие, что все нужные классы известны и Registry инициализированно 'DB'. Зделай лучше дополнительный параметер для БД (... , PDO $connected_bd) чтоб избежать недаразумений.
-----------------
Короче на прямую классом пользоватся к сожалению не получится.
1)
$this->link = M4A1_HOST.$link;
классом нельзя пользоватся до тех пор, пока не будет дефенирована константа M4A1_HOST. Это первый признак того, что класс для библиотеки не подходит и может быть использован только в контексте фрамеворк.
2)
$this->active = $design[0];
а если $design[0] нет?
а как догодатся пользователю что туда надо вставить, если потеряется твое example которое только в форуме докуметнированно, но не в программном техте?
та же проблема с
$this->not_active = $design[1];
3)
$this->db = Registry::get('DB');
$this->countRow = $this->db->query("SELECT COUNT(*) FROM `".$this->table."`")->fetchColumn();
$this->counts = ceil($this->countRow/$this->per_page);
Опять зависимости и причем от класса Regestry и от класса который делает query. Тоесть можно только в фрамеворке такое делать и только при условие, что все нужные классы известны и Registry инициализированно 'DB'. Зделай лучше дополнительный параметер для БД (... , PDO $connected_bd) чтоб избежать недаразумений.
-----------------
Короче на прямую классом пользоватся к сожалению не получится.
Спустя 10 часов, 21 минута, 41 секунда (3.05.2012 - 10:54) m4a1fox написал(а):
SlavaFr, спасибо за замечания. Учту их в будущем.