Безлимитный хостинг на сверхбыстрых SSD-дисках от 57р в месяц   •   Реклама
491 просм
4 комм
Поделиться:

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

3 дек
Хаки

В 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».

4
комментария
Форма комментирования этой статьи скрыта. Авторизуйтесь, чтобы расширить привилегии гостевого посещения и получить необходимую помощь от сообщества Pandoge.
    • 1
    2
      •  Пользователь
    23 дек в 01:53

    Благодарю. Буду пробовать. Я уже если честно второй день вожусь с этой проблемой, всё в интернете перекопал) Уже даже пробовал этот custom подгружать через php изнутри, но всё бесполезно.

    • 0
    784
      •  Администратор
    23 дек в 01:23

    Влад, здравствуйте!

    Не поверите, но я тоже столкнулся с такой проблемой. Это случается (всего скорее) из-за того, что custom обрабатывается раньше, чем указанная переменная.

    Решение пока нашел такое:

    1. Переменную в custom заменяем на какой-нибудь тег, например:

    xfields_exact="[[nam_e]]"

    2. В foreach (в скрипте) заменяем тег на переменную:

    foreach($match[1] as $value) {
    
    	$value = str_replace("[[nam_e]]", $nam_e, $value);
    
    	$value = @$db->safesql(htmlspecialchars(strip_tags(stripslashes(trim($value))), ENT_QUOTES, $config["charset"]));
    			
    	$temp_array[] = "p.xfields LIKE '%".$value."%'";
    
    }

    Главное тут, чтобы $nam_e содержала в себе нужные Вам данные.

    • 0
    2
      •  Пользователь
    22 дек в 19:18

    Добрый день. Вот такой у меня вопрос возник:

    Почему данный код, не работает если данные xfields вставлять через переменную php (в щалблоне подключен php, переменная передает все что нужно)

    Пример:

    {custom category="1" xfields_exact="<?php print $nam_e; ?>" navigation="no" cache="yes
    • 0
    22
      •  Проверенный
    5 дек в 11:38

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

Подняться наверх
«Pandoge» - помощник вебмастера