Постраничная навигация в CodeIgniter

Категория: Веб-программирование| Полезные заметки

20 Авг 2011

Довольно популярным и распространенным фреймворком с исходным кодом является CodeIgniter. Он использует, так называемую, модель MVC (Model-View-Controller, Модель-Отображение-Управляющий контроллер) с помощью которой можно отделить графическое отображение веб-проекта от логики обработки. Кстати здесь можно найти довольно хорошую инструкцию по установке. А по этим ссылкам можно ознакомится с русской документацией по CI и английской соответственно.

Ну и качать сам CodeIgniter необходимо с официального сайта – Download CI. На момент написания статьи, последней версией является 2.0.2.

В одном из проектов мне понадобилось организовать постраничную навигацию. Для этих целей у CI имеется специальная библиотека system/libraries/Pagination.php, которая во много раз ускоряет создания пагинации.

Итак допустим требуется создать страничную навигацию для новостей.
И хотим, чтобы новость была доступна по ссылке www.ваш_сайт.ru/news/mynews, а страницы были бы www.ваш_сайт.ru/news/page/4/.

Тогда мы создаём:

  • Модель application/models/newsmodel.php
  • Отобржение application/views/news.php
  • Контроллер application/controllers/news.php

Воспользуемся приёмом при котором обработка всех сегментов осуществляется в методе index() контроллера News (application/controllers/news.php). Для этого в файле application/config/routes.php после

$route['404_override'] = '';

добавляем строку

$route['news/(:any)'] = "news/index/$1";

Теперь начинаем заниматься пагинацией. В файле контроллера application/controllers/news.php, главный метод описываем следующим способом:

public function index(){
    if(($this->uri->segment(2)!='page')&&($this->uri->segment(2)!='')){
        $this->_news($this->uri->segment(2));
    } else {
        if($this->uri->segment(3)=='')
            $this->page(0);
        else
            $this->page($this->uri->segment(3));
    }
}

где функция _news() это функция для отображения полной новости, в общем случае:

function _news($url){
   /* обработка и получение данных для вывода в отображение в массив $data */
   $data[newstitle] = $title;
   $data[newstext] = $text;
   $this->load->view('shownews',$data);
}

А функция page() – функция обрабатывающая страницы. На ней мы и остановимся подробнее. В общем случае, она должна выглядеть так:

function page($page = null){
        if(isset($page)){
            /* Настраиваем сколько новостей нужно выводить на одной странице */
            $per_page = 10;
            /* Будем при любом раскладе начинать с 0 страницы */
            if ($page < 0)
                $page = 0;
           /* Загржаем модель */
            $this->load->model('newsmodel');
            /* Берём из базы данных новости для отображения только для текущей страницы*/
            $data['items'] = $this->newsmodel->item_array($page, $per_page);
            /* Если новостей для указанной страницы нет, то сорри-сорри */
            if(empty($data['items']))
                show_404();
            /* Загржаем библиотекй CI для пейджинга */
            $this->load->library('pagination');
            /* Настраиваем библиотеку под наши запросы */
            $config['base_url'] = '/news/page/';
            $config['first_url'] = '/news/';
            $config['total_rows'] = $this->newsmodel->all_items();
            $config['per_page'] = $per_page;
            /* Загружаем наши настройки */
            $this->pagination->initialize($config);
            /* Передаем отображение страниц в массив для отображения */
            $data['pages'] = $this->pagination->create_links();
            /* Загружаем отображение новостей */
            $this->load->view('news', $data);
        } else {
            redirect('/news/');
        }
}

Переходим к созданию модели, которую мы используем в контроллере.
Файл application/models/newsmodel.php должен выглядеть слеудующим образом:

<?php
class Newsmodel extends CI_Model {
    function __construct()
    {
        /* Вызываем конструктор модели */
        parent::__construct();
    }
    /* Выбираем из базы данных нужное количество новостей */
    function item_array($page, $per_page) {
        $this->db->order_by('id');
        $this->db->limit($per_page, $page);
        $query = $this->db->get('news');
        return $query->result_array();
    }
    /* Считаем  сколько всего новостей в базе данных */
    function all_items() {
        $this->db->from('news');
        return $this->db->count_all_results();
    }
}
?>

Собственно всё готово, осталось только сделать отображение.
Самый общий вид application/views/news.php :

<html>
    <head>
		<title>Новости</title>
    </head>
    <body>
        <p>Новости</p>
        <div class="news_content">
            <?php foreach($items as $item):?>
        		<p class="title_news"><a href="/news/<?=$item['news_url'])?>"><?=$item['news_name']?></a></p>
        		<p class="date"><?=$item['news_date']?></p>
                <div class="g-content">
                    <?=$item['news_sort_text']?>
        		</div>
             <?php endforeach;?>
        </div>
        <div id="pagination"><?=$pages?></div>
    </body>
</html>

Важно! Библиотека Pagination возвращает страницы вида page/16/ где 16 это номер записи с которой следует начать выбор из БД. То есть будет не page/1/ , page/2/ , page/3/ , а ,например, при размещении на странице по 10 новостей, будет page/10/ (1-ая страница) , page/20/ (2-ая страница) , page/30/ (3-ая страница) и т.д.

Вот собственно и всё :)

Кстати, очень интересно:

Опубликовать в twitter.com Опубликовать в своем блоге livejournal.com Поделится ссылкой на yandex.ru

Комментариев к записи: 2

Виталий

11 Сентябрь 2011 в 1:11 дп

Спасибо, статья очень помогла.

Kraven

27 Март 2012 в 8:37 пп

Подскажите пожалуста имеется такая проблема:
Имеется таблица новостией и каждая новость относится к определенной категории, к примеру События в Мире, Наука и так далее.
За вывод всех новостей отвечает функция index и соответственно пагинация в ней нормально работает и есть функция category ($id). В ней как указано передается id категории, но вот именно в этой функции нормально неработает пагинация выводит первый список новостей выбранной категории а дальше когда листаешь страницы параметр теряется и она может вывести на следующей странице другую категории. Как это исправить ?

Написать комментарий

Вы должны Войти, чтобы оставить комментарий.

О блоге

Данный блог создан с целью помочь, как начинающему вебмастеру, так и опытному разработчику, в решении проблем возникающих при разработке сайтов. Здесь Вы прочитаете полезные статьи о том, как грамотно произвести SEO оптимизацию своего сайта, и найдёте важные исследования в сфере интернет-маркетинга. Научитесь писать собственные компоненты и модули для известных CMS, а также узнаете интересные методы работы с Фреймворками, CSS, HTML, jQuery и PHP. Из записей блога вы поймёте как грамотно разрабатывать макеты сайтов и что такое валидная вёрстка. БЛОГZOR – поможет Вам стать web-Гуру и понять тонкости веб-мастеринга.

Последние комментарии

  • Амир: форма появилась на сайте, но письмо не приходит на [...]
  • Ян: Все нравится, единственное, раскрывающийся блок мо [...]
  • СПАСИБО!: Спасибо тебе! Замечательная функция. очень помогла [...]
  • Алексей: Подскажите, а как заставить этот скрипт отработать [...]
  • Дмитрий: Заработало, надо было малость поменять путь в conf [...]

Можно Скачать