Всем привет. Проблема весьма актуальна и ходит из проекта в проект. Может быть у кого-нибудь есть более изящные решения?
Заказчик выгружает из 1С справочник "Цвета" который привязывается к свойству типа Справочник торговых предложений. Выгрузка проходит отлично, я получаю HL инфоблок. Умный фильтр на сайте работает в режиме ЧПУ и генерирует ужасные URL. Я не могу поменять XML_ID в 1С. Список цветов тоже часто обновляется и их порядка тысячи, следовательно я не могу постоянно вручную менять XML_ID.
Проблема состоит не просто в красоте URL. Основная проблема в том, что справочник цветов не единственный справочник в системе и выбрав несколько галочек в фильтре можно получить 414 ошибку от веб-сервера, т.к. url имеет недопустимую длину.
Есть идея сделать обработчик на OnSuccessCatalogImport1C и создавать новый HLIB из выгруженного, где XML_ID будет транслитерированным полем UF_NAME, но мне противна сама идея клонирования данных впустую. А если у меня миллион элементов?
Если Вы уверены в уникальности наименований - что мешает поправить выгрузку на стороне 1С? Надо то фактически проверить имя свойства и если равно "Цвет" - подменить XML_ID.
Ну в итоге, все оказалось не настолько сложно как могло. Необходимо скопировать компонент catalog.smart.filter в /local/components/bitrix/
Код
// Вместо XML_ID справочника используем поле "Значение"
// $url_id = strtolower($enum['XML_ID']);
// Меняем на
$url_id = strtolower($enum['VALUE']);
// И так же для HL-справочников
// $url_id = toLower($cache[$PROPERTY_ID][$key]['UF_XML_ID']);
// Меняем на
$url_id = strtolower($cache[$PROPERTY_ID][$key]['VALUE']);
Если поле значение у вас имеет кириллицу, пробелы в названии, то рекомендую помимо strtolower оборачивать еще в CUtil::translate.
Возможно, это не совсем верное решение, но в рамках моего проекта, где поле "Значение" выступало латинской строкой без пробелов и я был строго уверен в уникальности значения, подошло идеально.