Хак: Добавляем удобности шаблонизатору
Данный хак позволит значительно уменьшить количество кода и вообще упростить написание условий шаблонизатора для тегов вида [имя_тега] ... [/имя_тега]
Работа данного хака чем-то напоминает стандартный $tpl->set_block(...) но более упрощен и автоматизирован.
Для примера, думаю всем хорошо известны теги:
2 строки кода шаблона, все просто и вроде как удобно. А что внутри?
Тоже вроде как не много, но когда таких блоков 5, 10, 20 - уже вырастает небольшая такая простыня.
С помощью хака можно все прописать в одну строку:
Теперь в шаблоне будут работать следующие теги и конструкции:
Или же все это:
Можно записать так:
Или вообще по хардкору:
Установка:
Открыть файл engine/classes/templates.class.php
Найти строку:
Выше нее вставить:
Кому понравится - пользуйтесь на здоровье :)
С уважением,
Олег Александрович a.k.a. Sander
Работа данного хака чем-то напоминает стандартный $tpl->set_block(...) но более упрощен и автоматизирован.
Для примера, думаю всем хорошо известны теги:
[online] пользователь в сети [/online]
[offline] пользователя нет на сайте [/offline]
2 строки кода шаблона, все просто и вроде как удобно. А что внутри?
if ( ($row['lastdate'] + 1200) > $_TIME ) {
$tpl->set( '[online]', "" );
$tpl->set( '[/online]', "" );
$tpl->set_block( "'\\[offline\\](.*?)\\[/offline\\]'si", "" );
} else {
$tpl->set( '[offline]', "" );
$tpl->set( '[/offline]', "" );
$tpl->set_block( "'\\[online\\](.*?)\\[/online\\]'si", "" );
}
Тоже вроде как не много, но когда таких блоков 5, 10, 20 - уже вырастает небольшая такая простыня.
С помощью хака можно все прописать в одну строку:
$tpl->ifElse('online', ($row['lastdate'] + 1200) > $_TIME);
Теперь в шаблоне будут работать следующие теги и конструкции:
[online] онлайн [else] нет на сайте[/online]
[online] онлайн [/online]
[not-online] нет на сайте [else] онлайн [/not-online]
[not-online] нет на сайте [/not-online]
Или же все это:
if( $row['info'] ) {
$tpl->set( '[info]', "" );
$tpl->set( '[/info]', "" );
$tpl->set( '{info}', stripslashes( $row['info'] ) );
$tpl->set_block( "'\\[not-info\\](.*?)\\[/not-info\\]'si", "" );
} else {
$tpl->set_block( "'\\[info\\](.*?)\\[/info\\]'si", "" );
$tpl->set( '{info}', "" );
$tpl->set( '[not-info]', "" );
$tpl->set( '[/not-info]', "" );
}
Можно записать так:
if ($tpl->ifElse('info', $row['info'])) {
$tpl->set('{info}', stripslashes($row['info']));
} else {
$tpl->set('{info}', '');
}
Или вообще по хардкору:
$tpl->set('{info}', $tpl->ifElse('info', $row['info']) ? stripslashes($row['info']) : '');
Установка:
Открыть файл engine/classes/templates.class.php
Найти строку:
function compile($tpl) {
Выше нее вставить:
/**
* ifElse расширение
* @param string $tag
* @param boolean $is_true
* @return mixed
*/
public function ifElse($tag = '', $is_true = true)
{
$tag = trim((string)$tag);
if (!$tag) {
return;
}
$is_true = (bool)$is_true;
$this->copy_template = preg_replace_callback("#\\[(not-)?({$tag})\\](.*?)\\[/\\1?\\2\\]#is", function($m) use ($is_true) {
$content = explode('[else]', $m[3]);
$block = (int)$is_true;
if (!$m[1]) {
$block = 1 - $block;
}
return $content[$block];
}, $this->copy_template);
return $is_true;
}
Кому понравится - пользуйтесь на здоровье :)
С уважением,
Олег Александрович a.k.a. Sander