Вкратце: при создании раздела, если в форму редактирования выведена вкладка "Свойства элементов" (или они выведены в какой-нибудь другой вкладке), фасетный индекс начинает требовать обновления. И из-за этого время от времени пропадают товары из публички (особенности работы CIBlockElement::GetList). Ясное дело, меня это не устраивало. (Можно просто скрыть вывод "Свойств элементов", но это слишком просто для таких извращенцев, как я)
Собственно мне помогло вот это в init.php
AddEventHandler("iblock", "OnBeforeIBlockSectionAdd", "OnBeforeIBlockSectionAddHandler");
/*
* Удаляет из массива настройки свойств элементов, если они не изменились.
* Если ничего не изменилось, не придётся пересоздавать фасетный индекс.
*/
function OnBeforeIBlockSectionAddHandler(&$arFields)
{
if(!empty($arFields['SECTION_PROPERTY']))
{
$arPropLinks = CIBlockSectionPropertyLink::GetArray($arFields['IBLOCK_ID'], $arFields['IBLOCK_SECTION_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 и DISPLAY_EXPANDED либо как 'Y', либо как null,
// CIBlockSectionPropertyLink::GetArray может вернуть и 'N'. Не порядок.
if($arPropLinks[$propId]['SMART_FILTER'] === 'N')
$arPropLinks[$propId]['SMART_FILTER'] = null;
if($arPropLinks[$propId]['DISPLAY_EXPANDED'] === 'N')
$arPropLinks[$propId]['DISPLAY_EXPANDED'] = null;
if($arPropLinks[$propId]['FILTER_HINT'] === null) // такое тоже бывает
$arPropLinks[$propId]['FILTER_HINT'] = '';
foreach($options as $key => $value) {
if($arPropLinks[$propId][$key] !== $value)
return;
}
}
}
unset($arFields['SECTION_PROPERTY']);
}
}
CIBlockSectionPropertyLink::GetArray - подсмотрел в /bitrix/modules/iblock/admin/iblock_section_edit.php. Документации нет, но есть хороший комментарий здесь.
В принципе всё. В комментариях в коде самое главное написано. В любом случае, если соберётесь использовать это у себя - перепроверьте. Мало ли что.
P.S. При таком подходе (как и при скрытии вывода "Свойств элементов") у свежесозданных разделов (у которых вы ничего не меняли в "Свойствах элементов" при создании) теряется возможность редактировать эти самые "Свойства элементов", что нормально. Тут что скриптом исключай, что изначально не отображай. И тут уж вам самим выбирать, пересоздавать ли фасетный индекс при добавлении любого раздела, или получить нередактируемые поля.
Всё ещё считаю, что такое поведение GetList'а - это чёрная магия
Странно что до сих пор нет такого свойства в стандартной поставке. Может где-то проскакивало на форуме - не помню, решил написать своё для удобства работы, может кому-то пригодится:
Как использовать: 1. разместить файл CViDiPropSection.php в папке /bitrix/php_interface/lib/ 2. в файле /bitrix/php_interface/init.php добавить код:
AddEventHandler("main", "OnBeforeProlog", "IBlockOnBeforePrologHandler");
function IBlockOnBeforePrologHandler()
{
// Пользовательское свойство - привязка к разделам в виде списка
require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/php_interface/lib/CViDiPropSection.php");
}
После этого на странице настроек свойств инфоблока появится это свойство:
Если разделы имеют вложенную структуру - то они показываются последовательно, один под одним (после выбора раздела первого уровня предлагается выбрать раздел второго уровня, и тд.). Удобно если разделов очень большое количество.
Согласен, если методы юзертайпа не планируется использовать до вызова CIBlockProperty::GetUserType(), то можно обойтись пятым параметром AddEventHandler().
Сколько времени пишу под Битрикс, никогда не знал о существовании константы SITE_TEMPLATE_PATH (не описанной, как всегда, в документации, но любезно подсказанной моим коллегой).
После восстановления пароля, пользователь нажимает на кнопку авторизации, вводит свой логин и новый пароль, но авторизация не происходит. Ошибок не выдает, просто обновляется страница и на этом все. После повторного нажатия на кнопку авторизации - авторизует. В чем может быть проблема?
После восстановления пароля, пользователь нажимает на кнопку авторизации, вводит свой логин и новый пароль, но авторизация не происходит. Ошибок не выдает, просто обновляется страница и на этом все. После повторного нажатия на кнопку авторизации - аторизует. В чем может быть проблема?
Группы на сайте создаются не только сотрудниками «1С-Битрикс», но и партнерами компании. Поэтому мнения участников групп могут не совпадать с позицией компании «1С-Битрикс».