FAQ:Совместное использование нескольких отображений
Материал из Wiki
Как вставлять в отображение текст из другого ресурса (из другого отображения или файла). Пример: кроме основного содержимого страницы выводится блок новостей в боковой колонке.
Отображение в отображении
Есть два отображения, контроллер и модель новостей. Шаблон 1 - основной, шаблон 2 "вставляется" в шаблон 1, модель служит для получения новостей из базы данных.
Отображение 1 (/application/views/index.php):
<html>
<body>
<div id="main_content"><?php echo $main_content ?></div>
<div id="news_block"><?php echo $news_block?></div>
</body>
</html>
Отображение 2 (/application/views/newsblock.php):
<?php
foreach ($news as $new){
?><div>
<div class="newtitle"><?= $new['title']; ?></div>
<div class="newtext"><?= $new['text']; ?></div>
</div><?php
}
?>
Примечание: используется сокращённый синтаксис php-тегов.
Модель (/application/models/news.php):
<?php
class News extends Model{
/**
* стандартный конструктор модели
*/
function News(){
parent::Model();
$this->load->library('database'); // вызываем, если database не указана в autoload
}
/**
* Функция выборки $count последних новостей
*/
function fetchLastNews($count){
$q = $this->db->select("SELECT * FROM `news_table` WHERE `published`=1 ORDER BY `create_date` DESC LIMIT $count");
$data = $q->result_array();
$result = array(
'news' => $data
);
return $result;
}
}
?>
Обратите внимание, мы помещаем результат нашей выборки в массив, ключ news совпадает с названием переменной $news в отображении 2. т.к. при загрузке отображения Codeigniter распаковывает массив функцией extract.
Контроллер
<?php
class Main extends Controller{
...
/**
* Функция, обрабатывающая наш запрос, например главную страницу
*/
function index(){
$page = array(); // переменная, которую мы передадим в Отображение 1
... // прочие действия
$page['main_content'] = $this->content->getPage($id); // Допустим, что мы загружаем текст из БД с помощью модели Content, в этом примере её не рассматриваем.
$this-load->model('News'); // загружаем модель News
$newsdata = $this->news->fetchLastNews(5); // выбираем из базы данных 5 последних новостей и помещаем их в переменную $newsdata
$page['news_block'] = $this->load->view('newsblock', $newsdata, true); // загружаем отображение 2, парсим его и помещаем в массив $page в виде HTML. Третий аргумент не даёт вывести HTML в браузер.
$this->load->view('index', $page); // выводим Отображение 1
}
}
?>
Обратите внимание, что переменная $newsdata, передаваемая в отображение 2, и $page, передаваемая в отображение 1 представляют собой массивы, ключи которых совпадают с названиями переменных в отображениях.