Блог Горошко Андрея 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, символьный код, события инфоблока.

Мой рейтинг:

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

Related Post

Гибкая выборка в D7 ORM: Мастер-класс по классу QueryГибкая выборка в D7 ORM: Мастер-класс по классу Query

Средний рейтинг Еще нет оценок Хотя статический метод ::getList() удобен для простых выборок, его возможности ограничены, когда условия запроса нужно формировать динамически. Для таких задач в D7 ORM существует специальный класс-конструктор — \Bitrix\Main\Entity\Query.

 Безопасность AJAX-компонентов: Подписанные параметры (SignedParameters) Безопасность AJAX-компонентов: Подписанные параметры (SignedParameters)

Средний рейтинг Еще нет оценок Когда вы делаете компонент асинхронным (AJAX), его параметры ($arParams) становятся уязвимы. Злоумышленник может изменить их прямо в JavaScript-коде перед отправкой запроса. Например, подменить IBLOCK_ID и получить доступ

Компонент main.ui.filter: Подключение и обработка фильтра для ГридаКомпонент main.ui.filter: Подключение и обработка фильтра для Грида

Средний рейтинг Еще нет оценок Таблица данных (main.ui.grid) почти всегда требует фильтрации. Для этого используется парный компонент bitrix:main.ui.filter. Он отображает строку поиска и выпадающую панель с условиями, сохраняет пресеты и настройки