DarkRiDDeR1 мин

Bitrix API. Функция для генерации кода элемента из имени через транслит

BitrixPHP

Часто в Bitrix необходимо сгенерировать код элемента из имени. Привожу пример реализации именно такой функции с помощью функции Bitrix API для транслита CUtil::translit:

function strToElementCode($str, $maxLength = 100) {
	$params = array(
			"max_len" => $maxLength,
			"change_case" => "L",
			"replace_space" => "_",
			"replace_other" => "_",
			"delete_repeat_replace" => "true",
			"use_google" => "false",
		);
	return CUtil::translit($str, "ru", $params);
}

Как использовать функцию безопасно

Транслитерация имени удобна, но код элемента должен оставаться уникальным. Поэтому после генерации проверяйте существующие символьные коды в инфоблоке и при совпадении добавляйте числовой суффикс. Иначе два товара с похожим названием могут получить один URL.

telefon-samsung
telefon-samsung-2
telefon-samsung-3

Также стоит сразу нормализовать результат: привести к нижнему регистру, заменить пробелы на дефис, убрать повторяющиеся дефисы и обрезать дефис в начале или конце строки. Это мелочь, но именно такие мелочи потом портят адреса страниц.

$code = CUtil::translit($name, 'ru', [
    'replace_space' => '-',
    'replace_other' => '-',
    'change_case' => 'L',
]);

$code = trim(preg_replace('/-+/', '-', $code), '-');

Проверку уникальности лучше делать в том же инфоблоке, где будет создан элемент. Если сайт многоязычный или есть разделы с одинаковыми товарами, заранее решите правило: уникальность на весь инфоблок или только внутри раздела. Для SEO обычно проще и надёжнее уникальность на весь инфоблок.

В итоге функция должна не просто транслитерировать строку, а возвращать готовый символьный код: чистый, нижнего регистра, без мусора и без совпадений с уже существующими элементами.