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 представляют собой массивы, ключи которых совпадают с названиями переменных в отображениях.

Ссылки на документацию

Личные инструменты