View
Материал из Wiki
Класс View, который я использую в http://rmcreative.ru/.
Работает как буфер для накопления данных для шаблона. Данные можно присваивать не только в текущем методе, но и в любом другом.
application/views/layout.php используется в качестве основного шаблона страницы. Шаблон, название которого передаётся в render исполняется и подставляется в $content в основном.
class Blog extends Controller {
function index(){
//Доступно как $title в основном шаблоне
$this->view->setTitle('Hello, world!');
$this->view->set('name', 'Alexander Makarov');
$this->view->set('website', 'http://rmcreative.ru/');
//Встраивает указанный параметром шаблон в основной и выводит всё
$this->view->render('blog/index');
//Если нужно не выводить, а например, кэшировать, так можно получить результат строкой
//$result = $this->view->fetch('blog/index');
//Если нужно встроить несколько подшаблонов, то можно сделать так:
//$this->view->setGlobal('navigation', $this->view->fetch('blog/navigation'));
//$this->view->setGlobal('content', $this->view->fetch('blog/content'));
//$this->view->render('blog/index');
}
}
layout.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<title><?=$title?></title>
</head>
<body>
<div id="content">
<h1><?=$title?></h1>
<?=$content?>
</div>
</body>
</html>
Основной шаблон можно сменить на ходу:
$this->view->setLayout('layout_alternative');
Для основного шаблона можно задавать дополнительные переменные:
$this->view->setGlobal('description', 'Эта штука пойдёт в тэг meta');
Код
<?php
if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
* View Class
*
* @author Alexander Makarov
* @copyright 2008
* @version 0.9
* @uses PHP5
* @link http://rmcreative.ru/
*/
class View {
private $layoutVars = array();
private $vars = array();
private $layout = 'layout';
private $title = 'Don\'t forget to set title!';
function setLayout($template){
$this->layout = $template;
}
function setTitle($title){
$this->title = $title;
}
function set($varName, $value){
$this->vars[$varName] = $value;
}
function setGlobal($varName, $value){
$this->layoutVars[$varName] = $value;
}
/**
* Fetch template and return it.
*
* @param String $template
*/
function fetch($template){
/* @var CI CI_Base */
$CI = &get_instance();
$content = $CI->load->view($template, $this->vars, true);
$this->layoutVars['content'] = $content;
$this->layoutVars['title'] = $this->title;
return $CI->load->view($this->layout, $this->layoutVars, true);
}
function fetchPartial($template){
/* @var CI CI_Base */
$CI = &get_instance();
return $CI->load->view($template, $this->vars, true);
}
function renderPartial($template){
echo $this->fetchPartial($template);
}
/**
* Renders template to $content.
*
* @param String $template
*/
function render($template){
echo $this->fetch($template);
}
}