Добавляем удобности шаблонизатору

Добавляем удобности шаблонизатору

Хак позволит разработчикам значительно уменьшить количество кода и вообще упростить написание условий шаблонизатора для тегов вида:
[имя_тега] ... [/имя_тега]



Работа данного хака чем-то напоминает стандартный $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']) : '');


Установка:
1. Открыть 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;
	}

Готово!
 
Версия DLE: 11.х-13.х
Автор: Sander
Источник
Информация
Посетители, находящиеся в группе Гость, не могут оставлять комментарии к данной публикации.