Для начала есть замечательный модуль "telephone". Он добавляет поля типа "номер телефона".
Всё бы хорошо, но валидации нету.
Собственно идея такая добавить общию валидацию на все поля с типом "номер телефона".
В "hook_form_alter" добавляем проверку на entityform.
if (preg_match('/_entityform_edit_form$/', $form_id)) {
$entityform_type = entityform_get_types($form['#bundle']);
if (!empty($entityform_type)) {
...
}
}
Добавляем callback для валидации наших телефонов.
if (!isset($form['#validate'])) {
$form['#validate'] = array();
}
$form['#validate'][] = 'module__phone_validate';
Так будет выглядеть наш "hook_form_alter" в результате.
/**
* Implements hook_form_alter().
*/
function hook_form_alter(&$form, &$form_state, $form_id) {
if (preg_match('/_entityform_edit_form$/', $form_id)) {
$entityform_type = entityform_get_types($form['#bundle']);
if (!empty($entityform_type)) {
// validate phone
if (!isset($form['#validate'])) {
$form['#validate'] = array();
}
$form['#validate'][] = 'module__phone_validate';
}
}
}
Приступим к валидации всех полей типа "telephone".
Саму регулярку можно написать тут что вам больше подходит.
В моём случаи достаточно проверить только на цифры, тире, плюс и скобки.
На выходе получаем такой callback.
/**
* Form validate phone
*/
function module__phone_validate($form, &$form_state) {
$values = &$form_state['values'];
foreach ($form_state['field'] as $key => $field) {
if ($field['und']['field']['type'] == 'telephone') {
// validate
if (preg_match('/[^0-9\(\)\-\+\s]+/', $values[$key]['und'][0]['value'])) {
form_set_error($key, format_string('Поле "@label" не должно содержать букв', array(
'@label' => $field['und']['instance']['label']
)));
}
}
}
}
Теперь у нас есть полноценные поля с телефонами.
Так же можно использовать строгую проверку по маске и jQuery Mask Plugin "+7\s([0-9]{3})\s[0-9]{3}-[0-9]{2}-[0-9]{2}" (+7 (999) 999-99-99).
Удачного кодинга ;).
Добавить комментарий