Частая задача контент-менеджера — заполнять символьный код для ЧПУ.
Это рутинная работа, которую легко автоматизировать.
Мы создадим обработчик, который будет транслитерировать название элемента в латиницу и сохранять его в поле CODE при добавлении или изменении, если оно не заполнено.
Шаг 1: Настройки транслитерации
В Битрикс есть мощная функция CUtil::translit. Она принимает массив настроек.
$translitParams = [
"max_len" => 100, // Обрезать до 100 символов
"change_case" => "L", // Привести к нижнему регистру (Lower)
"replace_space" => "-", // Заменять пробелы на дефис
"replace_other" => "-", // Заменять остальные символы на дефис
"delete_repeat_replace" => true, // Удалять повторяющиеся дефисы
"use_google" => false, // Не использовать внешний сервис
];Шаг 2: Создание обработчика (D7)
Разместим код в init.php или подключенном файле модуля. Будем использовать EventManager.
use Bitrix\Main\EventManager;
use Bitrix\Main\Entity\EventResult;
$eventManager = EventManager::getInstance();
// Событие перед добавлением
$eventManager->addEventHandler(
'iblock',
'OnBeforeIBlockElementAdd',
['MyClass', 'generateCode']
);
// Событие перед обновлением
$eventManager->addEventHandler(
'iblock',
'OnBeforeIBlockElementUpdate',
['MyClass', 'generateCode']
);
class MyClass
{
public static function generateCode(\Bitrix\Main\Event $event)
{
$arFields = $event->getParameter("fields");
$result = new EventResult();
// ID нужного инфоблока (например, Новости)
$targetIblockId = 5;
// Проверяем инфоблок и наличие названия
if (
isset($arFields['IBLOCK_ID']) && $arFields['IBLOCK_ID'] == $targetIblockId &&
isset($arFields['NAME']) && !empty($arFields['NAME'])
) {
// Генерируем код, только если он не задан вручную
if (empty($arFields['CODE'])) {
$params = [
"max_len" => 100,
"change_case" => "L",
"replace_space" => "-",
"replace_other" => "-",
"delete_repeat_replace" => true,
];
$code = \CUtil::translit($arFields['NAME'], "ru", $params);
// Проверяем уникальность (опционально, но желательно)
// Здесь можно добавить логику добавления суффикса -1, -2, если код занят
// Изменяем поле в сохраняемых данных
$result->modifyFields(['CODE' => $code]);
}
}
return $result;
}
}Важные нюансы:
- Проверка empty($arFields[‘CODE’]): Мы не должны перезаписывать код, если контент-менеджер ввел его вручную.
- modifyFields: В D7 событиях мы не меняем массив по ссылке, а используем метод объекта результата.
- Уникальность: Функция транслитерации не гарантирует уникальность. В настройках инфоблока можно включить опцию «Проверять уникальность символьного кода», тогда add/update вернет ошибку, если код занят.
Вывод:
Автоматическая транслитерация экономит время и исключает ошибки человеческого фактора. Использование CUtil::translit в связке с событиями ORM — стандартное и надежное решение этой задачи.
транслитерация Битрикс, CUtil::translit, OnBeforeIBlockElementAdd, генерация CODE, символьный код, события инфоблока.