Раздел новостей
В предыдущем разделе мы рассмотрели основные концепции фреймворка, написав класс, который включает статические страницы. Мы очистили URI, добавив правила пользовательской маршрутизации. Теперь настало время представить динамическое содержимое и начать использовать базу данных.
Настройка вашей модели
Вместо того, чтобы писать операции с базой данных прямо в контроллере, запросы должны быть размещены в модели, чтобы их можно было легко повторно использовать в дальнейшем. Модели — это место, где вы извлекаете, вставляете и обновляете информацию в вашей базе данных или других хранилищах данных. Они представляют ваши данные.
Откройте каталог application/models/ и создайте новый файл под названием News_model.php и добавьте следующий код. Убедитесь, что вы правильно настроили свою базу данных, как описано здесь.
<?php
class News_model extends CI_Model {
public function __construct()
{
$this->load->database();
}
}
Этот код похож на код контроллера, который использовался ранее. Он создает новую модель, расширяя CI_Model и загружает библиотеку базы данных. Это сделает класс базы данных доступным через объект $this->db.
Перед запросом к базе данных должна быть создана схема базы данных. Подключитесь к вашей базе данных и выполните приведенную ниже SQL-команду (MySQL). Также добавьте некоторые записи-затравки.
CREATE TABLE news (
id int(11) NOT NULL AUTO_INCREMENT,
title varchar(128) NOT NULL,
slug varchar(128) NOT NULL,
text text NOT NULL,
PRIMARY KEY (id),
KEY slug (slug)
);
Теперь, когда база данных и модель настроены, вам понадобится метод для получения всех наших постов из нашей базы данных. Для этого используется уровень абстракции базы данных, который входит в CodeIgniter — Построитель запросов — это позволяет писать ваши «запросы» один раз и заставлять их работать с всеми поддерживаемыми системами баз данных. Добавьте следующий код в свою модель.
public function get_news($slug = FALSE)
{
if ($slug === FALSE)
{
$query = $this->db->get('news');
return $query->result_array();
}
$query = $this->db->get_where('news', array('slug' => $slug));
return $query->row_array();
}
С помощью этого кода можно выполнить два разных запроса. Вы можете получить все записи новостей или получить новостную статью по её сленгу. Вы могли заметить, что переменная $slug не была очищена перед выполнением запроса; Построитель запросов делает это за вас.
Отображение новостей
Теперь, когда запросы написаны, модель должна быть связана с представлениями, которые будут отображать новости пользователю. Это можно сделать в нашем Pages контроллере, созданном ранее, но для ясности определяется новый News контроллер. Создайте новый контроллер в application/controllers/News.php.
<?php
class News extends CI_Controller {
public function __construct()
{
parent::__construct();
$this->load->model('news_model');
$this->load->helper('url_helper');
}
public function index()
{
$data['news'] = $this->news_model->get_news();
}
public function view($slug = NULL)
{
$data['news_item'] = $this->news_model->get_news($slug);
}
}
Глядя на код, вы можете увидеть некоторое сходство с файлами, которые мы создали ранее. Во-первых, метод __construct(): он вызывает конструктор своего родительского класса (CI_Controller) и загружает модель, чтобы она могла быть использована во всех других методах этого контроллера. Он также загружает набор функций помощника URL, потому что мы будем использовать одну из них в представлении позже.
Далее, есть два метода для просмотра всех новостных статей и один для конкретной новостной статьи. Вы можете видеть, что переменная $slug передается в метод модели во втором методе. Модель использует этот сленг для идентификации новостной статьи, которая должна быть возвращена.
Теперь данные извлекаются контроллером через нашу модель, но ничего еще не отображается. Следующим шагом является передача этих данных в представления.
public function index()
{
$data['news'] = $this->news_model->get_news();
$data['title'] = 'News archive';
$this->load->view('templates/header', $data);
$this->load->view('news/index', $data);
$this->load->view('templates/footer');
}
Код выше извлекает все записи новостей из модели и присваивает их переменной. Значение для заголовка также присваивается элементу $data['title'] и все данные передаются в представления. Теперь вам нужно создать представление для отображения новостных статей. Создайте application/views/news/index.php и добавьте следующий код.
<h2><?php echo $title; ?></h2>
<?php foreach ($news as $news_item): ?>
<h3><?php echo $news_item['title']; ?></h3>
<div class="main">
<?php echo $news_item['text']; ?>
</div>
<p><a href="<?php echo site_url('news/'.$news_item['slug']); ?>">View article</a></p>
<?php endforeach; ?>
Здесь каждый новостной элемент циклически обрабатывается и отображается пользователю. Вы можете видеть, что мы написали нашу шаблонную разметку на PHP, смешанную с HTML. Если вы предпочитаете использовать язык шаблонов, вы можете использовать класс парсера шаблонов CodeIgniter или сторонний парсер.
Страница обзора новостей теперь завершена, но страница для отображения отдельных новостных статей всё ещё отсутствует. Модель, созданная ранее, разработана таким образом, чтобы её легко можно было использовать для этой функциональности. Вам нужно только добавить некоторый код в контроллер и создать новое представление. Вернитесь к контроллеру News и обновите view() следующим:
public function view($slug = NULL)
{
$data['news_item'] = $this->news_model->get_news($slug);
if (empty($data['news_item']))
{
show_404();
}
$data['title'] = $data['news_item']['title'];
$this->load->view('templates/header', $data);
$this->load->view('news/view', $data);
$this->load->view('templates/footer');
}
Вместо вызова метода get_news() без параметра, передается переменная $slug, поэтому он вернёт конкретную новостную статью. Единственное, что осталось сделать, это создать соответствующее представление в application/views/news/view.php. Поместите следующий код в этот файл.
<?php echo '<h2>'.$news_item['title'].'</h2>'; echo $news_item['text'];
Маршрутизация
Из-за правила маршрутизации с подстановкой, созданного ранее, вам нужен дополнительный маршрут для просмотра контроллера, который вы только что создали. Измените свой файл маршрутизации (application/config/routes.php), чтобы он выглядел следующим образом. Это гарантирует, что запросы доходят до контроллера News вместо того, чтобы идти напрямую к контроллеру Pages. Первая строка маршрутизирует URI со сленгом в метод view() в контроллере News.
$route['news/(:any)'] = 'news/view/$1'; $route['news'] = 'news'; $route['(:any)'] = 'pages/view/$1'; $route['default_controller'] = 'pages/view';
Перейдите к своему корневому документу, за которым следует index.php/news, и посмотрите на вашу страницу новостей.
© 2014–2020 British Columbia Institute of Technology
Licensed under the MIT License.
https://codeigniter.com/userguide3/tutorial/news_section.html