Как настроить Smarty для удобной работы (+наследование)
Smarty — странноватый и глючноватый шаблонизатор, если сравнивать с Django.
Но под php ничего под руку не попалось, чтобы работало из коробки, было просто в настройке, и, к тому же, когда-то давно я его уже ковырял.
В общем, нужно было срочно прикрутить шаблонизатор — сделал следующее.
- В классе, ответственном за вывод:
123456789101112131415161718192021222324252627282930313233343536373839404142private 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 );}} - Во вьюхе:
1234567891011121314151617// 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 можно почитать на официальном сайте:
- http://www.smarty.net/docs/en/advanced.features.template.inheritance.tpl
- http://www.smarty.net/docs/en/language.function.extends.tpl
- http://www.smarty.net/docs/en/language.function.block.tpl
Similar Posts
- None Found
LEAVE A COMMENT
Для отправки комментария вам необходимо авторизоваться.