Сustom с параметрами xfields и xfieldsexclude

Сustom с параметрами xfields и xfieldsexclude

При попытке вывести новости тегом {custom} с параметрами xfields и xfieldsexclude, например:
{custom xfields="2019,боевик" xfieldsexclude="Америка,Россия"}


движок все равно выведет новости с полями, в которых присутствуют слова из xfieldsexclude при условии, что так же в каком-либо поле содержится 2019. Наша же задача исключить вывод пересекающихся новостей через {custom}. То есть, если внесены определённые фразы в xfieldsexclude, то новости с их содержанием НЕ должны выводиться на сайте ни при каких обстоятельствах.

Установка:
1. Открыть engine/modules/functions.php и найти последнее вхождение:
if( preg_match( "#category=['\"](.+?)['\"]#i", $param_str, $match ) ) {

Добавить выше:
if( preg_match( "#senxf=['\"](.+?)['\"]#i", $param_str, $match ) ) {
    if(count(explode("||", $match[1])) > 1)
    {
        $field = explode ("||", $match[1]);
        $xf_where = array();
        for($i = 0; $i < count($field); $i++)
        {
            $tmp_exp = explode ("|", $field[$i]);
            $xf_where[] = "SUBSTRING_INDEX( SUBSTRING_INDEX( xfields,  '" . trim($tmp_exp[0]) . "|', -1 ) ,  '||', 1 ) = '{$tmp_exp[1]}'";
        }
        $xf_where = implode (" AND ", $xf_where);
    }
    else
    {   
        $field = explode ("|", $match[1]);
        $xf_where = "SUBSTRING_INDEX( SUBSTRING_INDEX( xfields,  '" . trim($field[0]) . "|', -1 ) ,  '||', 1 ) = '{$field[1]}'";
    }
    $where[] = $xf_where;
}

if( preg_match( "#selxf=['\"](.+?)['\"]#i", $param_str, $match ) ) {
    if(count(explode("||", $match[1])) > 1)
    {
        $field = explode ("||", $match[1]);
        $xf_where = array();
        for($i = 0; $i < count($field); $i++)
        {
            $tmp_exp = explode ("|", $field[$i]);
            $xf_where[] = "SUBSTRING_INDEX( SUBSTRING_INDEX( xfields,  '" . trim($tmp_exp[0]) . "|', -1 ) ,  '||', 1 ) LIKE '%{$tmp_exp[1]}%'";
        }
        $xf_where = implode (" AND ", $xf_where);
    }
    else
    {   
        $field = explode ("|", $match[1]);
        $xf_where = "SUBSTRING_INDEX( SUBSTRING_INDEX( xfields,  '" . trim($field[0]) . "|', -1 ) ,  '||', 1 ) LIKE '%{$field[1]}%'";
    }
    $where[] = $xf_where;
}

if( preg_match( "#notsenxf=['\"](.+?)['\"]#i", $param_str, $match ) ) {
    if(count(explode("||", $match[1])) > 1)
    {
        $field = explode ("||", $match[1]);
        $xf_where = array();
        for($i = 0; $i < count($field); $i++)
        {
            $tmp_exp = explode ("|", $field[$i]);
            $xf_where[] = "SUBSTRING_INDEX( SUBSTRING_INDEX( xfields,  '" . trim($tmp_exp[0]) . "|', -1 ) ,  '||', 1 ) != '{$tmp_exp[1]}'";
        }
        $xf_where = implode (" AND ", $xf_where);
    }
    else
    {   
        $field = explode ("|", $match[1]);
        $xf_where = "SUBSTRING_INDEX( SUBSTRING_INDEX( xfields,  '" . trim($field[0]) . "|', -1 ) ,  '||', 1 ) != '{$field[1]}'";
    }
    $where[] = $xf_where;
}

if( preg_match( "#notselxf=['\"](.+?)['\"]#i", $param_str, $match ) ) {
    if(count(explode("||", $match[1])) > 1)
    {
        $field = explode ("||", $match[1]);
        $xf_where = array();
        for($i = 0; $i < count($field); $i++)
        {
            $tmp_exp = explode ("|", $field[$i]);
            $xf_where[] = "SUBSTRING_INDEX( SUBSTRING_INDEX( xfields,  '" . trim($tmp_exp[0]) . "|', -1 ) ,  '||', 1 ) NOT LIKE '%{$tmp_exp[1]}%'";
        }
        $xf_where = implode (" AND ", $xf_where);
    }
    else
    {   
        $field = explode ("|", $match[1]);
        $xf_where = "SUBSTRING_INDEX( SUBSTRING_INDEX( xfields,  '" . trim($field[0]) . "|', -1 ) ,  '||', 1 ) NOT LIKE '%{$field[1]}%'";
    }
    $where[] = $xf_where;
}

Готово!

Использование:
  • senxf - это поиск по доп полю с точным значением, например:
    {custom senxf="year|2015"}

    выведет все новости, которые имеют в доп.поле year значение 2015.

  • selxf - это поиск по доп полю с возможным значением, например:
    {custom selxf="ingredients|яйца||ingredients|рис"}

    выведет все новости, которые имеют в доп.поле ingredients значение яйца и рис. То есть, эти значения могут быть где-то в середине текста этого поля (для этого и служит этот тег, если значение в поле одно, к примеру год, то используйте первый).
  • notsenxf - обратное свойство параметра senxf
  • notselxf - обратное свойство параметра selxf
 
Версия DLE: 11.х
Автор: LazyDev
Информация
Посетители, находящиеся в группе Гость, не могут оставлять комментарии к данной публикации.