Точный поиск по дополнительным полям (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».