Быстрый и надёжный хостинг на SSD-дисках от 165р в месяц   •   Реклама
204 просм
1 комм
Поделиться:

Точный поиск по дополнительным полям (xfields) при использовании {custom} в DLE

В DataLife Engine тег {custom} используется для вывода материалов на сайте по заданным критериям. Одним из таких критериев (параметров) являются дополнительные поля (xfields), и при использовании тега подобно этому варианту:

{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. Подключитесь к вашему сайту по FTP.

2. Откройте файл functions.php в папке /engine/modules/.

3. В нем найдите строку:

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);

}

Сохраните изменения и отправьте файл обратно на сайт.

4. Очистите кэш сайта. Установка закончена.

Теперь в теге {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».

1
комментарий
Гостям запрещено участвовать в обсуждениях сайта. Авторизуйтесь, чтобы расширить привилегии гостевого посещения и получить необходимую помощь от сообщества Pandoge.
Проверенный16

Какая выходит нагрузка с этой наработкой?

5 дек в 11:38
  • 0
Подняться наверх
«Pandoge» - помощник веб-мастера