У меня есть контроллер с именем MY_Controller, у которого есть метод, который отображает всю страницу.Я расширяю все свои контроллеры с этого основного контроллера.Как это помогает?Мои основные контроллеры выбирают представление и встраивают его в основную область содержимого страницы и собирают полную страницу.Этот контроллер принимает заголовок, нижний колонтитул, боковую панель и выполняет все мамбо-джамбо.Очень легко разработать такую систему в CI.Некоторые это называют двумя шагами или несколькими представлениями.Так что если в какой-то случайный день мне придется изменить макет моей страницы, мне просто нужно посмотреть на MY_Controller.
Торт на другой стороне использует макеты.Я сделал только один проект в CakePHP, поэтому я не такой эксперт, но вы можете добиться того же эффекта в любой среде.Вот как я делаю это в CI
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
class MY_Controller extends CI_Controller
{
public function __construct()
{
parent::__construct();
log_message('debug', 'Controller Library '.__CLASS__ . ' ('. __FILE__ .') loaded.');
$this->properties['viewPath'] = $this->config->item('viewPath');
$this->setPageMetaData();
$this->setFavIcon();
}
public function render($viewData = null, $data=null)
{
$data = array(
'headerLayout' => $this->printHeaderLayout(array_merge($this->properties, (isset($data['headerLayout'])?$data['headerLayout']:array()))),
'leftLayout' => $this->printLeftLayout(array_merge($this->properties, (isset($data['leftLayout'])?$data['leftLayout']:array()))),
'rightLayout' => $this->printRightLayout(array_merge($this->properties, (isset($data['rightLayout'])?$data['rightLayout']:array()))),
'footerLayout' => $this->printFooterLayout(array_merge($this->properties, (isset($data['footerLayout'])?$data['footerLayout']:array()))),
'containerLayout' => $viewData,
);
this->load->view($this->properties['viewPath'].'layout/layout.php', $data);
}
public function setPageMetaData($pageMetaData=null)
{
$this->properties['pageTitle'] = isset($pageMetaData['pageTitle'])? $pageMetaData['pageTitle'] : $this->config->item('pageTitle');
$this->properties['pageKeywords'] = isset($pageMetaData['pageKeywords'])? $pageMetaData['pageKeywords'] : $this->config->item('pageKeywords');
$this->properties['pageDescription'] = isset($pageMetaData['pageDescription'])? $pageMetaData['pageDescription'] : $this->config->item('pageDescription');
}
public function setFavIcon($favIcon=null)
{
$this->properties['favIcon'] = (null !== $favIcon) ? $favIcon : $this->config->item('favIcon');
}
public function printHeaderLayout($data=null)
{
return ($this->load->view($this->properties['viewPath'].'layout/header', $data, true));
}
public function printFooterLayout($data=null)
{
return( $this->load->view($this->properties['viewPath'].'layout/footer', $data, true));
}
public function printLeftLayout($data=null)
{
return($this->load->view($this->properties['viewPath'].'layout/left', $data, true));
}
public function printRightLayout($data=null)
{
return($this->load->view($this->properties['viewPath'].'layout/right', $data, true));
}
}
Обратите внимание, что это не точный код.Я должен был изменить это для вас, так что не используйте его вслепую.Если вы знаете CI, вы поймете, что у меня есть пути установки для просмотра в файле конфигурации.Это помогает мне настроить две совершенно разные темы и использовать один и тот же контроллер.Я также могу добавить слой аутентификации, который на основе аутентификации пользователя / куки может показывать ссылку входа или выхода из системы в заголовке.Это шаблон, который я изменяю, и я расширяю все свои контроллеры с MY_Controller
и использую в своих контроллерах, я просто делаю
$viewDataForForm = $this->load->view($this->properties['viewPath'].'homepage/some-form', array(), true);
$viewDataForContent = $this->load->view($this->properties['viewPath'].'homepage/some-content', array(), true);
$this->render($viewDataForForm.$viewDataForContent);
HTH!