Модуль Pagination

Комментарии: 45  Просмотры: 24 701

В данном уроке мы с вами поговорим о модуле формирования постраничных ссылок — так называемом пагинаторе. Вместе с Коханой данный модуль не идет, но проблем с его нахождением на просторах интернета не возникает. До этого я пользовался своим пагинатором, но он несколько кривоват и недоделан (хотя стоит на паре моих сайтов и даже работает). А недавно мне понадобилось установить пагинатор на очередной разрабатываемый на Кохане сайт и я подумал, почему бы не совместить приятное с полезным, — поковырять полуофициальный модуль пагинации и заодно написать по нему урок. Потому что, несмотря на простоту нахождения пагинатора, не факт, что вам попадется новая версия и вот тогда сразу возникнут проблемы с совместимостью и прийдется применять напильник. Поэтому не мучайтесь и скачайте модуль, абсолютно точно работающий на 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; ?>

И вы получите свой пагинатор. Не забудьте только приукрасить его в шаблоне, а то там все на английском. Должно у вас получиться что-то подобное Этому (пагинатор кликабелен). Удачи!

Обсудить на форуме


К записи оставлено 45 коммент.

Если кому интересно посмотреть пагинацию в бою. Милости прошу на 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 итд.

Сразу возникли проблемы с этим плагином, но в итоге благодаря админу все разрешилось.
Плагином доволен)

Привет. Столкнулся с проблемой в роутах. Пагинатор прикручиваю к индексной странице. В роутах:

Route::set('pagination', 'page-', array('page' => '[0-9]+'))
    ->defaults(array(
        'controller' => 'page',
        'action'     => 'index',
        'page'=>'1',
));

В контроллере:

        $total_items = 13; //Это вы как будто посчитали количество элементов
        $content->pagination = Pagination::factory(array('total_items' => $total_items))
            ->route_params(array (
                'page' => '1',
            ))

Когда ввожу урл вида http://site.ru/page-1 — то всё работает на ура. Но с индексной страницы ссылки ведут в никуда. Т.е. a href=». Я догадываюсь что я что я где-то не передаю параметр page, но где?

Это

->route_params(array (
                'page' => '1',
            ))

зачем ?

Согласен, незачем. Убрал, но результата не дало.

Читали верхний комментарий ? У человека схожая проблема.

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

Читал. Пробовал добавить в контроллер, как было описано выше:

            ->route_params(array (
                'controller' => $this->request->controller(),
                'action' => $this->request->action(),
            ));

Урлы у ссылок пагинатора появились, но теперь все ведут на http://test1.ru/page/index

Ошибка закралась в роуте. Надо было сделать необязательным параметр .
Теперь роут выглядит так:

Route::set('pagination', '(page-)', array('page' => '[0-9]+'))
    ->defaults(array(
        'controller' => 'page',
        'action'     => 'index',
        'page'=>'1',
));

у меня похожая проблема с отображением пустых ссылок. помогите пожалуйста решить её или хотя бы понять в чем проблема.

вот что у меня в бутстрапе:
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
пожалуйста, а то не выходит что-то



Оставить комментарий или два

Пожалуйста, зарегистрируйтесь для комментирования.