Получите помощь, поддержку и профессиональное общение в Клубе CodeIgniter

CodeIgniter User Guide Version 2.1.3


Урок — раздел новостей

В последнем разделе мы рассмотрели некоторые основные концепции фреймворка, написав класс, который включает статичные страницы. Мы вычистили 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 — Active Record. Это сделает возможным записать ваши «запросы» однажды и сделать их работающими во всех поддерживаемых системах баз данных. Добавьте следующий код в вашу модель.

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

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

Теперь, когда запросы записаны, модель должна быть привязана к отображениям, которые используются для показа новостей пользователю. Это можно сделать в контроллере 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)
	{
		$data['news'] = $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 и поместите в него следующее.

<?php foreach ($news as $news_item): ?>

    <h2><?php echo $news_item['title'] ?></h2>
    <div id="main">
        <?php echo $news_item['text'] ?>
    </div>
    <p><a href="news/<?php echo $news_item['slug'] ?>">View article</a></p>

<?php endforeach ?>

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

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

public function view($slug)
{
	$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), чтобы он выглядел, как показано ниже. Это позволит убедиться в том, что запросы к контроллеру новостей поступают напрямую в контроллер 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 и смотрите ваши страницы новостей.

Поделиться


Переведено в компании Аринт.

Спасибо!

Вы тоже можете оказать помощь проекту! Как это сделать?

Помощь и поддержка

Вы можете задать вопросы и получить ответы и советы от гуру CodeIgniter и веб-разработки: вступайте в Клуб CodeIgniter

Яндекс.Метрика