Не нравятся результаты поиска? Попробуйте другой поиск!
DLE FAQ » Все вопросы » Шаблоны (TPL) » использование [if ... ?

использование [if ... ?


     09.09.2026    Шаблоны (TPL), Общие вопросы по PHP    601

вопрос
В DLE, есть хорошая возможность использовать [if tags="tags1"...

Все прекрасно работает...

Но одна заковыка, если присвоено статье несколько tags, и есть разные условия к каждому из них, в моем случае вывод картинки:

if tags="tags1"...; if tags="tags2"; и т.д., то выведутся все...

Как сделать , что бы выводился только один if tags="tags1"... (Например, первый) силами/возможностями if.

Если это это невозможно, то посоветуй как это сделать

Ответа пока нет


16 комментариев

TeraMoune
Эксперт

TeraMoune - 9 сентября 2026 17:31 -

Вы можете разве что использовать одну конструкцию условия но в ней указать две проверки и задать определение условию через (OR) или (AND) слова, как воспринимать условие.

mvia
Юзер

mvia - 10 сентября 2026 12:14 -

Это верно, условий много, тэговов очень много ...

lutskboy
Эксперт

lutskboy - 12 сентября 2026 19:18 -

на js скрыть все картинки кроме первой

mvia
Юзер

mvia - 13 сентября 2026 17:40 -

Цитата: lutskboy
на js скрыть все картинки кроме первой

Я думаю, как сделать PHP-возможностями одноразовую обработку
[if field = "tags"]

Только "tags", может кто знает где и как?
Как думаете?

TeraMoune
Эксперт

TeraMoune - 16 сентября 2026 00:17 -

На самом деле нет смысла делать это только для tags, там всё общее и никак не отличается. Поэтому делается это в рамках одной итерации вызова обработки тега.

Сделать это конечно же можно, но я только подскажу мысль и приведу пример. Делается это где-то в templates.class.php в функции обработки тега условий. В этой функции нужно дописать код для реализации параметра допустим group. Таким параметром можно будет выделять в общую группу теги. Переменную использовать как глобальную, принцип должен быть таким, если первый тег имеет group с указанным именем то в глобальную переменную выводится результат работы функции. Каждая другая итерация вызова функции проверяет параметр и если он указан то проверяется имя параметра в глобальной переменной и смотрит, успешно или нет, в зависимости от наличия и того какое состояние будет решено продолжать ли работу функции.

dj-avtosh
PHP-developer

dj-avtosh - 18 сентября 2026 19:13 -

Здравствуйте. Я так понял, нужно заканчивать работу поиска как только выпало перовое совпадение (и речь о fullstory.tpl):

В engine/modules/show.full.php найти:
DLEXFields::Compile($row, $tpl, $xfields_in_news, $all_xf_content);


Вставить ниже:
if (strpos($tpl->copy_template, '[first-match]') !== false) {
	$tags = array_flip(array_filter(array_map(fn($v) => dle_strtolower(trim($v)), explode(',', $row['tags'] ?? ''))));

	$tpl->copy_template = preg_replace_callback('~\[first-match\](.*?)\[/first-match\]~is', function($m) use ($tags) {
		preg_match_all('~\[if\s+tags=["\']([^"\']+)["\']\](.*?)\[/if\]~is', $m[1], $ifs, PREG_SET_ORDER);

		foreach ($ifs as $if)
			foreach (explode(',', $if[1]) as $tag)
				if (isset($tags[dle_strtolower(trim($tag))])) return $if[2];

		return '';
	}, $tpl->copy_template);
}


А в fullstory.tpl:

[first-match]
[if tags="tag1"]Картинка 1[/if]
[if tags="tag2"]Картинка 2[/if]
[if tags="tag3"]Картинка 3[/if]
[/first-match]


Как только система находит первое подходящее условие [if tags], она выводит его содержимое и дальше уже ничего не проверяет. Все следующие условия просто пропускаются.

По заказам пишем сюда: @Rud00y

Сложные заказы в telegram (ремонт модулей, оптимизация нагрузок и т.п.):
В телегу писать сразу задачу и бюджет.

mvia
Юзер

mvia - 20 сентября 2026 16:27 -

Спасибо!
Попробую сегодня-завтра.
Это правильная идея, остановить поиск при нахождении первого вхождения. Примерно это и думал...
Спасибо ещё раз ...

mvia
Юзер

mvia - 11 октября 2026 01:13 -

Добрый день!
А, как сделать для короткой новости, этот код не работает в ней, если вставить этот код в show.short.php, то выскакивает ошибка:
Fatal error: Uncaught TypeError: explode(): Argument #2 ($string) must be of type string, array given in /home/imha/web/imha.ru/public_html/engine/modules/show.short.php:666 Stack trace: #0 /home/imha/web/imha.ru/public_html/engine/modules/show.short.php(666): explode(',', Array) #1 /home/imha/web/imha.ru/public_html/engine/engine.php(1167): include_once('/home/imha/web/...') #2 /home/imha/web/imha.ru/public_html/engine/init.php(1036): include_once('/home/imha/web/...') #3 /home/imha/web/imha.ru/public_html/index.php(19): require_once('/home/imha/web/...') #4 {main} thrown in /home/imha/web/imha.ru/public_html/engine/modules/show.short.php on line 666


При вставке кода, в show.full.php, выскакивает, при просмотре полной новости:

Fatal error: Uncaught TypeError: explode(): Argument #2 ($string) must be of type string, array given in /home/imha/web/imha.ru/public_html/engine/modules/show.full.php:1265 Stack trace: #0 /home/imha/web/imha.ru/public_html/engine/modules/show.full.php(1265): explode(',', Array) #1 /home/imha/web/imha.ru/public_html/engine/engine.php(956): include_once('/home/imha/web/...') #2 /home/imha/web/imha.ru/public_html/engine/init.php(1036): include_once('/home/imha/web/...') #3 /home/imha/web/imha.ru/public_html/index.php(19): require_once('/home/imha/web/...') #4 {main} thrown in /home/imha/web/imha.ru/public_html/engine/modules/show.full.php on line 1265


Как это исправить?

rewenas
Юзер

rewenas - 11 октября 2026 20:15 -

mvia,
Это из за несовместимости кода выше с версией PHP вашего сайта.

mvia
Юзер

mvia - 13 октября 2026 16:24 -

Какая версия php должна быть?
Доброго дня...

rewenas
Юзер

rewenas - 14 октября 2026 21:35 -

Просто в базе данных tags хранится как строка, но в файле show.full есть строка которая делает из нее массив:
$row['tags'] = explode( ",", $row['tags'] );
Код выше пытается сделать explode(',', $row['tags']) , а у нас там уже массив. Вот и ошибка. Php 7.x это глотал и не падал, а 8.x что скорее всего у вас такое не прощает.
Вставте код до вот этого:
		if( $config['allow_tags'] and $row['tags'] ) {
			
			$tpl->set( '[tags]', "" );
			$tpl->set( '[/tags]', "" );
			
			$social_tags['news_keywords'] = $row['tags'];
		
			$tags = array ();
			
			$row['tags'] = explode( ",", $row['tags'] );
			
			foreach ( $row['tags'] as $value ) {
				
				$value = trim( $value );
				$url_tag = str_replace(array("'", """, "&", "/"), array("'", '"', "&", "⁄"), $value);
			
				$tags[] = "<a href=\"" . DLEUrl::BuildUrl('tags', ['tag' => rawurlencode(dle_strtolower($url_tag))]) . "\">" . $value . "</a>";
			
			}
			
			$tpl->set( '{tags}', implode( $config['tags_separator'], $tags ) );
		
		} else {
			
			$tpl->set_block( "'\\[tags\\](.*?)\\[/tags\\]'si", "" );
			$tpl->set( '{tags}', "" );
		
		}

mvia
Юзер

mvia - 15 октября 2026 20:06 -

Спасибо, попробую, отпишу по результату

rewenas
Юзер

rewenas - 15 октября 2026 21:51 -

Хотя лучше вставить код внутрь условия: if( $config['allow_tags'] and $row['tags'] ) { а в else добавить очистку тегов [first-match] если теги выключены в настройках новости или их нет у новости. Так будет логичней.

mvia
Юзер

mvia - 16 октября 2026 17:03 -

Не получается, перестало выводиться о ошибке, но вывод картинок остался по прежнему,

rewenas
Юзер

rewenas - 16 октября 2026 20:02 -

Что именно у вас не получается? Я попробовал и код который дал dj-avtosh работает, выводит текст первого подходящего условия IF остальные пропуская.

mvia
Юзер

mvia - 23 октября 2026 17:50 -

Просто не работает. Выскакивает ошибка (см. Пост от 11 октября)

Чтобы комментировать - войдите или зарегистрируйтесь на сайте

Похожие вопросы

 31.01.2014 alexandros.xeiladakis  Шаблоны (TPL)
наверх