четверг, 19 мая, 2016 - 12:13

Для начала есть замечательный модуль "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).

Удачного кодинга ;).

Добавить комментарий

Plain text

  • HTML-теги не обрабатываются и показываются как обычный текст
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и параграфы переносятся автоматически.