[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Пагинатор.
m4a1fox
Итак, чур ядом не плеваться. Пагинатор. Прошу высказать свое мнение именно по коду.
Имеем такой код.
Свернутый текст

<?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 = '&larr;';
private $lastPage = '&rarr;';


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 написал(а):
Вижу сразу проблему выборки с фильтром по данным. Оно тут не предусмотрено.
Использую собственную реализацию, где работа с бд отдельно, генерация пагинатора отдельно. Использую уже довольно давно и успешно smile.gif Где-то на форуме выкладывал уже.

Спустя 46 секунд (26.04.2012 - 12:34) vasa_c написал(а):
Цитата (m4a1fox @ 26.04.2012 - 14:29)
vasa_c
Цитата
День пагинаторов на phpforum

А где еще есть?

Спустя 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 подсказал! Полегчало?

Спустя 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
он прав, неграмотно написано, сразу виден русский-английский smile.gif

Цитата
css class to link where you now is


можно, например, заменить так:

Цитата
active link element css class


или если хочется сохранить фразу в точности, то что-то типа

Цитата
css class for the page you are currently on


а изначальный смысл действительно близок к тому, что vital привел smile.gif

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

Спустя 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
подтягивай английский, в общем smile.gif желание на нем писать - похвально, но писать надо стараться правильно. неграмотные комментарии все таки не очень приятно читать.

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

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

Дык translate.google.ru smile.gif
Давайте Вашу версию перевода. Там то всего строчек 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 подсказал! Полегчало?

Злой ты. Я же из лучших побуждений. Грамотность не только в пхп нужна - английский язык часто второй рабочий инструмент. Если что - буржуи больше платят wink.gif

Поэтому если пишешь на буржуинском(а зачем?), то это тоже стоит делать правильно.
Код же ты пытаешься совершенствовать. Вот и буржуинский заодно подтягивай а не злись и ругайся. 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 = '&larr;';
private $lastPage = '&rarr;';


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 = '&larr;';
private $lastPage = '&rarr;';


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)
$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, спасибо за замечания. Учту их в будущем.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.