Как сделать что бы Bitrix искал по привязанным элементам?

Ранее уже задавал вопрос когда в товаре были загруженные файлы и нужно было искать по ним.
Как сделат что бы Bitrix искал по свойству инфоблока типа Файл/Множественный?

Я дописал в init.php и всё замечательно работает.
spoiler
$eventManager = \Bitrix\Main\EventManager::getInstance();
    $eventManager->addEventHandler('search', 'BeforeIndex', array('MySearch', 'BeforeIndex'));
    class MySearch {
      public static function BeforeIndex($arFields) {
        if(intval($arFields['PARAM2']) == 34 && intval($arFields['ITEM_ID']) > 0 && isset($arFields['BODY'])) {
          \Bitrix\Main\Loader::includeModule('iblock');
          $dbRes = CIBlockElement::GetList(array(), array('IBLOCK_ID' => $arFields['PARAM2'], 'ID' => $arFields['ITEM_ID']), false, false, array('PROPERTY_DOCUMENTS'));
          while($arRes = $dbRes->Fetch()) {
            $arFile = CFile::GetFileArray($arRes['PROPERTY_DOCUMENTS_VALUE']);
            $arFields['BODY'] .= PHP_EOL.$arFile['ORIGINAL_NAME'];
          }
          return $arFields;
        }
      }
    }


Некоторые одинаковые файлы в товаре встречаюся по 30 раз, поэтому я создал инфоблок и загрузил файлы в инфоблок, затем привязал элементы инфоблока к товару. Теперь файлы выводятся в товаре, но они выпали из поиска.

Что нужно добавить в обработчик что бы файлы привязанные к товару добавились в поиск?

Для поисковиков: bitrix поиск привязанные элементы
  • Вопрос задан
  • 509 просмотров
Решения вопроса 1
@PetrPo
$eventManager = \Bitrix\Main\EventManager::getInstance();
    $eventManager->addEventHandler('search', 'BeforeIndex', array('MySearch', 'BeforeIndex'));

    class MySearch {
      private static $catalogIblockId = 2;
      private static $docsIblockId = 4;
      const PROPERTY_DOCUMENTS = 'PROPERTY_FILE';

      public static function BeforeIndex($arFields) {
        if(intval($arFields['PARAM2']) == self::$catalogIblockId && intval($arFields['ITEM_ID']) > 0 && isset($arFields['BODY'])) {
          \Bitrix\Main\Loader::includeModule('iblock');
          
          $arDocsId = array();

          $dbRes = CIBlockElement::GetList(array(), array('IBLOCK_ID' => $arFields['PARAM2'], 'ID' => $arFields['ITEM_ID']), false, false, array(self::PROPERTY_DOCUMENTS));
          while($arRes = $dbRes->Fetch()) {
              if($arRes[self::PROPERTY_DOCUMENTS.'_VALUE'])
                  $arDocsId[] = $arRes[self::PROPERTY_DOCUMENTS.'_VALUE'];
          }

          if($arDocsId) {
              $dbRes = CIBlockElement::GetList(array(), array('IBLOCK_ID' => self::$docsIblockId, 'ID' => $arDocsId), false, false, array('NAME'));
              while($arRes = $dbRes->Fetch()) {
                  $arFields['BODY'] .= PHP_EOL.$arRes['NAME'];
              }
          }
         
          return $arFields;
        }
      }
    }

- две переменные и константу в классе свои укажи
- название файла = название элемента в инфоблоке с файлами
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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