Как лучше всего создавать верхние и нижние колонтитулы? Вызвать все это из контроллера или включить из файла представления? Я использую CodeIgniter и хочу знать, что для этого лучше всего. Загрузка всех включенных файлов просмотра с контроллера, вот так?
class Page extends Controller {
function index()
{
$data['page_title'] = 'Your title';
$this->load->view('header');
$this->load->view('menu');
$this->load->view('content', $data);
$this->load->view('footer');
}
}
или вызывая файл единого представления и вызывая оттуда представления верхнего и нижнего колонтитула:
//controller file
class Page extends Controller {
function index()
{
$data['page_title'] = 'Your title';
$this->load->view('content', $data);
}
}
//view file
<?php $this->load->view('header'); ?>
<p>The data from the controller</p>
<?php $this->load->view('footer'); ?>
Я видел, как это делается в обоих направлениях, но хочу сделать выбор сейчас, прежде чем я пойду слишком далеко по пути.






Вызывать представления внутри других представлений - плохая практика. Это может быть форма смешивания представлений контроллера. Функция представления в CI позволяет передать третий параметр, который заставляет его возвращать вывод представлений в виде строки. Вы можете использовать это для создания составного представления.
Например:
class Page extends Controller {
function index() {
$data['page_title'] = 'Your title';
$this->load->view('default_layout', array(
'header' => $this->load->view('header' , array(), true),
'menu' => $this->load->view('menu' , array(), true),
'content' => $this->load->view('content', $data , true),
'footer' => $this->load->view('footer' , array(), true),
));
}
}
default_layout.php
<? echo $header, $menu, $content, $footer; ?>
Вы можете объединить верхний и нижний колонтитулы, чтобы создать такой шаблон.
class Page extends Controller {
function index() {
$data['page_title'] = 'Your title';
$this->load->view('default_template', array(
'menu' => $this->load->view('menu' , array(), true),
'content' => $this->load->view('content', $data , true),
));
}
}
default_template.php
<html><head></head><body><span>Some Header HTML</span> // this is your header html
<? echo $menu, $content; ?>
<span>some footer HTML</span></body></html> // this is your footer html
Я думаю, что первый способ сделать это чище. Просто с точки зрения знания, что будет отображаться. Вместо того, чтобы вводить файл просмотра, чтобы найти остальное.
Вы также можете попробовать это таким образом - определить шаблон представления по умолчанию, который затем извлекает содержимое на основе переменной («содержимое» в моем примере), переданной контроллером.
В вашем контроллере:
$data['content'] = 'your_controller/index';
// more code...
$this->load->vars($data);
$this->load->view('layouts/default');
Затем определите макет по умолчанию для всех страниц, например. просмотры / макеты / default.php
// doctype, header html etc.
<div id = "content">
<?= $this->load->view($content) ?>
</div>
// footer html etc.
Тогда ваши представления могут содержать просто чистый контент, например. views / your_controller / index.php может содержать только переменные, переданные из массива контроллера / данных
<?= $archives_table ?>
<?= $pagination ?>
// etc.
Более подробная информация о CI wiki / FAQ - (В. Как встраивать представления в представления? Вложенные шаблоны? ...)
Мне больше всего нравится в этом подходе то, что я могу избавиться от всех этих ошибок в моей среде IDE, связанных с отсутствием конечных тегов и отсутствующих начальных тегов во фрагментах верхнего и нижнего колонтитула. Хороший!
Собственно, немного изучив это сам, я пришел к выводу, что лучший способ включения верхних и нижних колонтитулов в MVC - это третий вариант, а именно расширение базового контроллера. Это даст вам немного больше гибкости, чем предложение htxt, особенно если вы создаете очень модульный макет (не только верхний и нижний колонтитулы, а также боковые панели, нестатические меню и т. д.).
Сначала определите класс Base_controller, в котором вы создаете методы, которые добавляют элементы вашей страницы (верхний колонтитул, нижний колонтитул и т. д.) К выходной строке:
class Base_controller extends Controller
{
var $_output = '';
function _standard_header($data=null)
{
if (empty($data))
$data = ...; // set default data for standard header here
$this->_output .= $this->load->view('header', $data, true);
}
function _admin_header($data=null)
{
if (empty($data))
$data = ...; // set default data for expanded header here
$this->_output .= $this->load->view('admin_header', $data, true);
}
function _standard_page($data)
{
$this->_standard_header();
$this->_output .=
$this->load->view('standard_content', $data, true);
echo $this->_output; // note: place the echo statement in a
// separate function for added flexibility
}
function _page_with_admin_header($data)
{
$this->_admin_header($data);
$this->_output .=
$this->load->view('standard_content', $data, true);
echo $this->_output;
}
}
Затем в контроллерах страниц просто расширите базовый класс и вызовите свои функции для создания страницы.
class Page_controller extends Base_controller
{
function index()
{
$data = ...; // Set content data here
$this->_standard_page($data);
}
function admin()
{
$data = ...; // Set content and header data here
$this->_page_with_admin_header($data);
}
}
Используя базовый контроллер, вы можете добиться очень чистого кода в ваших отдельных контроллерах страницы И иметь отдельные представления для элементов на странице (позволяя повторно использовать код как в представлениях, так и в контроллерах). Все, что вам нужно сделать, это определить общие «разделы» страницы (то, что вы можете захотеть назвать «фрагментами») как функции в вашем базовом контроллере.
И если базовый контроллер должен начать неконтролируемый рост (что может произойти на больших сайтах), вы можете изменить некоторые из его менее общих функций, поместив их в подклассы, и позволить соответствующим контроллерам страниц расширять их вместо исходного базового контроллера.
Наслаждаться!
/ Йенс Роланд
Поскольку ваш вопрос касался CodeIgniter - я просто хочу направить вас к тому, как Zend Framework справляется с этим: framework.zend.com/manual/en/zend.layout.html