Артём Мáлков

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

3 дек14 комм

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

Рекомендуем к просмотру
Универсальный набор иконок «Fugue Icons» PNG/GIF
Графика и дизайн
Получаем превью изображения, добавленного через плагин Advanced Custom Fields в WordPress
Статьи и советы
Выводим информацию о новости в файле (attachment) в DLE
Хаки
14
комментариев
Форма комментирования этого поста скрыта. Авторизуйтесь, чтобы расширить привилегии гостевого посещения и получить необходимую помощь от сообщества Pandoge.
    • 1
    1
      •  Пользователь
    3 окт в 11:05

    Здравствуйте!

    Помогите пожалуйста решить одну задачу.

    Нужно вывести в шаблоне статической страницы новости у которых содержимое страницы есть в доп. поле.

    Пример:

    {custom xfields="{static}"}

    • 1
    1
      •  Пользователь
    5 июн в 15:55

    Артем, здравствуйте, подскажите, возможно ли в {custom category="1,2,3,4,5" xfields_exact="СЮДА"}, подставлять динамические значения. Например на сайте есть скрипт выбора города, вывод производится в <span name="user_city"></span> возможно ли реализовать подстановку city|Выбранный город ?

      • 1
      1066
        •  Команда Pandoge
      16 июл в 13:57

      Александр, здравствуйте!

      В

      <span name="user_city"></span>
      я так полагаю, подставляется значение по AJAX? Или нет?

    • 0
    1
      •  Пользователь
    19 апр в 23:43

    Сделайте чтоб работало с https://forum.dle-news.ru/topic/88254-ajax-%D0%BF%D0%B5%D1%80%D0%B5%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B2%D0%B8%D0%B4%D0%B0-%D0%BA%D1%80%D0%B0%D1%82%D0%BA%D0%B8%D1%85-%D0%BD%D0%BE%D0%B2%D0%BE%D1%81%D1%82%D0%B5%D0%B9/

    пожалуйста

      • 0
      1066
        •  Команда Pandoge
      16 июл в 13:56

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

      Нужно больше подробностей, что именно необходимо.

    • 1
    1
      •  Пользователь
    26 июн в 23:57

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

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

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

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

    • 1
    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"}
      • 1
      1066
        •  Команда Pandoge
      22 июн в 12:58

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

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

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

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

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

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

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

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

    Пример:

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

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

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

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

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

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