Шаблонизатор
Материал из Wiki
Шаблонизатор для CI
Данный шаблонизатор использует стандартные функции CodeIgniter.
Умеет:
- Выводить блоки
- Выводить теги
- Использовать функции в шаблоне
- Использовать сессии в шаблоне
- Использовать языковые файлы в шаблоне
- Выводить IP и имя браузера
- Обрабатывать ссылки и BB теги
Библиотека
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
/**
* Шаблонизатор от FDCore Studio
* @uses PHP 5
* @author FDCore Studio
* @version 1.0
* @link http://fdcore.ru
*/
class Template {
var $template = null;
var $data = array ();
var $block_data = array ();
var $auto_link = false;
var $bb_code= false;
/**
* Применить к тегу параметр
*
* @param string $tagvar
* @param string $value
* @return void
* @author NetSoul
*/
function set($tagvar,$value)
{
$this->data[$tagvar]=$value;
}
/**
* Примерить к парным тегам параметр
*
* @param string $tagblock
* @param string $value
* @return void
* @author NetSoul
*/
function set_block($tagblock,$value)
{
$this->block_data["'\\[".$tagblock."\\](.*?)\\[/".$tagblock."\\]'si"]=$value;
}
/**
* Подгрузить шаблон в тег
*
* @param string $tagforload
* @param string $tplname
* @return void
* @author NetSoul
*/
function load($tagforload,$tplname)
{
$CI = &get_instance();
$CI->load->library('parser');
$this->data[$tagforload]=$CI ->parser->parse($tplname,$this->data,true);
}
/**
* Компиляция шаблона
*
* @param string $template
* @param bool $return возвратить?
* @param bool $cache кешировать?
* @param int $expire срок кеша
* @return void
* @author NetSoul
*/
function compile($template,$return=false,$cache=false,$expire=60)
{
$CI = &get_instance();
$CI->load->library('parser');
$result='';
if($cache==TRUE) $CI->output->cache($expire);
$result=$CI->parser->parse($template,$this->data,true);
$result=$this->_ci_analyze($result);
if( count( $this->block_data ) ) {
foreach ( $this->block_data as $key_find => $key_replace ) {
$find_preg[] = $key_find;
$replace_preg[] = $key_replace;
}
$result = preg_replace( $find_preg, $replace_preg, $result );
}
if($return) {return $result;} else {$CI->output->set_output($result);}
}
/**
* Анализация тегов
*
* @param string $result
* @param int $expire
* @return string
* @author NetSoul
*/
function _ci_analyze($result)
{
$CI = &get_instance();
if (strpos ( $result, "{ip_address}" ) !== false) {
$CI->load->library('session');
$result = str_replace('{ip_address}', $CI->session->userdata('ip_address'), $result );
}//if
if (strpos ( $result, "{user_agent}" ) !== false) {
$CI->load->library('session');
$result = str_replace('{user_agent}', $CI->session->userdata('user_agent'), $result );
}//if
if (strpos ( $result, "{lang_" ) !== false) {
$CI->load->helper('language');
$result = preg_replace("'{lang_(.+?)}'ie", "@lang(\\1)", $result);
}
if (strpos ( $result, "{func:" ) !== false) {
$result = preg_replace("'{func:(.+?)}(.+?){/func}'ies", "@\\1('\\2');", $result);
}
if (strpos ( $result, "{sess_" ) !== false) {
$CI->load->library('session');
$result = preg_replace("'{sess_(.+?)}'eis", "\$CI->session->userdata('\\1')", $result);
}
if (strpos ( $result, "{plugin:" ) !== false) {
$result = preg_replace("'{plugin:(.+?)}(.+?){/plugin}'ie", "\$this->_plugin('\\1','\\2')", $result);
}
if (strpos ( $result, "{include:" ) !== false) {
$CI->load->library('parser');
$result = preg_replace("'{include:(.+?)}'ie", "\$CI ->parser->parse('\\1',\$this->data,true)", $result);
}
if($this->auto_link==TRUE){
$CI->load->helper('url');
$result=auto_link($result);
}
if($this->bb_code==TRUE){
$result=$this->_bbcode($result);
}
return $result;
}//fun
function _plugin($pl,$text)
{
$CI = &get_instance();
$CI->load->plugin($pl);
return $pl($text);
}
//минимальная обработка BB кодов
function _bbcode($source)
{
$source = preg_replace( "#\[(left|right|center)\](.+?)\[/\\1\]#is", "<div align=\"\\1\">\\2</div>", $source );
$source = preg_replace( "#\[b\](.+?)\[/b\]#is", "<b>\\1</b>", $source );
$source = preg_replace( "#\[i\](.+?)\[/i\]#is", "<i>\\1</i>", $source );
$source = preg_replace( "#\[u\](.+?)\[/u\]#is", "<u>\\1</u>", $source );
$source = preg_replace( "#\[s\](.+?)\[/s\]#is", "<s>\\1</s>", $source );
return $source;
}
}
?>
Теги:
{ip_address} - выводит IP пользователя
{user_agent} - выводит имя браузера
{func:ИМЯ_ФУНКЦИИ}ТЕКСТ{/func} - выполняет функцию ИМЯ_ФУНКЦИИ с параметром ТЕКСТ
{sess_ИМЯ_ПЕРЕМЕННОЙ} - аналог $this->session->userdata('ИМЯ_ПЕРЕМЕННОЙ');
{lang_ИМЯ} - аналог функции lang('ИМЯ');
{plugin:ИМЯ}ТЕКСТ{/plugin} - подгружает и выполняет функцию плагина с параметром ТЕКСТ
{plugin:crypt}текст параметр{/plugin}{include:ШАБЛОН} - инклудинг шаблона из папки /views/
Пример работы:
function test()
{
$this->load->library('Template'); // загрузка библиотеки
$this->template->bb_code=true; // обрабатывать бб коды
$this->template->auto_link=true; // обрабатывать ссылки
$this->template->set('title','Welcome to CodeIgniter');
$this->template->set('header','Welcome to CodeIgniter Template!');
$this->template->set('body','The page you are looking at is being generated dynamically by CodeIgniter Template.');
$is_admin=TRUE;
if($is_admin) {
$this->template->set_block("EDIT","<h1>\\1</h1>");
} else $this->template->set_block("EDIT","");
$this->template->compile('Welcome'); // компиляция
}
Шаблон
<html>
<head>
<title>{title}</title>
</head>
<body>
<h1>{header}</h1>
<p>{body}</p>
<p><br />Page [b]rendered[/b] in {elapsed_time} seconds</p>
<p>{func:strtoupper}текст большими буквами {/func}</p>
<p>{func:md5}тут будет md5 этого текста {/func}</p>
[EDIT]блок[/EDIT]
<p>http://site.com/</p>
session_id: {sess_session_id} <br>
ip: {ip_address} <br>
user_agent: {user_agent} <br>
</body>
</html>
Компиляция имеет необязательные параметры
compile(
$template - обязательный параметр (имя шаблона) если файл .php то можно не указывать расширение
$return=false - выводить в браузер или возвращать
$cache=false - кешировать
$expire=60 - срок кеширования
)
Юзайте ;)