miker059
@miker059
Коротко не получится

Как настроить поиск по описанию свойства элемента типа файл?

Здравствуйте!
Подскажите как решить вопрос.

Есть сайт, создан на редакции Бизнес с решением Сайт Гос. организации. Структура у сайта грубо сказать очень запутана, делалось когда-то кем-то на скору руку.
Контент представляет из себя кучу одинаковых инфоблоков (с одинаковыми свойствами и настройками полей). Есть разделы, в разделах элементы.
В элементе, набор доп. свойств из которых используется только свойства типа Файл (множественное), у этого свойства включено поле описания значения.
Т.е. каждый элемент это сборка разных файлов с описанием, например -

инфоблок Экономика > 
         раздел Торговля> 
                элемент Нормативно-правовая база> 
                        к элементу приложены файлы: post#1.doc (Описание - Постановление №1) 
                                                    post#2.doc (Описание - Постановление №2) и т.д


Соответственно на странице элемента выводится только список прикрепленных файлов.

Проблема в том, что поиск почему то не ищет ни по именам ни по описаниям этих прикрепленных файлов, т.е. если в поиске ввести - Постановление №1, Постановление №2 или просто Постановление, то результат поиска будет 0.
В Настройках свойства инфоблока, во всех инфоблоках пункт Значения свойства участвуют в поиске, отмечен. Переиндексацию, уже делал все возможные варианты. Ни чего не помогает.

Как то переделывать всю структуру файлов сейчас не реально, документов очень много уже занесено на сайт.
Подскажите что сделать чтобы поиск заработал?
  • Вопрос задан
  • 1743 просмотра
Решения вопроса 1
no_one_safe
@no_one_safe
BeforeIndex
в /bitrix/php_interface/init.php:
AddEventHandler("search", "BeforeIndex", Array("BeforeIndex", "BeforeIndexHandler"));
CModule::AddAutoloadClasses('', array(
    'BeforeIndex' => '/bitrix/php_interface/classes/BeforeIndex.php',
        )
);

в /bitrix/php_interface/classes/BeforeIndex.php:
class BeforeIndex {

    function BeforeIndexHandler($arFields) {
        $IBLOCK_ID = 1 //нужный инфоблок
        if ($arFields["MODULE_ID"] == "iblock" && $arFields["PARAM2"] == $IBLOCK_ID) {
            
            $arSelect = Array("ID", "NAME", "PROPERTY_FILE");
            $arFilter = Array("IBLOCK_ID" => $IBLOCK_ID, "ID" => $arFields['ITEM_ID']);
            $res = CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect);
            if ($ar_res = $res->GetNext()) {
                //Тут узнаете есть ли файлы или нет и тянете их DESCRIPTION
                ...
                $arFields["BODY"].= PHP_EOL.$DESCRIPTION;
            }
        }
        return $arFields;
    }

}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Для обеспечения подобного функционала изначально следовало бы использовать стандартную медиатеку, (ну или отдельно хранить вложенные файлы в отдельном инфоблоке, что в принципе одно и то же). На мой взгляд самое оптимальное решение разработать структуру в которой выносится отдельный инфоблок с вложениями. В него с помощью API перенести все элементы, а долее так же через API исправить свойство из привязки файлов в привязку к элементам инфоблока. Таким образом останется только поменять в шаблонах выдачу, список всех шаблонов можно получить через, на пример, grep в папке сайта с указанием кода и id предыдущего свойства. Работы примерно на 1 -1,5 рабочих дня. За то оборачивайте в свой функционал все что нужно.
Ответ написан
Ваш ответ на вопрос

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

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