Мощные VPS/VDS-сервера на новейшем поколении процессоров Intel от 210 ₽ в месяц   •   Реклама
Артём Мáлков

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

3 дек9 комм

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

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

    Здравствуйте, у меня пишет ошибка на подтверждение почты!

      • 0
      1022
        •  Команда Pandoge
      2 июл в 01:05

      Светлана Шпалова, здравствуйте!

      Можете показать скриншот с ошибкой?

    • 0
    1
      •  Пользователь
    19 июн в 01:54

    Подскажите, почему не работает такая связка? Dle 15.0

    {custom xfields_exact="cikl|[xfvalue_cikl limit="200"],avtora|[xfvalue_avtora limit="200"]" template="shortstory3" order="title" sort="asc" limit="200" cache="yes"}

    Выдает вообще все новости/

    И такая ведет себя аналогично

    {custom xfields_exact="[xfvalue_cikl],[xfvalue_avtora]" template="shortstory3" order="title" sort="asc" limit="200" cache="yes"}
      • 0
      1022
        •  Команда Pandoge
      22 июн в 12:58

      Афанасий Фет, здравствуйте!

      Правильно ли я понял, что вы используете этот тег на детальной странице записи?

    • 0
    1
      •  Пользователь
    14 окт в 22:53

    это правильнее сказать вывод новостей, а не поиск по дополнительным полям.

    при поиске пользователь может поставить условия сам...

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

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

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

    Пример:

    {custom category="1" xfields_exact="<?php print $nam_e; ?>" navigation="no" cache="yes
      • 0
      1022
        •  Команда Pandoge
      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 содержала в себе нужные Вам данные.

      • 1
      2
        •  Пользователь
      23 дек в 01:53

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

    • 0
    26
      •  Проверенный
    5 дек в 11:38

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

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