Как-то столкнулся я с ошибкой регулярного выражения JS в одном из своих модулей, когда полю формы применяешь JS-валидацию на "Ваше имя", то появлялась JS-ошибка и скрипты не работали.
Проблема появлялась после конвертации файлов модуля маркетплейсом в другую кодировку, т.к. регулярное выражение содержит кириллические символы, необходимо вынести его в лэнги, но вот тут и возникла у меня проблема, после выноса регулярного выражения в лэнги оно в JS становится строкой, а не регулярным выражением и опять не работает.
Чтобы регулярное выражение JS с кириллическими символами корректно работало в Битрикс модуле после конвертации на маркетплейс необходимо:
1) Создаем в модуле файл лэнга, любое имя, например:
/bitrix/modules/api.feedback/lang/ru/js_lang.php
Содержимое этого файла, обратите внимание, регулярка пишется без скобок и модификаторов, только само выражение.
$MESS['API_MF_VALIDATION_RULES_NAME'] = '^[ёЁa-zA-Zа-яА-Я\'\s-]+$';
2) Теперь изменим регулярку в js-скрипте, например, тут живет очень хороший js-валидатор форм
/bitrix/js/api.feedback/validation/jquery.validation.min.js
Регулярке NAME
подставляем лэнг BX.message()
и с помощью new RegExp()
создаем конструктор объекта регулярного выражения + применим модификатор i
Я показал все регулярки, они вам еще ни раз пригодятся, пользуйтесь
/** * @private * RegExp rules */ var _rules = { NOTEMPTY: /\S/, INTEGER: /^\d+$/, NUMERIC: /^\d+(?:[,\s]\d{3})*(?:\.\d+)?$/, MIXED: /^[\w\s-]+$/, NAME: new RegExp(BX.message('API_MF_VALIDATION_RULES_NAME'),'i'), NOSPACE: /^(?!\s)\S*$/, TRIM: /^[^\s].*[^\s]$/, DATE: /^\d{4}-\d{2}-\d{2}(\s\d{2}:\d{2}(:\d{2})?)?$/, EMAIL: /^([^@]+?)@(([a-z0-9]-*)*[a-z0-9]+\.)+([a-z0-9]+)$/i, URL: /^(https?:\/\/)?((([a-z0-9]-*)*[a-z0-9]+\.?)*([a-z0-9]+))(\/[\w?=\.-]*)*$/, PHONE: /^\+?\s*[^0]+\d+\s*([\-\s\d\(\)]+)?$/, OPTIONAL: /\S/, COMPARISON: /^\s*([LV])\s*([<>]=?|==|!=)\s*([^<>=!]+?)\s*$/ };
3) Регистрируем JS-расширение модуля в файле include.php
, например:
/bitrix/modules/api.feedback/include.php
Таким образом, но это не все возможности расширения, подробнее смотрите в документации Битрикса
CJSCore::RegisterExt( 'api_feedback_validation', array( 'js' => '/bitrix/js/api.feedback/validation/jquery.validation.min.js', 'lang' => '/bitrix/modules/api.feedback/lang/' . LANGUAGE_ID . '/js_lang.php', ) );
4) Где-нибудь в шаблоне сайта, или в компоненте, или в include.php и т.д. подключаем JS-расширение модуля, например, у меня это в компоненте component.php
if($arParams['INCLUDE_VALIDATION']) { CJSCore::Init(array('api_feedback_validation')); }
Все, после этого и регулярка будет работать верно, и скрипт не поломается после конвертации.