подскажите, пожалуйста, как настроить валидацию телефона в разных карточках(лида, контакта, конртагента, на детали средства связи и тд)?
Нравится
Тимур, здравствуйте.
Соответствие номера телефона правилам маршрутизации можно проконтролировать только при ручном вводе номера пользователем.
Например, при входящем звонке, номер записывается именно тот, который передан с АТС.
При наполнении базы посредством интеграции (например интеграция с Excel) запись происходит напрямую в базу и сервис валидации запустить не представляется возможным
Валидацию телефонных номеров, при внесении заполнении пользователем карточки либо детали можно прописать на сохранение карточки:
Перед сохранением считать требуемое значение поля и проверить, соответствует ли запись правилам маршрутизации (например 10 цифр, первая 9)
Пример реализации Вы можете посмотреть в следующих скриптах:
BasecCommunicationDetail:
this.addColumnValidator("Number", newItem.validateField, newItem);
columnName – имя колонки
validatorFn – функция валидации
newItem - само новое создаваемое entity
addColumnValidator: function(columnName, validatorFn, sender) {
var columnValidationConfig = sender.validationConfig[columnName] ||
(sender.validationConfig[columnName] = []);
columnValidationConfig.push(validatorFn);
}
В BaseCommunicationViewModel
function validatorFn(emailAddress) {
var emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$/; - Тут написать свой regex для телефонного адреса.
return emailPattern.test(emailAddress);
}
а можно поподробней, где и что прописать?
потому, что BasecCommunicationDetail не нашел в конфигурации
Если Вам необходимо привлечение наших разработчиков для помощи в написании кода, реализующего данный функционал, то мы можем инициировать запрос ответственному менеджеру по продаже, для обсуждения условий предоставления данной помощи.
Сообщите в техническую поддержку данные о Вашей компании, лицензии, версии и используемом Вами продукте, а также детали реализации (по каким правилам валидировать телефонные номера).
нет, мне не необходимо привлечение ваших разработчиков.
мне необходима помощь и советы как сделать самому.
Тимур, как вы могли заметить - тема создана по конфигурации bpm'online 7.2 подозреваю, что указанный скрипт Вы не можете найти по причине того что у Вашей компании установлена версия Terrasoft 3.x.
Рекомендации по реализации на версии 3.х - во вложении
Николай, спасибо.
но меня интересует именно bpmonline 7.2
можно ли использовать такой метод?:
this.methods.save = function(isValid) { if (!Ext.isBoolean(isValid)) { isValid = true; } if (isValid) { var BusinesPhone = this.get('BusinesPhone'); if (!Ext.isEmpty(BusinesPhone)) { BusinesPhone = BusinesPhone.trim(); this.set('BusinesPhone', BusinesPhone); if (!new RegExp("^380[0-9]{9}$").test(BusinesPhone)) { this.showInformationDialog(resources.localizableStrings.PhoneMustFormat); isValid = false; } } } return isValid; };
Тимур, да, такой метод в 7.2 можно использовать для валидации перед сохранением. Похожая логика используется при сохранении карточки счета.
Можно также вынести валидацию в отдельный метод и просто вызывать его в методе this.methods.save, а лучше в методе this.methods.validate, как в детали CommunicationDetail (она точно есть в версии 7.2).
Пример, который привёл Николай, больше подходит для версий 7.3 и выше.
на страницах с методом this.methods.validate все получается
а вот на детали окно предупреждения выскакивает, но номер сохраняеться
Тимур, уточните, пожалуйста, какой результат при этом возвращает метод validate? Если деталь не должна сохраняться, метод должен возвращать false. В базовой версии при этом не происходит сохранение карточки, которая содержит деталь, а визуально карточка остаётся в режиме редактирования, и при нажатии "Отмена" данные детали "Средства связи" не будут сохранены.
не правильно написал
сохранение не происходит, если номер не прошел валидацию,
происходит закрытие режима редактирования
Тимур, Вы правы. Происходит сохранение основной схемы, поэтому страница редактирования закрывается, но при этом значения детали "Средства связи" не сохраняются.
Для того, чтобы страница не закрывалась, можно переопределить обработчик onSaved страницы редактирования ContactPage следующим образом:
this.methods.onSaved = function() { var saveDetailResponse = sandbox.publish("SaveDetails", null, ["ViewModule_CardModule_Contact_detail_communications"]); if (saveDetailResponse && saveDetailResponse.cancel) { return; } this.callParent(arguments); }
Для AccountPage можно создать аналогичный обработчик, заменив Contact на Account в идентификаторе модуля.
Вы пробовали включать отладчик? Какое значение переменной saveDetailResponse после публикации сообщения "SaveDetails"?
Если валидация детали реализована правильно, при попытке сохранения карточки с некорректным значением на детали "Средства связи" эта переменная должна содержать объект {cancel: true}
.
Значит, данные на детали корректны либо так считает метод валидации. Необходимо установить breakpoint в методе валидации и проверить его работу.
у меня создан замещающий клиентский модуль на CommunicationDetail
и в случае не соответствия телефона или email то showInformationDialog выскакивает с предупреждением.
structure.userCode = function() { this.methods.validate = function() { var Number = this.get('Number'); var communicationType = this.get('CommunicationType'); switch (communicationType.value.toLowerCase()) { case (ConfigurationConstants.CommunicationType.Email.toLowerCase()): if (!Ext.isEmpty(Number)) { Number = Number.trim(); this.set('Number', Number); if (!new RegExp("^([a-z0-9_\\.-]+)@([a-z0-9_\\.-]+)\\.([a-z\\.]{2,6})$").test(Number)) { this.showInformationDialog(resources.localizableStrings.EmailMustFormat); return false; } } return true; case ('6a3fb10c-67cc-df11-9b2a-001d60e938c6'): case ('2b387201-67cc-df11-9b2a-001d60e938c6'): if (!Ext.isEmpty(Number)) { Number = Number.trim(); this.set('Number', Number); if (Number.substr(0, 2) === '38' && Number.length === 2) { this.set('Number', null); } else if (!new RegExp("^380[0-9]{9}$").test(Number)) { this.showInformationDialog(resources.localizableStrings.PhoneMustFormat); return false; } } return true; default: return true; } }; }; return structure; });
С помощью sandbox.publish публикуется сообщение, на которое подписан модуль базовой детали. По этому сообщению он пытается сохранить деталь, вызывая метод валидации для каждого её элемента. Если валидация не прошла, модуль возвращает объект с одним свойством cancel, равным true.
Если в Вашем случае возвращается неопределённое значение при корректной реализации метода валидации - возможно, в Вашем случае id детали не равен "ViewModule_CardModule_Contact_detail_communications" (я проверял на базовой версии). В этом случае необходимо указать корректный id.
огромное спасибо.
у меня id: "ViewModule_CardModule_detail_communications"