Разделы новостей

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

Установка вашей модели

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

Откройте директорию application/models и создайте новый файл news_model.php, затем добавьте в него следующий код. Убедитесь, что вы сконфигурировали вашу базу данных, как описано здесь.

<?php
class News_model extends CI_Model {

        public function __construct()
        {
                $this->load->database();
        }
}

Этот код похож на код контроллера, который использовался ранее. Он создает новую модель, расширяющую CI_Model и загружающую библиотеку базы данных. Это делает доступным класс базы данных через объект $this->db.

Перед тем, как делать запросы в базу данных, должна быть создана ее схема. Соединитесь с вашей базой данных, и выполните команду SQL ниже. Кроме того, добавьте несколько записей.

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 — Query Builder. Это сделает возможным записать ваши «запросы» однажды и сделать их работающими во всех поддерживаемых системах баз данных. Добавьте следующий код в вашу модель.

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 не очищается перед выполнением запроса; Query Builder сделает это за вас.

Отображение новостей

Теперь, когда запросы записаны, модель должна быть привязана к отображениям, которые используются для показа новостей пользователю. Это можно сделать в контроллере Pages, который мы сделали ранее, но для наглядности будет определен новый контроллер News. Создайте его в application/controllers/news.php.

<?php
class News extends CI_Controller {

        public function __construct()
        {
                parent::__construct();
                $this->load->model('news_model');
        }

        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) и загружает модель, поэтому она может быть использована во всех методах этого контроллера.

Далее, есть два метода, для просмотра всех новостей и одного конкретного элемента. Вы можете увидеть переменную $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 $news_item['slug'] ?>">View article</a></p>

<?php endforeach; ?>

Теперь каждая новость в цикле будет показана пользователю. Вы можете увидеть, как мы написали наш шаблон на PHP, смешанным с HTML. Если вы предпочитаете использовать язык шаблонов, вы можете использовать класс парсера шаблонов или другой парсер.

Страница обзора новостей завершена, но страница для отображения индивидуальных новостей все еще отсутствует. Модель, созданная ранее, сделана таким образом, чтобы использовать ее и для этой функциональности. Вернитесь к контроллеру News и добавьте следующие строки в файл.

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) чтобы он выглядел следующим образом. Это гарантирует, что запрос дойдет до конроллера новостей, вместо того, чтобы идти напрямую к страницам контроллера . Первоя строка маршрутов 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 и посмотрите страницы новостей.