diff options
author | webchick <webchick@24967.no-reply.drupal.org> | 2011-06-21 22:31:35 -0700 |
---|---|---|
committer | webchick <webchick@24967.no-reply.drupal.org> | 2011-06-21 22:31:35 -0700 |
commit | 4e934df8eb6b96b055b5b066e127fcd7c6b35e1b (patch) | |
tree | d3fb5a8d357d4f2da7bf623ff4f5483d9a561c62 /modules | |
parent | 2d884d27a8aa58cda056c8aa2480a92d2a60b3c9 (diff) | |
download | brdo-4e934df8eb6b96b055b5b066e127fcd7c6b35e1b.tar.gz brdo-4e934df8eb6b96b055b5b066e127fcd7c6b35e1b.tar.bz2 |
Issue #1169426 by plach, fietserwin, sun: Fixed Field invoke multiple does not handle field language correctly.
Diffstat (limited to 'modules')
-rw-r--r-- | modules/field/field.attach.inc | 19 | ||||
-rw-r--r-- | modules/field/tests/field.test | 8 | ||||
-rw-r--r-- | modules/field/tests/field_test.module | 9 |
3 files changed, 23 insertions, 13 deletions
diff --git a/modules/field/field.attach.inc b/modules/field/field.attach.inc index 6ec95c73a..adfaf46c4 100644 --- a/modules/field/field.attach.inc +++ b/modules/field/field.attach.inc @@ -303,9 +303,6 @@ function _field_invoke_multiple($op, $entity_type, $entities, &$a = NULL, &$b = if (!isset($fields[$field_id])) { $fields[$field_id] = $field; } - // Group the corresponding instances and entities. - $grouped_instances[$field_id][$id] = $instance; - $grouped_entities[$field_id][$id] = $entities[$id]; // Extract the field values into a separate variable, easily accessed // by hook implementations. // Unless a language suggestion is provided we iterate on all the @@ -315,6 +312,10 @@ function _field_invoke_multiple($op, $entity_type, $entities, &$a = NULL, &$b = $languages = _field_language_suggestion($available_languages, $language, $field_name); foreach ($languages as $langcode) { $grouped_items[$field_id][$langcode][$id] = isset($entity->{$field_name}[$langcode]) ? $entity->{$field_name}[$langcode] : array(); + // Group the instances and entities corresponding to the current + // field. + $grouped_instances[$field_id][$langcode][$id] = $instance; + $grouped_entities[$field_id][$langcode][$id] = $entities[$id]; } } } @@ -327,8 +328,10 @@ function _field_invoke_multiple($op, $entity_type, $entities, &$a = NULL, &$b = $field_name = $field['field_name']; $function = $options['default'] ? 'field_default_' . $op : $field['module'] . '_field_' . $op; // Iterate over all the field translations. - foreach ($grouped_items[$field_id] as $langcode => $items) { - $results = $function($entity_type, $grouped_entities[$field_id], $field, $grouped_instances[$field_id], $langcode, $grouped_items[$field_id][$langcode], $a, $b); + foreach ($grouped_items[$field_id] as $langcode => &$items) { + $entities = $grouped_entities[$field_id][$langcode]; + $instances = $grouped_instances[$field_id][$langcode]; + $results = $function($entity_type, $entities, $field, $instances, $langcode, $items, $a, $b); if (isset($results)) { // Collect results by entity. // For hooks with array results, we merge results together. @@ -346,9 +349,9 @@ function _field_invoke_multiple($op, $entity_type, $entities, &$a = NULL, &$b = // Populate field values back in the entities, but avoid replacing missing // fields with an empty array (those are not equivalent on update). - foreach ($grouped_entities[$field_id] as $id => $entity) { - foreach ($grouped_items[$field_id] as $langcode => $items) { - if (isset($grouped_items[$field_id][$langcode][$id]) && ($grouped_items[$field_id][$langcode][$id] !== array() || isset($entity->{$field_name}[$langcode]))) { + foreach ($grouped_entities[$field_id] as $langcode => $entities) { + foreach ($entities as $id => $entity) { + if ($grouped_items[$field_id][$langcode][$id] !== array() || isset($entity->{$field_name}[$langcode])) { $entity->{$field_name}[$langcode] = $grouped_items[$field_id][$langcode][$id]; } } diff --git a/modules/field/tests/field.test b/modules/field/tests/field.test index 9281273f6..ebb1c9f91 100644 --- a/modules/field/tests/field.test +++ b/modules/field/tests/field.test @@ -2681,6 +2681,9 @@ class FieldTranslationsTestCase extends FieldTestCase { * Test the multilanguage logic of _field_invoke(). */ function testFieldInvoke() { + // Enable field translations for the entity. + field_test_entity_info_translatable('test_entity', TRUE); + $entity_type = 'test_entity'; $entity = field_test_create_stub_entity(0, 0, $this->instance['bundle']); @@ -2708,6 +2711,7 @@ class FieldTranslationsTestCase extends FieldTestCase { // forwarded to the callback function. $this->assertEqual($hash, $result, t('The result for %language is correctly stored.', array('%language' => $langcode))); } + $this->assertEqual(count($results), count($available_languages), t('No unavailable language has been processed.')); } @@ -2767,8 +2771,8 @@ class FieldTranslationsTestCase extends FieldTestCase { foreach ($results as $langcode => $result) { if (isset($values[$id][$langcode])) { $hash = hash('sha256', serialize(array($entity_type, $entities[$id], $this->field_name, $langcode, $values[$id][$langcode]))); - // Check whether the parameters passed to _field_invoke() were correctly - // forwarded to the callback function. + // Check whether the parameters passed to _field_invoke_multiple() + // were correctly forwarded to the callback function. $this->assertEqual($hash, $result, t('The result for entity %id/%language is correctly stored.', array('%id' => $id, '%language' => $langcode))); } } diff --git a/modules/field/tests/field_test.module b/modules/field/tests/field_test.module index 9e2fef62c..7f43fbf09 100644 --- a/modules/field/tests/field_test.module +++ b/modules/field/tests/field_test.module @@ -88,9 +88,12 @@ function field_test_field_test_op($entity_type, $entity, $field, $instance, $lan function field_test_field_test_op_multiple($entity_type, $entities, $field, $instances, $langcode, &$items) { $result = array(); foreach ($entities as $id => $entity) { - if (isset($items[$id])) { - $result[$id] = array($langcode => hash('sha256', serialize(array($entity_type, $entity, $field['field_name'], $langcode, $items[$id])))); - } + // Entities, instances and items are assumed to be consistently grouped by + // language. To verify this we try to access all the passed data structures + // by entity id. If they are grouped correctly, one entity, one instance and + // one array of items should be available for each entity id. + $field_name = $instances[$id]['field_name']; + $result[$id] = array($langcode => hash('sha256', serialize(array($entity_type, $entity, $field_name, $langcode, $items[$id])))); } return $result; } |