You are here

public static function LocalizeFields::fieldAttachValidate in Localize Fields 7

Translates error messages created by implementations of hook_field_validate().

Also corrects decimal separator in decimals and floats.

NB: number_field_validate() checks min/max.

See https://drupal.org/node/1283718.

Used by hook_field_attach_validate() implementation.

Parameters

array $entity:

array &$errors:

See also

number_field_validate()

1 call to LocalizeFields::fieldAttachValidate()
localize_fields_field_attach_validate in ./localize_fields.module
Translates error messages created by implementations of hook_field_validate().

File

./LocalizeFields.inc, line 809
Drupal Localize Fields module

Class

LocalizeFields
@file Drupal Localize Fields module

Code

public static function fieldAttachValidate($entity, &$errors) {
  if (($localize = self::$localize) == -1) {

    // Save a method call if possible.
    $localize = self::localize();
  }
  if (!$localize) {
    return;
  }
  $cntxtDelim = self::CONTEXT_DELIMITER;
  $context_instance = '';

  // Find bundle.
  if (!empty($entity->form_id) && !empty($entity->type) && empty($entity->field_name)) {
    $context = 'field_instance' . $cntxtDelim . $entity->type . self::CONTEXT_DELIMITER_BUNDLE;
  }
  elseif (!empty($entity->field_name)) {

    // Bundle is (field_collection) field_name.
    $context = 'field_instance' . $cntxtDelim . $entity->field_name . self::CONTEXT_DELIMITER_BUNDLE;
  }
  else {

    // Awful.
    if (module_exists('inspect') && user_access('inspect log')) {
      inspect(array(
        'entity' => $entity,
        'errors' => $errors,
      ), array(
        'depth' => 2,
        'category' => 'localize_fields',
        'message' => 'Can\'t find bundle equiv. property of entity',
        'severity' => WATCHDOG_WARNING,
      ));
    }
    else {
      watchdog('localize_fields', __CLASS__ . '::' . __FUNCTION__ . ': Can\'t find bundle equiv. property of entity, erring field names: @field_names.', array(
        '@field_names' => array_keys($errors),
      ), WATCHDOG_WARNING);
    }
    return;
  }
  $lenPlaceholderStart = strlen($placeholderStart = '<em class="placeholder">');
  $lenPlaceholderEnd = strlen($placeholderEnd = '</em>');

  // $errors['some_field_name']['und'][0][0]['message']
  foreach ($errors as $field_name => $errors_byValueLanguage) {
    if ($context) {
      $context_instance = $context . $field_name . $cntxtDelim . 'label';
    }
    $decimal_separator = NULL;
    foreach ($errors_byValueLanguage as $language => $errors_byInstance) {
      foreach ($errors_byInstance as $instance => $errorList) {
        foreach ($errorList as $index => $error) {

          // error [
          //   'error': 'number_min',
          //   'message': '<em class="placeholder">The field label</em>: the value may be no less than <em class="placeholder">0.01</em>.'
          // ]
          if (!empty($error['message'])) {
            $message = $error['message'];

            // Do it thrice, because there may be more placeholders.
            for ($i = 0; $i < 3; ++$i) {
              if (($start = strpos($message, $placeholderStart)) !== FALSE && ($end = strpos($message, $placeholderEnd))) {
                $start += $lenPlaceholderStart;
                $msStart = str_replace($placeholderStart, '!PLACEHOLDER', substr($message, 0, $start));
                $ms = substr($message, $start, $end - $start);

                // Replace decimal separator...
                if (is_numeric($ms)) {
                  if (strpos($ms, '.') !== FALSE) {
                    if (!$decimal_separator) {
                      $field_settings = field_info_field($field_name);
                      $decimal_separator = !empty($field_settings['settings']['decimal_separator']) ? $field_settings['settings']['decimal_separator'] : '.';
                      unset($field_settings);
                    }
                    if ($decimal_separator != '.') {
                      $ms = str_replace('.', $decimal_separator, $ms);
                    }
                  }
                }
                else {

                  // Not escaped with check_plain() due to double encoding.
                  $ms = self::translateInternal($ms, $context_instance, TRUE);
                }
                $message = $msStart . $ms . str_replace($placeholderEnd, '!_PLACEHOLDER', substr($message, $end, $lenPlaceholderEnd)) . substr($message, $end + $lenPlaceholderEnd);
              }
            }
            $message = str_replace(array(
              '!PLACEHOLDER',
              '!_PLACEHOLDER',
            ), array(
              $placeholderStart,
              $placeholderEnd,
            ), $message);
            $errors[$field_name][$language][$instance][$index]['message'] = $message;
          }
        }
      }
    }
  }
}