В данном уроке мы с вами поговорим о модуле формирования постраничных ссылок — так называемом пагинаторе. Вместе с Коханой данный модуль не идет, но проблем с его нахождением на просторах интернета не возникает. До этого я пользовался своим пагинатором, но он несколько кривоват и недоделан (хотя стоит на паре моих сайтов и даже работает). А недавно мне понадобилось установить пагинатор на очередной разрабатываемый на Кохане сайт и я подумал, почему бы не совместить приятное с полезным, — поковырять полуофициальный модуль пагинации и заодно написать по нему урок. Потому что, несмотря на простоту нахождения пагинатора, не факт, что вам попадется новая версия и вот тогда сразу возникнут проблемы с совместимостью и прийдется применять напильник. Поэтому не мучайтесь и скачайте модуль, абсолютно точно работающий на Kohana v3.2
Как вы помните, все модули мы размещаем в папке modules и этот не станет исключением, поэтому распакуйте его к остальным модулям. Далее рекомендуется скопировать файл конфигурации config.php из modules/pagination/config в /application/config/, чтобы все изменения производить непосредственно в папке нашего проекта, но это в принципе необязательно, так как их можно делать и при создании объекта.
В конфигурационном файле лежит такой вот массив с параметрами:
return array( // Application defaults 'default' => array( 'current_page' => array('source' => 'query_string', 'key' => 'page'), // source: "query_string" or "route" 'total_items' => 0, 'items_per_page' => 10, 'view' => 'pagination/basic', 'auto_hide' => TRUE, 'first_page_in_url' => FALSE, ), );
Давайте рассмотрим их:
current_page — этот параметр также содержит массив, в котором source отвечает за формирование адреса («query_string» — будет с гет-параметрами, а «route» — с mod rewrite), а key — это название параметра в роуте;
total_items — общее количество элементов (статей, изображений итд), которые мы будем разбивать на страницы. Стоит 0, но необходимо поменять;
items_per_page — количество элементов на странице (по умолчанию 10);
view — шаблон пагинатора. В комплектации идет два шаблона. Простой и посложнее. Я пользуюсь вторым;
auto_hide — если стоит «true», то при количестве страниц меньше двух пагинатор выводиться не будет;
first_page_in_url — если стоит «true», то добавляет единицу к адресу первой страницы.
Поменяйте данный массив на такой:
return array( // Application defaults 'default' => array( 'current_page' => array('source' => 'route', 'key' => 'page'), // source: "query_string" or "route" 'total_items' => 0, 'items_per_page' => 10, 'view' => 'pagination/floating', 'auto_hide' => TRUE, 'first_page_in_url' => FALSE, ), );
Следующее, что мы делаем — это включаем данный модуль в bootstrap.php, т.е. просто дописываем к списку модулей следующую строку:
'pagination' => MODPATH.'pagination', // Pagination
Там же в bootstrap.php посмотрите, чтобы параметр в роуте, отвечающем за страницу с пагинацией, назывался page. У меня таких вариаций страниц оказалось целых две. Допустим, страница вида www.site.ru/category/3 выводит третью страницу из списка всех категорий товаров, а страница www.site.ru/category/1-computers/3 выводит уже третью страницу категории «Компьютеры». Мне пришлось написать два роута:
Route::set('allcategory', 'category(/<page>)', array('page' => '[0-9]+')) ->defaults(array( 'controller' => 'category', 'action' => 'index', )); Route::set('category', 'category(/<id>-<catname>(/<page>))', array('id' => '[0-9]+'), array('page' => '[0-9]+')) ->defaults(array( 'controller' => 'category', 'action' => 'index', ));
Вообщем-то оно даже работает и работает правильно. Но если кто знает способ лучше, милости просим в комментарии.
Итак, все подготовительные работы закончены. Осталось только вывести наш пагинатор. Делается это очень просто. Все, что нужно знать — общее количество элементов. Так как это уже не тема данного урока, то предположим, что у нас 100 статей. Тогда в контроллере просто создаете объект и передаете ему этот параметр следующим образом:
$total_items = 100; //Это вы как будто посчитали количество элементов $content->pagination = Pagination::factory(array('total_items' => $total_items));
Естественно здесь же можно поменять и другие параметры. Теперь осталось только в шаблоне в нужном месте написать:
<?php echo $pagination; ?>
И вы получите свой пагинатор. Не забудьте только приукрасить его в шаблоне, а то там все на английском. Должно у вас получиться что-то подобное Этому (пагинатор кликабелен). Удачи!
Пожалуйста, зарегистрируйтесь для комментирования.
Если кому интересно посмотреть пагинацию в бою. Милости прошу на http://getwall.ru/.
Сайт построен на Kohana 3.2
Будут какие либо вопросы по реализации каких либо функций, задавайте.
Kohana_Exception [ 0 ]: Username fields not set in config/ulogin.php
Не смог авторизоваться с ВК)
Подскажите пожалуйста, пагинация вполне нормально выводится разбивается на страницы и тд, но все ссылки ведут на главную страницу.
вот роут
Route::set(‘admin’, ‘admin(/(/(/)(/)))’)
->defaults(array(
‘directory’ => ‘admin’,
‘controller’ => ‘News’,
‘action’ => ‘index’,
‘page’=>1,
));
Конфиг
‘default’ => array(
‘current_page’ => array(‘source’ => ‘route’, ‘key’ => ‘page’), // source: «query_string» or «route»
‘total_items’ => 0,
‘items_per_page’ => 1,
‘view’ => ‘pagination/basic’,
‘auto_hide’ => FALSE,
‘first_page_in_url’ => FALSE,
Контроллер
$count= ORM::factory(‘new’)->count_all();
$pagination= Pagination::factory(array (‘total_items’=>$count )); $news=ORM::factory(‘new’)->limit($pagination->items_per_page)->offset($pagination->offset)->find_all();
Причом если прописать в адресной строке в ручную то всё норм робит
пожалуйста напишите еще раз код на форуме. тут всю самую важную информацию по роуту порезало.
а параметры роута указывать не пытались? или хоть почитать как работает модуль или глянуть код самого пагинатора и разобраться как он работает.
$pagination = Pagination::factory(array (
‘total_items’ => $users->count_all(),
))->route_params(array (
‘controller’ => $this->request->controller(),
‘action’ => $this->request->action(),
));
Спасибо, помог:)
А ссылочки на гитхаб, на рабочий пагинатор нету случайно?
https://github.com/kloopko/kohana-pagination
а что, этот нерабочий ? в трех проектах использую и не знал )
у меня идет вот такая ссылка «/exchange/sub_cat/1/page/2″ а на 2ю страницу не переходит, а вот по такой ссылке «/exchange/sub_cat/1/page/2page/2″ переходит на 2ю вот мой роут «Route::set(‘default’, ‘((/(/(/)(/))))(/page)(/)’, array(‘overflow’ => ‘.*?’,'page’=>’[0-9]+’))» подскажите что не правильно! А если я перехожу не посредственно в контроллер то есть «/admin/exchange_sub/page/4″ то вообще не работает!
Используйте тег pre для вывода кода здесь или лучше пишите на форуме. А то все угловые скобки порезало у роута
Подскажите пожалуйста, пагинатор нормально выводится но как прикрутить его к выводу например уроков с базы.А то у меня оно чего то не связалось запрос не получается сделать
У вас есть номер страницы и количество выводимых уроков на странице (вы его задаете сами). Теперь просто выводите количество записей из базы в зависимости от этих величин. Допустим количество записей на страницу — 10. Т.е. для первой страницы это будут уроки с 1 по 10, для второй с 11 по 20 итд.
Сразу возникли проблемы с этим плагином, но в итоге благодаря админу все разрешилось.
Плагином доволен)
Привет. Столкнулся с проблемой в роутах. Пагинатор прикручиваю к индексной странице. В роутах:
В контроллере:
Когда ввожу урл вида http://site.ru/page-1 — то всё работает на ура. Но с индексной страницы ссылки ведут в никуда. Т.е. a href=». Я догадываюсь что я что я где-то не передаю параметр page, но где?
Это
зачем ?
Согласен, незачем. Убрал, но результата не дало.
Читали верхний комментарий ? У человека схожая проблема.
—
Подскажите пожалуйста, пагинация вполне нормально выводится разбивается на страницы и тд, но все ссылки ведут на главную страницу.
—
Читал. Пробовал добавить в контроллер, как было описано выше:
Урлы у ссылок пагинатора появились, но теперь все ведут на http://test1.ru/page/index
Ошибка закралась в роуте. Надо было сделать необязательным параметр .
Теперь роут выглядит так:
у меня похожая проблема с отображением пустых ссылок. помогите пожалуйста решить её или хотя бы понять в чем проблема.
вот что у меня в бутстрапе:
Route::set(‘news’, ‘news(/(/))’, array(‘page’ => ‘[0-9]+’))
->defaults(array(
‘directory’ => ‘index’,
‘controller’ => ‘news’,
‘action’ => ‘index’,
));
вот что в контроллере:
public function action_index()
{
$news = ORM::factory(‘news’)
->order_by(‘date’, ‘DESC’)
->find_all();
if( ! $news)
{
$errors=»Не найдено новостей»;
}
$total_items = ORM::factory(‘news’)
->count_all();
//$pagination = Pagination::factory(array(‘total_items’ => $total_items));
$pagination = Pagination::factory(array(‘total_items’ => $total_items))
->route_params(array (
‘controller’ => ‘news’,
‘action’ => ‘index’,
‘directory’ => ‘index’
));
$content = View::factory(‘index/v_news’)
->bind(‘news’, $news)
->bind(‘pagination’, $pagination)
->bind(‘errors’, $errors);
$total_items = 100;
$this->template->main = array($content);
}
проблема в том, что хотя пагинатор и разбивает страницы на группы, но все ссылки выглядят так:
test1.ru/kohana_SADIK/index/news/index
если ручками прописываю в адресной строке:
test1.ru/kohana_SADIK/index/news/index/page2
то попадаю на страницу с ошибкой 404
вот конфиг:
return array(
// Application defaults
‘default’ => array(
‘current_page’ => array(‘source’ => ‘route’, ‘key’ => ‘page’), // source: «query_string» or «route»
‘total_items’ => 0,
‘items_per_page’ => 3,
‘view’ => ‘pagination/floating’,
‘auto_hide’ => TRUE,
‘first_page_in_url’ => FALSE,
),
);
скиньте, пожалуйста, пример с работающим пагинатором
на zema9003@ro.ru
пожалуйста, а то не выходит что-то
http://kohanaframework.su/data/test_site.zip
Это тот, что лежит на http://kohanaframework.su/kohana/