Как написать свою функцию транслитерации “с чаем и поэтэссами” :).
Как написать функцию транслитерации на PHP
Пишем массив из букв, которые будут заменены. Мой список выглядит так, хотя он может местами и не полный, но принцип вы поймете.
function transliter($str, $en = false) { $tr = array( "А"=>"A","Б"=>"B","В"=>"B","Г"=>"G", "Д"=>"D","Е"=>"E","Ж"=>"J","З"=>"Z","И"=>"I", "Й"=>"Y","К"=>"K","Л"=>"L","М"=>"M","Н"=>"N", "О"=>"O","П"=>"P","Р"=>"P","С"=>"C","Т"=>"T", "У"=>"U","Ф"=>"F","Х"=>"H","Ц"=>"TS","Ч"=>"CH", "Ш"=>"SH","Щ"=>"SCH","Ы"=>"YI", "Э"=>"E","Ю"=>"YU","Я"=>"YA","а"=>"a","б"=>"b", "в"=>"b","г"=>"g","д"=>"d","е"=>"e","ж"=>"j", "з"=>"z","и"=>"i","й"=>"y","к"=>"k","л"=>"l", "м"=>"m","н"=>"n","о"=>"o","п"=>"p","р"=>"p", "с"=>"c","т"=>"t","у"=>"y","ф"=>"f","х"=>"x", "ц"=>"ts","ч"=>"ch","ш"=>"sh","щ"=>"sch", "ы"=>"yi","э"=>"e","ю"=>"y","я"=>"ya" ); if ($en == true) { $tr = array_flip($tr); } return strtr($str, $tr); }
Используем функцию PHP strtr. Зачем нужен второй параметр? Чтобы можно было сделать реверс массива – поменять ключи со значениями, и тогда функцию будет применима и в обратную сторону, а не только с русских букв на английские. Для этого мы применяем функцию PHP array_flip.
Чтобы ее вызвать нам нужно что-то вроде:
$requsetEn = transliter(trim($arResult['query'])); // RU $requsetRu = transliter(trim($arResult['query']), true); // EN
Как в Битриксе написать свою транслитерацию
Функцию закидываем в init.php, чтобы она была доступна из любого участка сайта. Где будем применять? Например в объявлении фильтра:
array( "LOGIC" => "OR", array('IBLOCK_ID' => 1, 'ACTIVE' => 'Y', 'NAME' => '%'.$requsetEn.'%'), array('IBLOCK_ID' => 1, 'ACTIVE' => 'Y', 'NAME' => '%'.$requsetRu.'%'), ),
Теперь у нас настроен поиск сразу по двум вариантам написания.
ВАЖНО Соответствия некоторых букв – не классические, поменяйте их на свои и дополните недостающими.