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
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;
}
}
}
}
}
}