Как настроить 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
Для отправки комментария вам необходимо авторизоваться.