Как настроить Smarty для удобной работы (+наследование)

Smarty — странноватый и глючноватый шаблонизатор, если сравнивать с Django.
Но под php ничего под руку не попалось, чтобы работало из коробки, было просто в настройке, и, к тому же, когда-то давно я его уже ковырял.
В общем, нужно было срочно прикрутить шаблонизатор — сделал следующее.

  • В классе, ответственном за вывод:
    	private static function getSmarty( array $Params )
    	{
    		require_once( SMARTY . 'Smarty.class.php' );
    		$smarty = new Smarty();
    		$smarty->error_reporting = E_ALL & ~E_NOTICE;
    		$smarty->force_compile = true;
    		$smarty->left_delimiter = '{{';
    		$smarty->right_delimiter = '}}';
    		$smarty->template_dir = TEMPLATE;
    		foreach ( $Params as $key => $value ) {
    			$smarty->assign( $key, $value );
    		}
    
    		return $smarty;
    	}
    
    	public function renderToView( rController $Controller, $Debug = false )
    	{
    		$contentType = $Controller->getContentType();
    		self::setHeaders( $contentType );
    		switch ( $contentType )
    		{
    			case self::CONTENT_TYPE_JSON :
    				echo json_encode( $Controller->getTemplateData() );
    				break;
    			case self::CONTENT_TYPE_HTML :
    			default :
    				$templatePath = $Controller->getTemplatePath();
    				if ( ! $templatePath ) {
    					$templatePath = $this->generateTemplatePath( $Controller );
    				}
    				if ( ! file_exists( TEMPLATE . $templatePath ) )
    				{
    					if ( $Debug ) {
    						echo 'tried ' . TEMPLATE . $templatePath;
    					}
    					$templatePath = $this->defaultTemplatePath;
    				}
    
    				self::getSmarty( $Controller->getTemplateData() )->display( $templatePath );
    		}
    	}
  • Во вьюхе:
    // layout.tpl
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
    <head>
    <title>{{if isset( $title )}}{{$title}}{{else}}{{$defaultTitle}}{{/if}}</title>
    <script type="text/javascript" src="/js/main.js"></script>
    {{block name="head"}}{{/block}}
    </head>
    <body>
    {{block name="content"}}{{/block}}
    </body>
    
    // index.tpl
    {{extends 'layout.tpl'}}
    {{block name="content"}}
    	{{assign 'myparamm' 'Bob'}}
    	myparamm {{$myparamm}}
    {{/block}}

Примечательно то, что если (см. код index.tpl) присвоение значения переменной myparamm вынести за пределы конструкции block, то переменная внутри будет неопределена, в документации об этом ни слова)). Также для конструкции block можно указать параметры prepend или append, чтобы не перетирать родительский блок, а дописывать в конец или в начало блока.
В общем получаются похожие на django шаблоны, и жить немного легче.

Насчёт наследования в Smarty 3 можно почитать на официальном сайте:

LEAVE A COMMENT