Модель Вид Контроллер, или попросту MVC - наверно самый популярный паттерн разработки web-сайтов. Грубо говоря Модель - содержит, Вид - показывает, а Контроллер -  все это дело координирует..

В этой статье я расскажу про Вид. А точнее самалепный шаблонизатор. Почему я вновь пишу велосипед? - просите Вы. Я отвечу: PHP сам по себе является шаблонизатором, и прикручивать что-то стороннее к его работе, вот это уже ненормально. Мы же всего-лишь слегка облегчим работу верстальщику.

Класс шаблонизатора tpl

<?php
class tpl{
	private $vars = array();
	private $tpldir = 'tpl/';
	private $content_type = '';
	public function __get( $name ){
		if( isset($this->vars[$name]) )
			return $this->vars[$name];
	}
	public function __set( $name,$value ){
		$this->vars[$name] = $value;
	}
	private function safe( $file ){
		if( file_exists($file) ){
			return file_get_contents($file);
		}else{ 
			console( 'Файл '.$file.' не найден ',__FILE__,__CLASS__,__LINE__ );
			return '';
		}
	}
	private function exec($file) {
		eval('?>'.$this->safe( ROOT.$this->tpldir.$file.'.tpl') );
	}
	
	public function assign( $var, $val='' ) {
		if( is_scalar($var) )
			$this->vars[$var] = $val;
		else 
			$this->vars = array_merge($this->vars,$var);
	}
	public function parse( $file,$vars = array() ) {
		ob_start();
		$this->show( $file,$vars );
		return ob_get_clean();
	}
	public function read( $file ){
		return $this->safe( ROOT.$this->tpldir.$file.'.tpl' );
	}
	
	public function show( $file,$vars = array() ) {
		$this->assign($vars);
		extract($this->vars);
		$this->exec( $file );
	}
	function setContentType( $type ){
		if( in_array(strtolower($type),array('page','json','html')) )
			$this->content_type = strtolower($type);
	}
	function getContentType( ){
		return $this->content_type;
	}
}
?>

  файлы шаблонов представляют собой те же php файлы, только имеют расширение tpl

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
<title><?php echo $this->title;?></title>
<body>
	<?php echo $this->content;?>
	<div><?php echo $news;?></div>
	<div><?php echo $users;?></div>
</body>
</html>

пользоваться в своем скрипте очень просто

<?php
$tpl = new tpl(); 
$tpl->assign('content','Привет Мир!!!');
$tpl->assign('title','Демо сайт');// простое прсваивание
$tpl->assign(array('news'=>'Новости','users'=>'Список польователей'));
$tpl->parse('index');

в шаблоне можно использовать, три метода доступа к переменным

<?=$this->news;?>
<?=$news;?>
<?=$this->vars['news'];?>

используйте тот, который Вам удобнее. Одним  из бонусов данной системы шаблонизации - это возможность повторного использования внутри шаблона.

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru" lang="ru">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
<title><?php echo $this->title;?></title>
<body>
	<?php echo $this->content;?>
	<div>
		<?php 
			echo $news;
			$this->show('news_block');
		?>
	</div>
	<div><?php echo $this->content;?></div>
</body>
</html>

Использование шаблонизатора на порядок повышает читабельность кода, код отчищен от лишних данных и смежных к выводу операций, типа расчета количества ячеек для вывода в таблицу. Все на своих местах. Каждый занят свои делом. Не говоря уже про то, что сайт с такой архитектурой  гораздо проще поддерживать, уделив больше  внимания на продвижение сайтов в Яндекс и других поисковых системах. Т.е. для в шаблоне SEO оптимизатор просто прописывает в нужных местах meta теги, а уже в системе где-то в настройках правит их значение. Ему нет необходимости ищучать код Вашего сайта, достаточно поверхностного знания HTML.

Может кто-то захочет улучшить скрипт, длбро пожалость на GitHub

 

Рассказать друзьям

Добавить комментарий


Защитный код
Обновить

Комментарии   

0
Khornuz
# Khornuz 28.06.2013 11:55
очень интересно..
0
CoMMoN
# CoMMoN 11.04.2015 22:18
Ошибка в классе на 10 строке
Цитата:
Fatal error: Class 'main' not found in Z:\home\test37.ru\www\class\class.tpl.php on line 10
0
Leroy
# Leroy 13.04.2015 17:34
Спасибо. исправил
0
Spass
# Spass 30.03.2016 09:20
Добавил бы циклы и условия и уже что-то годное получится ;-)