Полезные статьи о разработке сайтов от вебмастера
Категория:
Довольно популярным и распространенным фреймворком с исходным кодом является CodeIgniter. Он использует, так называемую, модель MVC (Model-View-Controller, Модель-Отображение-Управляющий контроллер) с помощью которой можно отделить графическое отображение веб-проекта от логики обработки. Кстати
Ну и качать сам CodeIgniter необходимо с официального сайта –
В одном из проектов мне понадобилось организовать постраничную навигацию. Для этих целей у CI имеется специальная библиотека system/libraries/Pagination.php, которая во много раз ускоряет создания пагинации.
Итак допустим требуется создать страничную навигацию для новостей.
И хотим, чтобы новость была доступна по ссылке www.ваш_сайт.ru/news/mynews, а страницы были бы www.ваш_сайт.ru/news/page/4/.
Тогда мы создаём:
Воспользуемся приёмом при котором обработка всех сегментов осуществляется в методе 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-ая страница) и т.д.
Вот собственно и всё
Кстати, очень интересно:
Данный блог создан с целью помочь, как начинающему вебмастеру, так и опытному разработчику, в решении проблем возникающих при разработке сайтов. Здесь Вы прочитаете полезные статьи о том, как грамотно произвести SEO оптимизацию своего сайта, и найдёте важные исследования в сфере интернет-маркетинга. Научитесь писать собственные компоненты и модули для известных CMS, а также узнаете интересные методы работы с Фреймворками, CSS, HTML, jQuery и PHP. Из записей блога вы поймёте как грамотно разрабатывать макеты сайтов и что такое валидная вёрстка. БЛОГZOR – поможет Вам стать web-Гуру и понять тонкости веб-мастеринга.
Комментариев к записи: 2
Виталий
11 Сентябрь 2011 в 1:11 дп
Спасибо, статья очень помогла.
Kraven
27 Март 2012 в 8:37 пп
Подскажите пожалуста имеется такая проблема:
Имеется таблица новостией и каждая новость относится к определенной категории, к примеру События в Мире, Наука и так далее.
За вывод всех новостей отвечает функция index и соответственно пагинация в ней нормально работает и есть функция category ($id). В ней как указано передается id категории, но вот именно в этой функции нормально неработает пагинация выводит первый список новостей выбранной категории а дальше когда листаешь страницы параметр теряется и она может вывести на следующей странице другую категории. Как это исправить ?