Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Пагинатор

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (3): [1] 2 3 »   

> Без описания
etoYA
Отправлено: 30 Мая, 2012 - 18:17:00
Post Id



Участник


Покинул форум
Сообщений всего: 1859
Дата рег-ции: Июль 2011  
Откуда: Крым


Помог: 21 раз(а)




Пробую сделать универсальный пагинатор....

Вот сама модель.
PHP:
скопировать код в буфер обмена
  1. class Paginator{
  2.         public static $pages;
  3.        
  4.         public static function get($tbl, $num, $page){
  5.                 $r = mysqli()->query("SELECT count(*) FROM $tbl");
  6.                 if (!is_object($r)) throw new ErrorController('db');
  7.                 $count = $r->fetch_row();
  8.                 $total = intval(($count[0] - 1) / $num) + 1;
  9.                 $page = intval($page);
  10.                 if (empty($page) || $page <= 0) $page = 1;
  11.                 if ($page > $total) $page = $total;
  12.                 $start = $page * $num - $num;
  13.                 $r = mysqli()->query("SELECT * FROM $tbl ORDER by `id` DESC LIMIT $start, $num");
  14.                 if (!is_object($r)) throw new ErrorController('db');
  15.                 self::$pages = $total;
  16.                 return $r;
  17.         }
  18. }


В контроллер передаю обьект и общее число страниц.

PHP:
скопировать код в буфер обмена
  1.  
  2. 'r'                             => Paginator::get('users', 5, $arg[0]),
  3. 'pages' => Paginator::$pages
  4.  


Вот в чем вопрос, как лучше передавать html код страницы (в отдельном файле). или в методе, который будет возвращать массив с навигацией?

PHP:
скопировать код в буфер обмена
  1. <?PHP for ($i = 0; $i < $pages; $i++): ?>
  2. <a href="/index/index/<?=$i + 1; ?>"><?=$i + 1; ?></a>
  3. <?PHP endfor; ?>


p.s. только начал делать
 
 Top
DeepVarvar Супермодератор
Отправлено: 30 Мая, 2012 - 18:29:36
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Например есть некая сущность "список".
Должно быть как-то так:
PHP:
скопировать код в буфер обмена
  1. $mylimit = 20;
  2. $list = listWrapper::splitToPages("SELECT FROM bla /* никаких лимитов, запрос это параметр! */", $mylimit);

Так вот некий listWrapper должен вернуть лимитированый список + сбросить во вьюху готовый пагинатор для ЭТОГО списка.
Вот тогда он будет почти универсальным.
 
 Top
etoYA
Отправлено: 30 Мая, 2012 - 18:34:41
Post Id



Участник


Покинул форум
Сообщений всего: 1859
Дата рег-ции: Июль 2011  
Откуда: Крым


Помог: 21 раз(а)




DeepVarvar, ну он вроде и так универсальный. По выборке из базе, у меня проблема с составлением навигации, а имеено со ссылками

CODE (htmlphp):
скопировать код в буфер обмена
  1. controller/action/page


PHP:
скопировать код в буфер обмена
  1.  
  2. // users - таблица из которой нужно выбрать
  3. // 5 кол-во записей на страницу
  4. // $arg[0] - страница
  5. Paginator::get('users', 5, $arg[0]);
  6.  


PHP:
скопировать код в буфер обмена
  1.  
  2. // Хочу чтобы возвращал массив из ссылок вида:
  3. // <a href="controller/action/page">page</a>
  4. // пока у меня проблема с получением метода класса
  5. Paginator::navigation(get_class($this), get_class_methods());
  6.  

Вот метод пагинатора, который возвращает навигацую
PHP:
скопировать код в буфер обмена
  1.  
  2. public static function navigation($controller, $action){
  3.         $controller = substr(strtolower($controller), 0, -10);
  4.         $navigation = array();
  5.         for ($i = 0; $i < self::$pages; $i++){
  6.                 $navigation[] = '<a href="'. $controller. '/'. $action .'/'. $i .'">'. $i .'</a>';
  7.         }
  8.         return $navigation;
  9. }
  10.  


Хотя, думаю нет смысла получать автоматически название класса и его метод, так как все равно в контроллеры пагинатор добавляется в ручную).

(Отредактировано автором: 30 Мая, 2012 - 18:38:06)

 
 Top
tuareg
Отправлено: 30 Мая, 2012 - 18:44:01
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


Помог: 69 раз(а)




etoYA Он у тебя не универсальный по сути.
 
 Top
etoYA
Отправлено: 30 Мая, 2012 - 18:53:11
Post Id



Участник


Покинул форум
Сообщений всего: 1859
Дата рег-ции: Июль 2011  
Откуда: Крым


Помог: 21 раз(а)




tuareg, хм. точно, ведь если нужно условие в запросе, то.....

UPD

А теперь уневирсальный?

Из контроллера
PHP:
скопировать код в буфер обмена
  1.  
  2. $sql = 'SELECT * FROM `users`';
  3. $view->r = Paginator::split($sql, 'users', 5, $page);
  4.  


Сам пагинатор
PHP:
скопировать код в буфер обмена
  1.  
  2. class Paginator{
  3.         public static function split($sql, $tbl, $perPage, $page){
  4.                 $r = mysqli()->query("SELECT count(*) FROM $tbl");
  5.                 if (!is_object($r)) throw new ErrorController('db');
  6.                 $count = $r->fetch_row();
  7.                 $total = intval(($count[0] - 1) / $perPage) + 1;
  8.                 $page = intval($page);
  9.                 if (empty($page) || $page <= 0) $page = 1;
  10.                 if ($page > $total) $page = $total;
  11.                 $start = $page * $perPage - $perPage;
  12.                 $r = mysqli()->query("$sql LIMIT $start, $perPage");
  13.                 if (!is_object($r)) throw new ErrorController(mysqli()->error);
  14.                 return $r;
  15.         }
  16. }
  17.  

(Отредактировано автором: 30 Мая, 2012 - 19:42:25)

 
 Top
tuareg
Отправлено: 30 Мая, 2012 - 19:43:54
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


Помог: 69 раз(а)




etoYA пишет:
tuareg, хм. точно, ведь если нужно условие в запросе, то.....

Да даже не условие. Смотри 15000 товаров. Нужно вывести 15 на стр.
600 страница если запрашивают 1000 юзеров. Сервер умирает...
 
 Top
etoYA
Отправлено: 30 Мая, 2012 - 19:46:01
Post Id



Участник


Покинул форум
Сообщений всего: 1859
Дата рег-ции: Июль 2011  
Откуда: Крым


Помог: 21 раз(а)




tuareg, я там обновил.

tuareg пишет:
Да даже не условие. Смотри 15000 товаров. Нужно вывести 15 на стр.
600 страница если запрашивают 1000 юзеров. Сервер умирает...

И что с этим делать?
 
 Top
tuareg
Отправлено: 30 Мая, 2012 - 19:54:51
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


Помог: 69 раз(а)




etoYA пишет:
И что с этим делать?

А вот тут я бы очень хотел услышать мнение "старших товарищей". Здесь нет сарказма если что. Я делаю поле в котором проставляю № страницы. Тут только проблема, что тяжелые процедуры в админке получаются
 
 Top
etoYA
Отправлено: 30 Мая, 2012 - 19:57:25
Post Id



Участник


Покинул форум
Сообщений всего: 1859
Дата рег-ции: Июль 2011  
Откуда: Крым


Помог: 21 раз(а)




tuareg пишет:
Я делаю поле в котором проставляю № страницы.

Ну это уже через чур)))).
 
 Top
tuareg
Отправлено: 30 Мая, 2012 - 20:04:15
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


Помог: 69 раз(а)




Может быть, но зато 15000 товаров 600 страница
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT * /*(то что надо)*/ FROM `table` WHERE `page`=600;
  3.  

индекс по `page` и лепота Радость
А теперь попробуй написать запросы без `page`?
1. count
2. limit, который хоть уср..сь, но будет выбирать все 600 страниц
 
 Top
etoYA
Отправлено: 30 Мая, 2012 - 20:08:13
Post Id



Участник


Покинул форум
Сообщений всего: 1859
Дата рег-ции: Июль 2011  
Откуда: Крым


Помог: 21 раз(а)




tuareg, ну я сейчас только пробую сдеать хоть что-то, на заметку взял "онлайн кинотеатр", и пробую сделать для него CMS.

Очень хотелось бы услышать мнение по этому пагинатору от опытных Хорошо
 
 Top
tuareg
Отправлено: 30 Мая, 2012 - 20:11:55
Post Id


Участник


Покинул форум
Сообщений всего: 1234
Дата рег-ции: Июнь 2010  


Помог: 69 раз(а)




Я бы тоже. Но читал книжку, там сами разрабы MySQL пишут денормализация.
(Добавление)
Спасибо тебе. Я придумал способ сделать это все гораздо проще.
 
 Top
DeepVarvar Супермодератор
Отправлено: 30 Мая, 2012 - 20:21:09
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




tuareg пишет:
Спасибо тебе. Я придумал способ сделать это все гораздо проще
И какой способ это?
 
 Top
etoYA
Отправлено: 30 Мая, 2012 - 20:21:25
Post Id



Участник


Покинул форум
Сообщений всего: 1859
Дата рег-ции: Июль 2011  
Откуда: Крым


Помог: 21 раз(а)




tuareg, +1 к DeepVarvar'у

(Отредактировано автором: 30 Мая, 2012 - 20:23:12)

 
 Top
DeepVarvar Супермодератор
Отправлено: 30 Мая, 2012 - 20:22:55
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Я приду домой покажу свой, может ты до того же не дошел.
 
 Top
Страниц (3): [1] 2 3 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Объектно-ориентированное программирование »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB