Урок 6 — Постраничная навигация. Класс Pagination.

Начинаем разбирать классы фреймворка Codeigniter 2.1.0. И начнем с разбора класса под названием Pagination, или постраничная навигация.

Данный класс позволяет создавать постраничную навигацию на Вашем сайте для удобства пользователей. Делается это очень просто.

Выставляйте качество 480р.

На прошлом уроке мы закончили базовые понятия фреймворка и последним уроком был урок про добавление, редактирование и удаление записей в БД. Пора приступить к более серьезным вещам 😉

Для того чтобы создать постраничную навигацию, нам нужно сначала загрузить библиотеку Pagination. Далее нам требуется создать массив с необходимыми настройками и потом вызвать функцию, которая и создаст все необходимое, и передать в нее эти настройки.

Если Вы работаете по прошлым урокам, то я буду это описывать на примере тех контроллеров и моделей, тогда просто повторяйте за мной. Если же нет, тогда сами работайте со своими моделями, видами и контроллерами.

Открываем контроллер first и у нас там есть функция articles, которая выводит все статьи. Давайте сделаем здесь постраничную навигацию — разделим этот вид на страницы.

Для начала зайдем в папку application->config и откроем файл autoload. Пропишим там следующее:

$autoload['libraries'] = array('database','pagination');

Мы поставили библиотеку Pagination на автозагрузку.
Теперь давайте перейдем к контроллеру и создадим массив с настройками:

$config['base_url'] = 'http://localhost/index.php/first/articles/'; // адрес где происходит построение навигации
$config['total_rows'] = $this->db->count_all('articles'); // сколько всего записей в этой таблице, откуда будем брать записи. Используем данную функцию для подсчета всех записей.
$config['per_page'] = 5; // сколько записей показывать на странице
$config['full_tag_open'] = '<p>';  // тег открытия навигации
$config['full_tag_close'] = '</p>'; // тег закрытия навигации

$this->pagination->initialize($config); // инициализируем навигацию с нашими настройками.

Можно придать класс или идентификатор тегам в которых Вы хотите оборачивать саму навигацию и изменять внешний вид используя CSS. Это самое необходимое для создания навигации. Полный список настроек можете посмотреть на официальном сайте перейдя в их документацию.

Теперь нам нужно загрузить нашу модель, которая собственно работает с функцией вывода записей. Далее вызвать эту функцию и передать в нее пару параметров. Ну и напоследок загрузить вид.
Вот такой у нас контроллер и функция articles:

function articles()
{
    $config['base_url'] = 'http://localhost/index.php/first/articles/';
    $config['total_rows'] = $this->db->count_all('articles');
    $config['per_page'] = 5;
    $config['full_tag_open'] = '<p>';
    $config['full_tag_close'] = '</p>';

    $this->pagination->initialize($config);

    $this->load->model('articles_model');
    $data['articles'] = $this->articles_model->get_articles($config['per_page'],$this->uri->segment(3));
    $this->load->view('articles_view', $data);
}

Тут уже по идее должно быть все ясно, если проходили прошлые уроки, а если не проходили, то Вам тут еще рано находится :)
Что же за параметры мы передали нашей функции?

  • Первый — это кол-во записей на странице
  • Второй — формирование URL строки.

Второй поподробнее объясню чуть позже. Давайте закончим с навигацией.
Теперь переходим в нашу модель articles_model и в функции get_articles делаем небольшие изменения.

Принимаем эти параметры и подставляем в нужное место:

function get_articles($num, $offset)
{
    $this->db->order_by('id','desc');
    $query = $this->db->get('articles',$num, $offset);
    return $query->result_array();
}

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

Пишем строку:

<?=$this->pagination->create_links();?>

Ну вот, если Вы все сделали правильно, то навигация у Вас должна появиться.

Как и обещал про второй параметр по подробнее. Если у Вас навигация работает то обратите внимание как формируется URL строка. В моем случае это так:

http://localhost/cilessons/index.php/first/articles/5

То есть к нашей строке прибавился еще один параметр, так называемый сегмент и его номер 3.

  • first — первый сегмент УРЛ строки
  • articles — второй сегмент УРЛ строки
  • 5 — третий сегмент УРЛ строки

Так как у нас формируется третий сегмент УРЛ строки при переходе по страницам, мы с Вами и писали строку:

$this->uri->segment(3);

Вот так :)

Надеюсь у Вас все получилось. Потренируйтесь, поиспользуйте различные настройки из документации и экспериментируйте. Главное не боятся, ничего страшного не произойдет, максимум покажет ошибку, а на ошибках мы учимся :)

Если урок Вам был полезен, нажмите на любую кнопку ниже — буду благодарен :) Всем удачи и следите за ходом событий ;)

Комменты

  • Вернее непереходит — преходит по страницам но выводит первую и в постраничке не меняется страница

    • Pagination отвечает только за генерацию ссылок, данные вы получаете из модели. Поэтому, если у кого-то такая же беда, проверяйте как вызываете модель в контроллере и код самой модели. Если вывод все записи значит не задал лимит при запросе к БД.

  • Подскажите — при переходе неработает , в ройте так написал $route[‘blog/(:any)’] = «blog/index/$1″;

  • Люди добрые помогите найти проблему! Вроде правильно сделал пагинацию, но не совсем. При отображении всех товаров на сайте все работает отлично, а вот когда выбираю конкретную категорию товаров — не совсем правильно. При переходе по страницам в конкретной категории — товар меняется, а номера страниц стоят на месте без сдвигов.
    Вот код контроллера goods.php
    class Goods extends CI_Controller {

    function index()
    {
    $config[‘base_url’] = base_url().’index.php/goods/index/';
    $config[‘total_rows’] = $this->db->count_all(‘goods’);
    $config[‘per_page’] = 1;
    $config[‘first_link’] = ‘Первая';
    $config[‘last_link’] = ‘Последняя';
    $this->pagination->initialize($config);

    $this->load->model(‘goods_model’);
    $data[‘pages’] = $this->pages_model->get_pages();
    $data[‘pages_info’] = $this->pages_model->get_pages_info(‘goods’);
    $data[‘categories’] = $this->pages_model->get_cat();
    $data[‘goods’] = $this->goods_model->get_all_goods($config[‘per_page’], $this->uri->segment(3));
    $data[‘latest_goods’] = $this->pages_model->get_latest_goods();
    $name = ‘goods';
    $this->template->page_view($data, $name);
    }

    function view($cat)
    {
    $config[‘base_url’] = base_url().’index.php/goods/view/’.$cat.’/index//';
    $rows = $this->db->query(‘SELECT * FROM goods WHERE category =»‘.$cat.'»‘);
    $config[‘total_rows’] = $rows->num_rows();
    $config[‘per_page’] = 1;
    $config[‘first_link’] = ‘Первая';
    $config[‘last_link’] = ‘Последняя';

    $this->pagination->initialize($config);

    $this->load->model(‘goods_model’);
    $data[‘pages’] = $this->pages_model->get_pages();
    $data[‘pages_info’] = $this->pages_model->get_pages_info(‘goods’);
    $data[‘categories’] = $this->pages_model->get_cat();
    $data[‘goods’] = $this->goods_model->get_goods_by_cat($cat, $config[‘per_page’], $this->uri->segment(5));
    $name = ‘goods';
    $this->template->page_view($data, $name);
    }

    }

    Код модели goods_model.php
    class Goods_model extends CI_Model {

    function get_all_goods($num, $offset)
    {
    $query = $this->db->get(‘goods’, $num, $offset);
    return $query->result_array();
    }

    function get_piece_goods($title)
    {
    $this->db->where(‘title_en’, $title);
    $query = $this->db->get(‘goods’);
    return $query->row_array();
    }

    function get_goods_by_cat($cat, $num, $offset)
    {
    $this->db->where(‘category’, $cat);
    $query = $this->db->get(‘goods’, $num, $offset);
    return $query->result_array();
    }
    }

    Код вьюшки goods_view.php

    <a href="index.php/piece_goods/»><img src="images/product/» alt=»Product 01″ />

    $ 100
    В корзину

    pagination->create_links();?>

    Библиотека пагинации подключена в автозагрузке.

  • Здравствуйте. Спасибо за статью.
    Все отлично работает, но как только начинаю использовать routing в списке страниц навигации активная страница перестала выделяться, отключаю routing — все норм. Не могу понять, в чем проблема.
    Default: site/main/index/page_num
    Routing: $route[‘page/(:num)’] = ‘main/index/$1′;

    index.php отключил используя htaccess + mod rewrite

  • всегда одно и тоже показывает. что делать ?

  • Сделал, но не работает почему-то.
    Ссылки на страницы формируются правильно:
    page/5
    page/10
    page/15 и т.д.
    Но при переходе не них — Page Not Found…

  • Сколько не мучаюсь, но никак не получается сделать пагинацию в категориях. Не во всех статьях, а еще и в категориях. Если кто-то может помочь, или знает где можно найти урок на данную тему отпишите пожалуйста.

  • Забыл указать как формируется ссылка в админке:
    http://page.ru/admin/news/all/1

    где admin — папка с контроллерами для админка
    news — котроллер
    all — функция показа всех новостей в контроллере news

  • Дмитрий, у меня возник вопрос. Использую Ваш метод для пагинации на странице новостей, путь ссылки такой http://page.ru/pages/news/1 (тут все работает), но у меня есть админка, в которой так же пытаюсь сделать пагинацию. В routes.php для папки controllers/admin прописал это:
    $route[‘admin/login’] = ‘admin/lunit/login';
    $route[‘admin/logout’] = ‘admin/lunit/logout';
    в адмике пагинация впринципе работает, выводятся ссылки на странички и выводится по 5 элементов на страницу. Проблема в том, что при клике на нумерацию страницы 2 из 12345 данные меняются но 2 не становится активной…. нажимаю 3 данные оботразились но 3 не активна, а у меня много должно быть страниц, но они не активны при клике и не прибавляются. в чем может быть проблема?

    • Дмитрий
      $config[‘total_rows’] = $total;
      $config[‘uri_segment’] = 4;
      $config[‘per_page’] = ’16′;
      $config[‘num_links’] = ‘4’;
      $config[‘next_link’] = ‘>';
      $config[‘prev_link’] = ‘<';
      В контролере в этом списке обязательно укажи $config['uri_segment'] = 4;
      У меня после этого все заработало. Удачи.

  • Всё отлично работает — если руки из жопы или проблемы с сервером, хостингом —- чо человеку мозги парите.

    Я раньше сам писал фреймворк — блин —- а тут накопал — и оказалось что я писал то же самое —

    Но когда пишет один человек и бригады разработчиков….

    За пару дней по инструкциям не поймешь чо куда — а тут теже примеры что и в документации но визуально.

    http://onepage.tk или в скором времени http://web-seos.ru

    Там чисто на codeinteger практикуюсь.

    В результате: Многосайтовый портал — с кабинетом где все сайтами можно управлять — всмысле у каждого пользователя своих кучи сайтов..

    Ну и расширяю. Там 4 фреймворка — хотя я кодеинтеджер увидел в работе только неделю назад.

  • Здраствуйте, Дмитрий.Как можно этот класс pagination встроит на php сайт.Как обьединить класс pagination и php, чтобы постраничная навигация работала.

  • Здравствуйте подскажите пожалуйста у меня к вам вопрос,решил заняться изучением фреймворка Codeignaiter скачал с официального сайта установил на локальный веб-сервер Denwer запросил в браузере пишет Welcom to Codeignaiter но когда создал в PHP-Designer файл с данными и попробовал вывести его содержимое в браузере выдает следующий ответ
    Fatal error : Class ‘Controller’ not found in Z:\home\basicci.ru\www\system\application\controllers\pages1.php on line 4,может быть вы поможете мне разобраться в чем причина.Спасибо.И есть ли у вас отдельные курсы по фреймворкам?Спасибо.

    • Дмитрий Валак: 04-11-2013 в 17:45

      Здравствуйте. Видимо Вы что-то сделали не так с названием файла и самого класса. Оно должно быть одинаковым.
      Т.е. файл pages1.php, в самом контроллере пишем Class Pages1. Курсы есть, большой и подробный, но он платный: http://2develop.ru/webmaster/

  • Здраствуйте, Дмитрий.Куда нужно вставить папку pagination, делаю сайт на чистом php, если я не буду использовать Codigniter.Можно ли так сделать, подскажите пожалуйста?

  • ДМИТРИЙ вы Моя последняя надежда. Не работает почемуто с параметром. Вот код:

    class Test extends CI_Controller { //Название контролера

    function test_test(){ //Название функции
    $this->load->model(‘cat_model’); // Подключаю модель, там только одна функция для выбора товара
    $config[‘base_url’] = base_url().’index.php/test/test_test/’.$title_en; // Это мой путь где $title_en это наименование категории для товара
    $res = mysql_query(‘SELECT COUNT(*) FROM products WHERE category =»‘.$title_en.'»‘);
    $row = mysql_fetch_row($res);
    $total = $row[0]; // всего записей
    $config[‘total_rows’] = $total; // Этим запросом вывожу общее кол-во товаров в таблице products
    $config[‘per_page’] = 5; //количество выводимых записей

    $this->pagination->initialize($config);// Инициализация модуля
    $data[‘products’]= $this->cat_model->get_cat_products($title_en,$config[‘per_page’],$this->uri->segment(4)); // передаю нужные параметры для выборки из баззы
    $this->load->view(‘test_view’,$data);// Загружаю вид
    }

    }

    модель
    function get_cat_products($num,$offset,$title_en){
    $this->db->where(‘category’,$title_en);
    $query=$this->db->get(‘products’,$num,$offset);
    return $query->result_array();

    }

    Вид:

    pagination->create_links();?>

    Без параметра работает все ок , с параметром не работает. ПОЖАЛУЙСТА ПОМОГИТЕ ДМИТРИЙ.
    Вот Ссылка на пример по работе:
    http://eago.kz/index.php/test/test_test/dushevye_kabiny/

    • Дмитрий Валак: 18-10-2013 в 9:21

      Здравствуйте. На примере все работает. В чем проблема то? С каким параметром не работает?

  • Здраствуйте, Дмитрий!
    Как можно сделать постраничную навигацию видеороликам в главной странице сайта, есть ли решение для этого?.

    • Дмитрий Валак: 13-10-2013 в 1:07

      Здравствуйте. А какая разница страница с новостями, видео или еще чем-то? Процесс идентичен

  • Здравствуйте.
    Объясните пожалуйста как ваш вариант Постраничной навигации привязать к категориям, вы объясняете только как вывести все записи, а как выводить по категориям? Если бы вы сделали такой урок он был бы полезен для многих начинающих или хотя бы какое то разъяснение.

  • Здравствуйте.
    После добавления статей больше 10 листалка перестает быть видна в функции cat а видно ее только в index если все настройки перенести в функцию cat ее видно но она не работает, что можно сделать?

  • Здравствуйте. А можно ссылку на сайт с документацией по Codeignter

  • хотел задать Вам вопрос, как можно сделать в меню чтоб подсвечивался активный пункт меню? если можно участо кода привести ка кпример буду благодарен

  • Сдела все как в уроке.
    Получется нумерация страниц
    page/5
    page/10
    page/15 и т.д. 
    а хочется чтобы страницы нумеровались по порядку 1,2,3 и т.д.

  • На странице появилась навигация, но она не работает. Переходит на страницу денвера (Ура заработало). в месте с навигацией выводятся все статьи и ошибки php. из за того что функция get_articles в контроллере вызывается без параметров. если прописать числа то страница открывается без ошибок но навигация не работает. как заставить работать?

    • Дмитрий Валак: 29-10-2012 в 9:39

      Параметры обязательны. Там не цифры нужны, а параметр с настройкой $config[‘per_page’] и второй параметр uri сегмент

  •  
    При помощи вашего примера я смог создать просто вывод всех новостей из таблицы news(у вас articles). Это отлично. Получился адрес http://сайт.ру/Index.php/news/
    А как реализовать, чтобы если обращение к url было бы такое — http://сайт.ру/Index.php/news/crime/ , где crime — название категории, имеющая category_id=1, выводились новости только из этой категории?
    И последний вопрос) как должен выглядеть контроллер, который будет выводить единственную новость, например при обращении по такому адресу — http://сайт.ру/Index.php/news/crime/1 , где 1 — id новости в таблице news, а crime — название категории, имеющая category_id=1.

    • Дмитрий Валак: 10-06-2012 в 12:50

      Ну в данном случае crime — идет как параметр к вашей функции контроллера news, задаете условие — если существует этот параметр, то считаете сколько записей в базе с данной категорией, формируете УРЛ $config[‘base_url’] = base_url().’index.php/news/’.$cat;
      В принципе все тоже самое только добавить условие и сделать соответствующие настройки.

      Ну и на последний вопрос, тут в принципе можно поступить так же, id конкретной новости поступает как 3-ий параметр к вашей функции контроллера, следовательно ставим условие, если существует $id (например), тогда вызывает функцию, которая выберет из базы информацию о статье с id=1.

      Надеюсь смог помочь :)

      Ну а так вообще вариантов реализации масса, нет какого-то конкретного решения :)

      • Так с выводом статей из одной категории получилось, вот вид контроллера.
         
        public function index($category_name)
        {
        if ( isset($category_name) )
        {
        $config['base_url'] = site_url().'index.php/news/'.$category_name;
        $rows = count($this->db->query('SELECT * FROM news WHERE category_name ="'.$category_name.'"'));
        $config['total_rows'] = $rows;
        $config['per_page'] = 1;
        $config['full_tag_open'] = '<p>';
        $config['full_tag_close'] = '</p>';

        $this->pagination->initialize($config);
        $this->load->model('news_model');
        $data['articles'] = $this->news_model->get_articles_by_cat($config['per_page'], $this->uri->segment(2), $category_name);
        $this->load->view('articles_view', $data);
        }
        else
        {
        $this->load->library('pagination');
        $config['base_url'] = site_url().'/news/';
        $config['total_rows'] = $this->db->count_all('news');
        $config['per_page'] = 1;
        $config['full_tag_open'] = '<p>';
        $config['full_tag_close'] = '</p>';

        $this->pagination->initialize($config);
        $this->load->model('news_model');
        $data['articles'] = $this->news_model->get_articles($config['per_page'], $this->uri->segment(2));
        $this->load->view('articles_view', $data);
        }
         
        Вид модели:
         
        function get_articles($num, $offset)
        {
        $this->db->order_by('id');
        $query = $this->db->get('news',$num, $offset);
        return $query->result_array();
        }
        function get_articles_by_cat($num, $offset, $category_name)
        {
        $this->db->order_by('id');
        $query = $this->db->get_where('news', array('category_name' => $category_name), $num, $offset);
        return $query->result_array();
        }
         
        Все получилось. Но один вопрос, чтобы получить новости из категории путь получается http://megatxt.ru:81/index.php/news/INDEX/crime  как убрать название функции INDEX ? Т.е. сделать так http://megatxt.ru:81/index.php/news/crime

        • Дмитрий Валак: 11-06-2012 в 5:18

          Попробуйте так:
          зайдите в config->routes.php

          И напишите там:
          $route[‘news/(:any)’] = ‘news/index/$1′;