Повторить урок для файла index.php у меня получилось, но когда начал разбираться с разделом Шаг 5 и Шаг 6, все запуталось.
Есть такой сайт:
www.site.com/index.php -- здесь пагинация не нужна
www.site.com/gallery.php
www.site.com/articles.php
www.site.com/news.php
В каждом разделе выводится перечень содержимого раздела.
Хочется сделать в каждом разделе свою пагинацию, чтобы было так:
www.site.com/gallery/9
www.site.com/articles/11
www.site.com/news/22
Вопрос
Не могли бы вы подробнее объяснить идею подключения класса к любой странице сайта.
Спасибо!
Спустя 55 минут, 23 секунды (20.10.2010 - 17:54) twin написал(а):
К любой не выйдет. Нет универсального решения.
Можно к каждой. Или к нужным.
Для каждой свои настройки.
А вообще, в чем затруднения? Подключаем файл, инициализируем объект, передаем в метод запрос, получаем меню навигации... Там есть же даже пример рабочий.
Можно к каждой. Или к нужным.
Для каждой свои настройки.
А вообще, в чем затруднения? Подключаем файл, инициализируем объект, передаем в метод запрос, получаем меню навигации... Там есть же даже пример рабочий.
Спустя 4 часа, 43 минуты, 13 секунд (20.10.2010 - 22:37) KonstRuctor написал(а):
Цитата (twin @ 20.10.2010 - 14:54) |
К любой не выйдет. Нет универсального решения. Можно к каждой. Или к нужным. Для каждой свои настройки. А вообще, в чем затруднения? Подключаем файл, инициализируем объект, передаем в метод запрос, получаем меню навигации... Там есть же даже пример рабочий. |
Пример у меня замечательно работает!
Я повторил все шаги самостоятельно, все получилось.
С файлом index.php все работает без проблем.
А вот что я не понял: выходит, что для каждого случая надо написать свой класс пагинации, так как в нем жестко прописано слово 'page'... Не могли бы вы объяснить вот этот момент подробнее, что-то я запутался.
* * *
Сейчас я пагинацию делаю на простом php, без использования ООП, каждый раз для каждого вывода прописываю километры кода, что не есть хорошо. Учусь как сделать правильно. Когда у меня ваш пример заработал, обрадовался, но потом понял, что не все до конца ясно.
Спустя 2 часа, 1 минута, 20 секунд (21.10.2010 - 00:38) twin написал(а):
Цитата |
А вот что я не понял: выходит, что для каждого случая надо написать свой класс пагинации, так как в нем жестко прописано слово 'page'... Не могли бы вы объяснить вот этот момент подробнее, что-то я запутался. |
Нуууу... На кой же тогда класс... Не нужно переписывать и даже лазить в него. Инкапсуляция))
И 'page' ничё не жестко прописано, а просто по умолчанию.
Все просто. В нужном месте подключаем файл с классом (если нет автолоада)
и инициализируем объект
// Подключаем классЗдесь $page - текущая страница (из $_GET), $num - количество записей на странице.
include './irb_paginator.php';
// Инициализируем объект
$paginator = new IRB_Paginator($page, $num);
Потом суём в метод countQuery() свой запрос, если он простой
// Запрос простой
$res = $paginator -> countQuery("SELECT * FROM `table`");
или calcQuery(), если сложный
// Запрос с поискоми генерим менюшку:
$res = $paginator -> calcQuery("SELECT * FROM `table`
WHERE `text`
LIKE '%". mysql_real_escape_string($search) ."%'");
// Формируем менюВсё... Что тут может вызвать трудность?
$menu = $paginator -> createMenu();
Если нужно вложенная пагинация, или не нравится слово 'page', а так же хочется использовать реврайт, то это можно передать в метод:
// Формируем меню
$menu = $paginator -> createMenu(true, 'another_word');
где true - включаем реврайт, 'another_word' - другое слово вместо 'page'.
Где тут можно заблудиться...
Спустя 6 дней, 16 часов, 36 минут, 30 секунд (27.10.2010 - 17:15) KonstRuctor написал(а):
Огромное спасибо! Буду разбираться.
Спустя 8 дней, 13 часов, 41 минута, 28 секунд (6.11.2010 - 07:56) fire написал(а):
Назрел такой вопрос. Данные для вывода новостей скрипт получает из гет параметра, т.е. у нас есть такой запрос
который выводит
+----+---------------------+----------+-----------------------------------------
---------+--------+
| id | date | subtitle | text
| public |
+----+---------------------+----------+-----------------------------------------
---------+--------+
| 11 | 2010-11-06 05:32:51 | 10 | asdsadsa dsadsad dsadsadsadsadasdasdsa d
sadsadas | 1 |
| 9 | 2010-11-06 05:32:51 | 9 | asdsadsa dsadsad dsadsadsadsadasdasdsa d
sadsadas | 1 |
+----+---------------------+----------+-----------------------------------------
---------+--------+
2 rows in set (0.00 sec)
а при запросе на другую страницу мы получаем
+----+---------------------+----------+-----------------------------------------
---------+--------+
| id | date | subtitle | text
| public |
+----+---------------------+----------+-----------------------------------------
---------+--------+
| 9 | 2010-11-06 05:32:51 | 9 | asdsadsa dsadsad dsadsadsadsadasdasdsa d
sadsadas | 1 |
| 8 | 2010-11-06 05:32:51 | 8 | asdsadsa dsadsad dsadsadsadsadasdasdsa d
sadsadas | 1 |
+----+---------------------+----------+-----------------------------------------
---------+--------+
2 rows in set (0.00 sec)
т.е. мы получаем много дублированного контента что очень не желательно. Также ссылки в меню начинаются не с 0 а с 1, что также приводит к проблемам. Это решается средставами данного класса ? Я так понимаю, где то напартачил ?
Еще когда пытаюсь включить мод реврайт
в ответ от движка получаю The variable 1 is not defined, это что ? Правда не совсем понятно зачем мне это, у меня страницы типа таких /pages/1 и все нормально работает.
$quer = "SELECT *
FROM `" . IRB_DBPREFIX . "news`
WHERE `public` = 1
ORDER BY `id` DESC
LIMIT ".$num.",". IRB_NUM_NEWS_MAIN ;
который выводит
Свернутый текст
+----+---------------------+----------+-----------------------------------------
---------+--------+
| id | date | subtitle | text
| public |
+----+---------------------+----------+-----------------------------------------
---------+--------+
| 11 | 2010-11-06 05:32:51 | 10 | asdsadsa dsadsad dsadsadsadsadasdasdsa d
sadsadas | 1 |
| 9 | 2010-11-06 05:32:51 | 9 | asdsadsa dsadsad dsadsadsadsadasdasdsa d
sadsadas | 1 |
+----+---------------------+----------+-----------------------------------------
---------+--------+
2 rows in set (0.00 sec)
а при запросе на другую страницу мы получаем
Свернутый текст
+----+---------------------+----------+-----------------------------------------
---------+--------+
| id | date | subtitle | text
| public |
+----+---------------------+----------+-----------------------------------------
---------+--------+
| 9 | 2010-11-06 05:32:51 | 9 | asdsadsa dsadsad dsadsadsadsadasdasdsa d
sadsadas | 1 |
| 8 | 2010-11-06 05:32:51 | 8 | asdsadsa dsadsad dsadsadsadsadasdasdsa d
sadsadas | 1 |
+----+---------------------+----------+-----------------------------------------
---------+--------+
2 rows in set (0.00 sec)
т.е. мы получаем много дублированного контента что очень не желательно. Также ссылки в меню начинаются не с 0 а с 1, что также приводит к проблемам. Это решается средставами данного класса ? Я так понимаю, где то напартачил ?
Еще когда пытаюсь включить мод реврайт
$menu = $paginator -> createMenu(true);
в ответ от движка получаю The variable 1 is not defined, это что ? Правда не совсем понятно зачем мне это, у меня страницы типа таких /pages/1 и все нормально работает.
Спустя 28 минут, 51 секунда (6.11.2010 - 08:25) twin написал(а):
Цитата |
в ответ от движка получаю The variable 1 is not defined, |
Если используется движок, то и переменные нужно определять по его правилам.
Остальное вообще ничего не понял. Ссылки с единицы начинаются в классе, что за дублированный контент... Не ясно.
Спустя 8 часов, 45 минут, 26 секунд (6.11.2010 - 17:10) fire написал(а):
Цитата |
Остальное вообще ничего не понял. Ссылки с единицы начинаются в классе, что за дублированный контент... Не ясно. |
получается что на странице которая выводит 2 записи будет менятся всего одна новость, в листинге sql кода это можно увидеть.
Спустя 24 дня, 5 часов, 12 минут, 26 секунд (30.11.2010 - 22:23) KonstRuctor написал(а):
Привет снова!
При использовании пагинатора хотелось бы в самом верху старницы вывести общее кол-во новостей. Это бывает нужно, например, для админки или статистики.
Данный класс не позволяет это сделать.
Я написал такую функцию:
И вывожу новости так:
Правильно я понимаю, что я просто добавил еще один запрос к базе в работу скрипта? Другими словами, я мог бы просто в самом начале скрипта самостоятельно вызвать свой запрос с COUNT(id), подсичтать $amount, после чего уже подключать пагинатор как обычно?
Как все-таки сделать грамотно?
Спасибо!
При использовании пагинатора хотелось бы в самом верху старницы вывести общее кол-во новостей. Это бывает нужно, например, для админки или статистики.
Данный класс не позволяет это сделать.
Я написал такую функцию:
public function countTotalQuery($query)
{
$query = str_replace("\n", " ", $query);
preg_match("#FROM(.+)#i", $query, $table);
$result = mysql_query("SELECT COUNT(*) AS `cnt`
FROM ". $table[1]);
return mysql_result($result, 0);
}
И вывожу новости так:
$paginator = new IRB_Paginator($page, $num);
$query = "SELECT * FROM `news` ORDER BY `newsdate` DESC";
$result = $paginator -> countQuery($query);
$menu = $paginator -> createMenu();
$amount = $paginator -> countTotalQuery($query); // всего новостей в системе
if( $db->num_rows($result) > 0 ) // кол-во новостей с учетом лимита $num
{
// тут собственно вывод новостей с лимитом
Правильно я понимаю, что я просто добавил еще один запрос к базе в работу скрипта? Другими словами, я мог бы просто в самом начале скрипта самостоятельно вызвать свой запрос с COUNT(id), подсичтать $amount, после чего уже подключать пагинатор как обычно?
Как все-таки сделать грамотно?
Спасибо!
Спустя 47 минут, 57 секунд (30.11.2010 - 23:11) twin написал(а):
Нет, так не верно. Нужно просто в классе изменить уровень доступа у свойства
public $TableTotal = 0;и тогда можно просто получить снаружи его значение:
$paginator = new IRB_Paginator($page, $num);
$query = "SELECT * FROM `news` ORDER BY `newsdate` DESC";
$result = $paginator -> countQuery($query);
$menu = $paginator -> createMenu();
$amount = $paginator -> TableTotal; // всего новостей в системе
Спустя 6 минут, 19 секунд (30.11.2010 - 23:17) KonstRuctor написал(а):
Вау! Класс. Парни, учите уровни доступа!
Хочу сам сделать стрелочки перемотки "туда" и "сюда" — соответственно, слева и справа цифр номеров страниц в меню.
Как сделаю, покажу свое творение :-))))
Хочу сам сделать стрелочки перемотки "туда" и "сюда" — соответственно, слева и справа цифр номеров страниц в меню.
Как сделаю, покажу свое творение :-))))
Спустя 3 месяца, 18 дней, 18 часов, 45 минут, 4 секунды (19.03.2011 - 18:02) gidrosoldat написал(а):
Доброе время суток!
Нашел маленький недочет в пагинаторе: если все записи помещаются на одну страницу переменная $page_menu = $paginator -> createMenu(); выдает не активную (не ссылку) единичку. Как то она не эстетично выглядит )
Я тут посидел полчасика и кое как ее убрал. Просто ввел в класс дополнительную переменную:
protected $count_links = 0;
она тупо подсчитывает количество срабатывания функции createLink():
И уже на выходе функции createMenu() контролирует результат, если функция createLink() сработала только раз, то результат не выводим.
Если вдруг выяснится, что я все правильно сделал, может имеет смысл исправить его в курсах.
Нашел маленький недочет в пагинаторе: если все записи помещаются на одну страницу переменная $page_menu = $paginator -> createMenu(); выдает не активную (не ссылку) единичку. Как то она не эстетично выглядит )
Я тут посидел полчасика и кое как ее убрал. Просто ввел в класс дополнительную переменную:
protected $count_links = 0;
она тупо подсчитывает количество срабатывания функции createLink():
private function createLink($page = 1, $link = '', $class = '', $active = true)
{
$this->count_links++;
if(empty($link)).....
И уже на выходе функции createMenu() контролирует результат, если функция createLink() сработала только раз, то результат не выводим.
...
if($this->count_links > 1)
{
return $menu ."\n\n<!-- IRB_Paginator end -->\n";
}
else
{
return '';
}
....
Если вдруг выяснится, что я все правильно сделал, может имеет смысл исправить его в курсах.
Спустя 2 часа, 50 минут, 24 секунды (19.03.2011 - 20:53) twin написал(а):
Спасибо, конечно посмотрю.
Ну а вообще конечно здорово, что каждый подстраивает класс под себя
Долой инкапсуляцию! Терпеть не могу эту гадость.
Ну а вообще конечно здорово, что каждый подстраивает класс под себя
Долой инкапсуляцию! Терпеть не могу эту гадость.
Спустя 1 час, 2 минуты, 51 секунда (19.03.2011 - 21:55) gidrosoldat написал(а):
хмм, все намного проще - никакой дополнительной переменной не надо.
в конец createMenu() ставиться:
в конец createMenu() ставиться:
if($count > 1)
{
return $menu ."\n\n<!-- IRB_Paginator end -->\n";
}
else
{
return '';
}