You are here

function clientside_validation_regular in Clientside Validation 7

Same name and namespace in other branches
  1. 6 clientside_validation_form/clientside_validation_form.module \clientside_validation_regular()
1 call to clientside_validation_regular()
clientside_validation_form_after_build_recurse in clientside_validation_form/clientside_validation_form.module

File

clientside_validation_form/clientside_validation_form.module, line 41
Add clientside validation to regular forms

Code

function clientside_validation_regular($form_id, $element, &$js_rules, $form_state) {
  static $multiples = array();
  $skipvalidation = FALSE;
  if (isset($element['#instance'])) {
    $field_info = $element['#instance'];
  }
  elseif (isset($element['#entity_type']) && isset($element['#field_name']) && isset($element['#bundle'])) {
    $field_info = field_info_instance($element['#entity_type'], $element['#field_name'], $element['#bundle']);
  }
  if (isset($field_info['exclude_cv']) && $field_info['exclude_cv'] == '1') {
    $skipvalidation = TRUE;
  }
  elseif (isset($element['#exclude_cv']) && $element['#exclude_cv']) {

    //skip validation if defined so by form element
    $skipvalidation = TRUE;
  }
  if (isset($element['#name']) && !$skipvalidation) {
    $el_name = $element['#name'];
    $el_title = $el_name;
    if (isset($element['#title'])) {
      $el_title = $element['#title'];
    }
    $is_multiple = FALSE;
    if (isset($element['#multiple'])) {
      $is_multiple = $element['#multiple'];
    }
    $required_error = isset($element['#required_error']) ? $element['#required_error'] : '';
    if ((empty($el_title) || $el_title == $el_name) && isset($field_info)) {
      $el_title = $field_info['label'];
    }
    switch ($element['#type']) {
      case 'textfield':
      case 'password':
      case 'textarea':
      case 'file':
      case 'managed_file':
        if ($element['#type'] == 'managed_file') {
          $el_name = $element['upload']['#name'];
        }
        if ($is_multiple) {

          // Only first field is required
          if (!isset($multiples[$form_id][$el_name])) {
            _clientside_validation_set_required($el_name, $el_title, isset($element['#required']) ? $element['#required'] : FALSE, $js_rules, $required_error);
            $multiples[$form_id][$el_name] = 1;
          }
        }
        else {
          _clientside_validation_set_required($el_name, $el_title, isset($element['#required']) ? $element['#required'] : FALSE, $js_rules, $required_error);
        }
        if (isset($element['#maxlength']) && $element['#maxlength'] > 0) {
          _clientside_validation_set_minmaxlength($el_name, $el_title, '', $element['#maxlength'], $js_rules);
        }
        if (isset($element['#number_type'])) {
          $separator = ".";
          if (isset($element['#entity_type'])) {
            $field = field_widget_field($element, $form_state);
            $instance = field_widget_instance($element, $form_state);
            $min = '';
            $max = '';
            if (isset($instance['settings']['min'])) {
              $min = $instance['settings']['min'];
            }
            if (isset($instance['settings']['max'])) {
              $max = $instance['settings']['max'];
            }
            if ($min !== '' || $max !== '') {
              $decimal_separator = '.';
              if (isset($field['settings']['decimal_separator'])) {
                $decimal_separator = $field['settings']['decimal_separator'];
              }
              _clientside_validation_set_minmax($el_name, $el_title, $min, $max, $js_rules, '', $decimal_separator);
            }
            if (isset($field['settings']['decimal_separator'])) {
              $separator = $field['settings']['decimal_separator'];
            }
          }
          switch ($element['#number_type']) {
            case 'decimal':
            case 'float':
              _clientside_validation_set_number_decimal($el_name, $el_title, $separator, $js_rules);
              break;
            case 'integer':
              _clientside_validation_set_number($el_name, $el_title, $js_rules);
              break;
          }
        }
        if (isset($element['#clientside_validation_type'])) {
          switch ($element['#clientside_validation_type']) {
            case 'email':
              _clientside_validation_set_email($el_name, $el_title, $js_rules);
              break;
            case 'phone':
              $info = field_info_field($element['#field_name']);
              _clientside_validation_set_phone($el_name, $el_title, $info['settings']['country'], $js_rules);
          }
        }
        break;
      case 'select':
        if ($is_multiple) {

          // is this a field or a form api element?
          $el_name .= '[]';
          $min = $element['#required'] ? 1 : 0;
          $max = count($element['#options']);
          if (isset($element['#entity_type'])) {
            $field = field_widget_field($element, $form_state);

            // If field cardinality equals 1, then $is_multiple == FALSE. If field cardinality is unlimited, it is set to -1.
            if ($field['cardinality'] > 1) {
              $max = $field['cardinality'];
            }
          }
          _clientside_validation_set_minmaxlength($el_name, $el_title, $min, $max, $js_rules);
        }
        _clientside_validation_set_required($el_name, $el_title, isset($element['#required']) ? $element['#required'] : FALSE, $js_rules, $required_error);
        if ($element['#required']) {

          // @see http://drupal.org/node/1585554
          $error = isset($js_rules[$el_name]['messages']['required']) ? $js_rules[$el_name]['messages']['required'] : NULL;
          _clientside_validation_set_blacklist($el_name, $el_title, array(
            '_none',
          ), $js_rules, $error);
        }
        break;
      case 'radio':
      case 'radios':
        _clientside_validation_set_required($el_name, $el_title, isset($element['#required']) ? $element['#required'] : FALSE, $js_rules, $required_error);
        break;
      case 'checkbox':
      case 'checkboxes':
        $is_multiple = isset($element['#options']) && count($element['#options']) > 1;
        if ($is_multiple && $element['#required']) {
          $id = '#' . $element['#id'];
          if (isset($element['#entity_type'])) {
            $field = field_widget_field($element, $form_state);
            $max = $field['cardinality'] > 1 ? $field['cardinality'] : 99;
          }
          else {
            $max = count($element['#options']);
          }
          _clientside_validation_set_checkboxgroup_minmax($element['#name'], $el_title, $id, $js_rules, $required_error, 1, $max);
        }
        else {
          _clientside_validation_set_required($el_name, $el_title, isset($element['#required']) ? $element['#required'] : FALSE, $js_rules, $required_error);
        }
        break;
      case 'link_field':
        _clientside_validation_set_url($element['url']['#name'], $el_title, $js_rules);
        break;
      case 'telfield':
        _clientside_validation_set_phone($el_name, $el_title, '', $js_rules);
        break;
      case 'hierarchical_select':
        foreach (element_children($element['hierarchical_select']['selects']) as $child) {
          if ($element['#config']['enforce_deepest'] || $child < 1) {
            $child_name = $element['hierarchical_select']['selects'][$child]['#name'];
            _clientside_validation_set_required($child_name, $el_title, isset($element['#required']) ? $element['#required'] : FALSE, $js_rules, $required_error);
            if ($element['#required']) {
              $error = isset($js_rules[$child_name]['messages']['required']) ? $js_rules[$child_name]['messages']['required'] : NULL;
              _clientside_validation_set_blacklist($child_name, $el_title, array(
                'label_' . $child,
                'none',
                '_none',
              ), $js_rules, $error);
            }
          }
        }
        _clientside_validation_set_required($el_name, $el_title, isset($element['#required']) ? $element['#required'] : FALSE, $js_rules, $required_error);
        break;
      case 'checkbox_tree':
        if ($element['#required']) {
          _clientside_validation_set_checkboxgroup_minmax($el_name, $el_title, '#' . $element['#id'], $js_rules, $required_error);
        }
        break;
      case 'date_popup':
      case 'date_text':
        $date_title = $element['#type'] == 'date_popup' || !isset($element['#date_title']) ? $element['date']['#title'] : $element['#date_title'];
        if (isset($element['date'])) {
          _clientside_validation_set_required($element['date']['#name'], $date_title, isset($element['#required']) ? $element['#required'] : FALSE, $js_rules);
          $granularity = date_format_order($element['#date_format']);
          $format = date_limit_format($element['#date_format'], array_intersect($granularity, array(
            'month',
            'day',
            'year',
          )));
          _clientside_validation_set_date($element['date']['#name'], $date_title, $format, $js_rules);
        }
        if (isset($element['time']) && isset($element['time']['#name'])) {
          _clientside_validation_set_required($element['time']['#name'], $element['time']['#title'], isset($element['#required']) ? $element['#required'] : FALSE, $js_rules);
        }
        break;
      case 'captcha':
        $settings = clientside_validation_settings_current_form();
        if ($settings['validate_options']['captcha'] && isset($element['captcha_widgets'])) {
          $title = _clientside_validation_set_title(isset($element['captcha_widgets']['captcha_response']['#title']) ? $element['captcha_widgets']['captcha_response']['#title'] : $element['#name']);
          $message = t('Wrong answer for !title', array(
            '!title' => $title,
          ));
          $case_sensitive = strpos($element['#captcha_validate'], 'insensitive') === FALSE;
          _clientside_validation_set_captcha($element['captcha_widgets']['captcha_response']['#name'], $title, $element['#captcha_validate'], $js_rules, $message, $element['captcha_token']['#value']);
        }
        break;
    }
    if (!isset($js_rules[$el_name]['required'])) {
      _clientside_validation_set_required($el_name, $el_title, isset($element['#required']) ? $element['#required'] : FALSE, $js_rules, $required_error);
    }
  }
}