Поиск похожих статей для выбранной

Поиск похожих статей для выбранной

498
07.03.2013

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

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

Решение: 

Для вывода статей воспользуемся обычным 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",

Всем спасибо за внимание!


Источник: http://dev.1c-bitrix.ru/community/webdev/user/60622/blog/7126/


Благодарю за внимание! Делитесь вашими замечаниями в комментариях ниже.


P.S. Обращайтесь ко мне за приобретением лицензий и продлений на 1C-Битрикс "Управление сайтом", лицензий на облачную и коробочную версии Битрикс 24 а также за приобретением и внедрением готовых решений на базе 1С-Битрикс от партнеров. За более подробной информацией свяжитесь со мной любым удобным для вас способом


Комментарии

Еще никто не комментировал данную публикацию. Будьте первыми!

Добавить комментарий

captcha

Возврат к списку