Блог Горошко Андрея 1C-Битрикс Автоматическая генерация символьного кода (транслитерация) при сохранении элемента

Автоматическая генерация символьного кода (транслитерация) при сохранении элемента

Частая задача контент-менеджера — заполнять символьный код для ЧПУ.

Это рутинная работа, которую легко автоматизировать.

Мы создадим обработчик, который будет транслитерировать название элемента в латиницу и сохранять его в поле 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;
    }
}

Важные нюансы:

  1. Проверка empty($arFields[‘CODE’]): Мы не должны перезаписывать код, если контент-менеджер ввел его вручную.
  2. modifyFields: В D7 событиях мы не меняем массив по ссылке, а используем метод объекта результата.
  3. Уникальность: Функция транслитерации не гарантирует уникальность. В настройках инфоблока можно включить опцию «Проверять уникальность символьного кода», тогда add/update вернет ошибку, если код занят.

Вывод:
Автоматическая транслитерация экономит время и исключает ошибки человеческого фактора. Использование CUtil::translit в связке с событиями ORM — стандартное и надежное решение этой задачи.

транслитерация Битрикс, CUtil::translit, OnBeforeIBlockElementAdd, генерация CODE, символьный код, события инфоблока.

Похожая задача в бизнесе?

Помогу автоматизировать процессы и внедрить ИИ

Меня зовут Андрей Горошко. Я Full-stack разработчик и эксперт по 1С-Битрикс. Настраиваю CRM Битрикс24, разрабатываю защищенные API и создаю умных ИИ-агентов для автоматизации рутины.

Добавить комментарий

Related Post

Как использовать метод SDK catalog.product.getFieldsByFilter в Битрикс24Как использовать метод SDK catalog.product.getFieldsByFilter в Битрикс24

Эффективная интеграция и кастомизация функционала в Битрикс24 часто требует работы на уровне API. Сегодня мы подробно рассмотрим «Как использовать метод SDK catalog.product.getFieldsByFilter в Битрикс24». Вы узнаете экспертные методики работы с

Стоимость разработки каталога спецтехники или оборудования с выгрузкой в PDFСтоимость разработки каталога спецтехники или оборудования с выгрузкой в PDF

Прозрачный расчет бюджета, честные сметы и понимание совокупной стоимости владения (TCO) — залог успешного сотрудничества и окупаемости инвестиций в веб-разработку на 1С-Битрикс. В статье «Стоимость разработки каталога спецтехники или оборудования

Как использовать D7Lang() в 1С-Битрикс: пример кодаКак использовать D7Lang() в 1С-Битрикс: пример кода

Эффективная интеграция и кастомизация функционала в Битрикс24 часто требует работы на уровне API. Сегодня мы подробно рассмотрим «Как использовать D7Lang() в 1С-Битрикс: пример кода». Вы узнаете экспертные методики работы с