Точный поиск по дополнительным полям при использовании custom

Точный поиск по дополнительным полям при использовании custom

В DLE тег {custom} используется для вывода материалов по заданным критериям. Одним из таких критериев/параметров являются дополнительные поля и при использовании тега подобно этому варианту:
{custom category="1,2,3,4,5" xfields="Россия,2019" navigation="no" cache="yes"}


вы получите все материалы (например – фильмы), где в дополнительных полях указано «2019» или «Россия» (дата выхода и страна соответственно).

Для уточнения, в каких полях нужно искать эту информацию, можно добавить название самих полей:
{custom category="1,2,3,4,5" xfields="country|Россия,year|2019" navigation="no" cache="yes"}

В обоих случаях код отрабатывает, как и должен, за исключением одного момента. Как мы знаем, на примере все той же ситуации с фильмами), российские фильмы могли выйти не только в 2019 году. Так же, как в 2019 году, могли выйти не только российские фильмы.

Улавливаете логику? Стандартные возможности движка, если верить документации на момент публикации этой статьи, не позволяют искать записи с конкретным набором значений полей. Например, нам нужно получить четко все фильмы российского производства за 2019 год.

Была изучена логика работы стандартной функции движка, которая позволяет в принципе искать нужные нам записи по доп.полям, и на ее основе создана следующая, необходимая для решения описанной ранее задачи.

Установка:
1. Открыть engine/modules/functions.php и найти:
if( preg_match( "#xfields=['\"](.+?)['\"]#i", $param_str, $match ) ) {

Добавить выше:
if(preg_match("#xfields_exact=['\"](.+?)['\"]#i", $param_str, $match)) {
	$match[1] = explode(",", $match[1]);
	$temp_array = array();
	foreach($match[1] as $value) {
		$value = @$db->safesql(htmlspecialchars(strip_tags(stripslashes(trim($value))), ENT_QUOTES, $config["charset"]));
		$temp_array[] = "p.xfields LIKE '%".$value."%'";
	}
	$where[] = implode(" AND ", $temp_array);
}

Готово!

Теперь в теге {custom} будет доступен параметр xfields_exact который поможет находить записи с точным набором значений доп.полей. Пример вывода всех российских фильмов за 2019 год:
{custom category="1,2,3,4,5" xfields_exact="Россия,2019" navigation="no" cache="yes"}

И вариант с явным указанием поля (рекомендуется использовать именно его):
{custom category="1,2,3,4,5" xfields_exact="country|Россия,year|2019" navigation="no" cache="yes"}

Эта статья будет полезна, если вы отбираете материалы строго по нескольким дополнительным полям. При поиске по одному полю используйте стандартный параметр тега - xfields, а для отрицания - xfieldsexclude.
 
Версия DLE: 13.х
Кодировка: utf-8
Автор: Артем Мáлков
Источник
Информация
Посетители, находящиеся в группе Гость, не могут оставлять комментарии к данной публикации.