Шаблонизатор

Материал из 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 - срок кеширования
)

Юзайте ;)

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