17 апреля  

Выводить похожие статье Битрикс

Если вам тоже необходимы любые доработки по Битриксу, то вы можете обратиться к нам за помощью. Пишите на почту info@artapir.ru

Поступила тут интересная задача: у клиента на сайте выводятся статьи. И вот он захотел, чтобы на странице с полным текстом статьи выводился блок с другими статьями, которые будут похожи на данную. (Под похожими имеются ввиду статьи, в названии или поисковых тегов которых совпадают хотя бы одно слово).

Решение:
Для вывода статей воспользуемся обычным news.list, а похожие статьи будем передавать фильтром в данный компонент.

текст кода, с комментариями по ходу:

// 1. Получаем данные по выбранному элементу: его название и поисковыве теги

$CurentElement=intval($_GET["ID"]); // берем ID текущей статьи из адресной строки

// 2. Получаем данные по выбранному элементу:

$res = CIBlockElement::GetByID($CurentElement);
if($ar_res = $res->GetNext())
    $arCurentElement=$ar_res;

// 3. Из названия и поисковых тегов формируем строку, по словам которой будем искать все похожие записи:

$tmpName=str_replace(
    array(".", ",","?","!","-"),
    "",
    trim($arCurentElement["NAME"]." ".$arCurentElement["TAGS"])
);

/*знаю, что кусок кода выше можно было сделать проще через регулярные выражения. Но, к сожалению, я с ними не дружу:( */

if(strlen($tmpName)>0){
    $arLooksLike = array(
     "INCLUDE_SUBSECTIONS" => "Y",
     "!ID"=>intval($CurentElement)  /*исключаем данный элемент из выборки*/
    );
    $NameItems=explode(" ",$tmpName);  

    /* кто умеет пользоваться регулярными выражениями - можете предварительно не очищать от знаков пунктуации, 
      а сразу тут выбирать уже массив готовых результатов */

    $itemsArray=array();
    foreach($NameItems as $item){
     if(strlen($item)>1){
      $itemsArray[]=array("NAME" => "%".$item."%");  // ищем элементы, у которых выбранное свойство есть в названии
      $itemsArray[]=array("TAGS" => "%".$item."%");  // ищем элементы, у которых выбранное свойство есть в поисковых тегах
     }
    }
    $tmpArray=array("LOGIC" => "OR");  // подключаем логику "ИЛИ"

   следующие 2 операции, думаю, можно ужать, но не стал заморачиваться: и так работает.   

     $tmpArray=array_merge($tmpArray,$itemsArray); 

    $addFArray=array(
     array($tmpArray),
    );
    $GLOBALS["arLooksLike"]=array_merge($arLooksLike,$addFArray);  

}

В результате в глобальном массиве

$GLOBALS["arLooksLike"]

лежит подключаемый фильтр. Этот массив и подключаем к компоненту «news.list»:

"FILTER_NAME" => "arLooksLike",

Всем спасибо за внимание! жду критики...

Поблагодарить автора


Популярное