gtronic
@gtronic
Учусь веб-разработке

Как сделать поиск текста по включаемым областям?

Есть много статичных страниц, в которых текст расположен во включаемых областях. Можно ли сделать так, чтобы поиск битрикса находил текст, размещенный в этих включаемых областях?
  • Вопрос задан
  • 589 просмотров
Решения вопроса 1
gtronic
@gtronic Автор вопроса
Учусь веб-разработке
Решение оказалось не таким уж простым.
Добавить включаемые области в индекс поиска можно но это требует вмешательства в процесс индексации.
для этого в /local/php_interface/init.php добавляется следующий код:
<?
AddEventHandler("search", "BeforeIndex", Array("MyClass", "BeforeIndexHandler"));
class MyClass
{
   private $file_abs_path = "";

   function BeforeIndexHandler($arFields)
   {
      $io = CBXVirtualIo::GetInstance();

      if($arFields["MODULE_ID"] == "main")
      {
         list($site_id, $file_rel_path) = explode("|", $arFields["ITEM_ID"]);
         $file_doc_root = CSite::GetSiteDocRoot($site_id);
         $file_abs_path = preg_replace("#[\\\\\\/]+#", "/", $file_doc_root."/".$file_rel_path);
         $f = $io->GetFile($file_abs_path);
         $sFile = $f->GetContents();
         if(isset($sFile) && $sFile != "")
         {
            $replacer = new MyClass;
            $replacer->file_abs_path = $file_abs_path;
            $sFile = preg_replace_callback("/<\\?\\\$APPLICATION->IncludeComponent\\(\\s*\"bitrix:main.include\",(.*?)\\?>/mis", array($replacer, "replace"), $sFile);
            $arFields["BODY"] = CSearch::KillTags($sFile);
         }
      }
      return $arFields;
   }
   function replace($matchParams)
   {
      $io = CBXVirtualIo::GetInstance();

      if (preg_match("/\"AREA_FILE_SUFFIX\"\\s*=>\\s*\"(.*?)\",/", $matchParams[1], $match))
      {
         $slash_pos = strrpos($this->file_abs_path, "/");
         $sFilePath = substr($this->file_abs_path, 0, $slash_pos+1);
         $sFileName = substr($this->file_abs_path, $slash_pos+1);
         $sFileName = substr($sFileName, 0, strlen($sFileName)-4)."_".$match[1].".php";

         $f = $io->GetFile($sFilePath.$sFileName);
         return $f->GetContents();
      }
      return "";
   }
}

После того, как вставите код не забудьте сделать переиндексацию.
Этот код работает при подключении включаемых областей с указанием параметра AREA_FILE_SUFFIX. В иных случаях он требует доработки.
В любом случае, поиск по включаемым областям в битриксе возможен.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Tomio
@Tomio
backend developer (python, php)
Боюсь, что никак. Включаемая область может быть подключена где угодно: в любых статических разделах, в компонентах инфоблока (причем даже по каким-нибудь if условиям), даже в самих элементах инфоблока (при некоторой сноровке). Поэтому битрикс никак не сможет для этого текста вывести релевантные страницы в результатах поиска.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы