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

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

Данный хак позволит значительно уменьшить количество кода и вообще упростить написание условий шаблонизатора для тегов вида [имя_тега] ... [/имя_тега]
Работа данного хака чем-то напоминает стандартный $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
Комментарии: (5)
  1. foto
    Клиент 13 августа 2018 20:03 #
    Или так
    /**
     * Упрощенный код шаблонизации блоков
     *
     * @param       mixed   $data    Input mixed
     * @param       string  $tag     Input string
     */
    public function checkBool($data, $tag)
    {
    	if (strpos($this->copy_template, "[if {$tag}]") !== false) {
    		$this->copy_template = preg_replace_callback("#\\[if\s(!?){$tag}\\](.*?)\\[/if\\]#is", function ($m) use($data) {
    			if ($m[2]) {
    				$elseBool = false;
    				if (strpos($m[2], '[else]') > 1) {
    					$elseBool = true;
    				}
    				
    				if ($elseBool && !$data && !$m[1]) {
    					return explode('[else]', $m[2])[1];
    				} elseif ($elseBool && $data && $m[1]) {
    					return explode('[else]', $m[2])[1];
    				} else {
    					if ($data && $elseBool && !$m[1]) {
    						return explode('[else]', $m[2])[0];
    					} elseif (!$data && $elseBool && $m[1]) {
    						return explode('[else]', $m[2])[0];
    					} else {
    						if ($data && !$m[1]) {
    							return $m[2];
    						} elseif (!$data && $m[1]) {
    							return $m[2];
    						}
    					}
    				}
    			}
    		}, $this->copy_template);
    	}
    }

    В итоге конструкция
    if ( $row['fixed'] ) {
    	$tpl->set( '[fixed]', "" );
    	$tpl->set( '[/fixed]', "" );
    	$tpl->set_block( "'\\[not-fixed\\](.*?)\\[/not-fixed\\]'si", "" );
    } else {
    	$tpl->set( '[not-fixed]', "" );
    	$tpl->set( '[/not-fixed]', "" );
    	$tpl->set_block( "'\\[fixed\\](.*?)\\[/fixed\\]'si", "" );
    }
    Меняется на
    $tpl->checkBool($row['fixed'], 'fixed');

    А в шаблоне
    [if fixed]зафиксировано[else]не зафиксировано[/if]
    [if !fixed]не зафиксировано[else]зафиксировано[/if]
    [if fixed]зафиксировано[/if]
    [if !fixed]не зафиксировано[/if]


    Развивать DLE не стоит, этот кусок говна никогда не станет конкурентоспособным другим движкам, даже тому бесплатному Livestreet не говоря о WP. Развитие кода и его структура застряла в архейской эре. Это пизд*ц а не код. А его высказывания что DLE не нужно ООП просто заставляет меня каждый раз брать револьвер и играть в русскую рулетку с самим собой. Даже с учетом этого, пусть будет этот говно код, но DLE нахер никому не упал, нет комьюнити. Из разрабов, ты, я, 0-web... всё?
    0
    1. foto
      Клиент 13 августа 2018 20:16 #
      То й прикол в тому, що конкувенції нема, а на WP вже все, що було потрібено комусь, давно придумали і розробили, ну розробиш ти якийсь унікальний модуль, то там знайдеться 10 розробників, які зроблять аналоги твого ж модулю)))
      На це повідомлення бажано не відповідати)
      0
      1. foto
        Клиент 13 августа 2018 20:20 #
        Конкурентоспособным другим движкам а не разработкам к нему. Не важно придумали все или нет, всегда можно реализовать лучше / по-другому и т.п
        0
    2. foto
      Администратор 13 августа 2018 23:24 #
      Насчет кода DLE согласен. Целиком и полностью. Весь код застрял на уровне php 4.

      PS. По коду.
      1. Нет возможности использовать вложенные условия.
      2. Из-за строки
      if (strpos($this->copy_template, "[if {$tag}]") !== false) {

      Не будет работать тег [if !tag]...[/if]. Т.е. обязательно присутствие тега [if tag]...[/if]
      0
      1. foto
        Клиент 14 августа 2018 16:01 #
        На быструю руку
        /**
         * Упрощенный код шаблонизации блоков
         *
         * @param       mixed   $data    Input mixed
         * @param       string  $tag     Input string
         */
        public function checkBool($data, $tag)
        {
        	if (strpos($this->copy_template, "[if {$tag}]") !== false || strpos($this->copy_template, "[if !{$tag}]") !== false) {
        		$this->copy_template = preg_replace_callback("#\\[if\s(!?){$tag}\\](.*?)\\[/if\s{$tag}\\]#is", function ($m) use($data, $tag) {
        			if ($m[2]) {
        				$elseBool = false;
        				if (strpos($m[2], "[else {$tag}]") > 1) {
        					$elseBool = true;
        				}
        				
        				if ($elseBool && (!$data && !$m[1] || $data && $m[1])) {
        					return explode("[else {$tag}]", $m[2])[1];
        				} elseif ($elseBool && (!$m[1] && $data || !$data && $m[1])) {
        					return explode("[else {$tag}]", $m[2])[0];
        				} elseif (!$m[1] && $data || !$data && $m[1]) {
        					return $m[2];
        				}
        			}
        		}, $this->copy_template);
        	}
        }

        [if fixed]зафиксировано [if poll]голосование есть[else poll]голосвания нет[/if poll][else fixed]не зафиксировано[/if fixed]
        [if fixed]зафиксировано[/if fixed]
        [if !fixed]не зафиксировано [if poll]голосование есть[else poll]голосвания нет[/if poll][/if fixed]
        [if !fixed]не зафиксировано[else fixed]зафиксировано[/if fixed]
        0
Добавить комментарий
  • Логин
  • E-mail (не обязательно)
Повторите рисунок:
antibot
© Sander-Development. 2009-2018.
При копировании, ссылка на источник обязательна.