Проблема действительно была в фасетном индексе. Штука такая, если вы вывели в форму редактирования раздела "Свойства элементов"
Скрытый текст |
---|
|
то при создании раздела, даже если вы ничего с этими свойствами не делали, фасетный индекс требует пересоздания. Но, по факту, обновление индекса не требуется, ибо ничего нового для него вы не добавили. И тут я вижу два выхода из ситуации.
1. [B]Для не программистов. [/B]Просто скрыть вывод "Свойств элементов" в форме редактирования раздела (через "Настройки формы редактирования" - шестерёнка в правом верхнем углу на странице редактирования).
[I]Плюсы:[/I][LIST]
[*]Очень просто сделать.
[/LIST][I]Минусы:[/I][LIST]
[*]Если надо будет что-то в этой вкладке отредактировать, придётся опять её выводить, а потом опять скрывать.
[*]Если проблемных инфоблоков много, то надо отключать у каждого, что может занять некоторое время.
[/LIST]
2. [S][B]Для чуть менее не программистов.[/B] Вставить в init.php вот такой код
[CODE]AddEventHandler("iblock", "OnBeforeIBlockSectionAdd", "OnBeforeIBlockSectionAddHandler");
function OnBeforeIBlockSectionAddHandler(&$arFields)
{
/*
* Удаляем из массива не изменённые значения SMART_FILTER.
* Если ничего не изменилось, не придётся пересоздавать фасетный индекс.
*/
if(!empty($arFields['SECTION_PROPERTY']))
{
$arPropLinks = CIBlockSectionPropertyLink::GetArray($arFields['IBLOCK_ID']);
/*
* Если у инфоблока есть торговые предложения, достанем и их свойства тоже
*/
$arCatalog = false;
if (CModule::IncludeModule("catalog"))
$arCatalog = CCatalogSku::GetInfoByProductIBlock($arFields['IBLOCK_ID']);
if (is_array($arCatalog))
{
$arPropLinks += CIBlockSectionPropertyLink::GetArray($arCatalog['IBLOCK_ID']);
}
foreach($arFields['SECTION_PROPERTY'] as $propId => &$options)
{
if(!empty($arPropLinks[$propId]))
{
/*
* В форма возвращает нам SMART_FILTER либо как 'Y', либо как null, а CIBlockSectionPropertyLink::GetArray может вернуть и 'N'
*/
$arPropLinks[$propId]['SMART_FILTER'] = ($arPropLinks[$propId]['SMART_FILTER'] === 'N') ? null : $arPropLinks[$propId]['SMART_FILTER'];
if($arPropLinks[$propId]['SMART_FILTER'] === $options['SMART_FILTER'])
unset($options['SMART_FILTER']);
}
}
unset($prodId, $options, $arPropLinks);
}
}[/CODE]
То есть при создании раздела в лоб проверяем каждое свойство на изменение. Если в фильтр добавились какие-то новые свойства - фасетный индекс обновится. Иначе всё останется как есть.
[I]Плюсы:[/I][LIST]
[*]Один раз добавил, и оно работает для всех инфоблоков
[*]Не надо ничего прятать, если надо что-то отредактировать, просто редактируешь и всё.
[/LIST][I]Минусы:[/I][LIST]
[*]Надо знать что такое init.php :)
[*][S]Если вы просто скопируете код, [B]а я где-то в нём ошибся[/B][/S] ([I]люди на форумах никогда не ошибаются[/I]) [S]- всё зря.[/S]
[/LIST]
P.S. Если это всё уже всем давно известно, то извините.
P.P.S. Таки да, я косяк. Если удалить из массива ключи, отвечающие за вывод свойств в умный фильтр, то они сбросятся, а не унаследуются. Так что либо удалять весь $arFields['SECTION_PROPERTY'], либо его весь оставлять (но тогда опять же, индекс помечается как невалидный и его надо пересоздавать). Будет время - подправлю функцию.