Test translatable fields storage/retrieval.
function testTranslatableFieldSaveLoad() {
// Enable field translations for nodes.
field_test_entity_info_translatable('node', TRUE);
$entity_info = entity_get_info('node');
$this
->assertTrue(count($entity_info['translatable']), 'Nodes are translatable.');
// Prepare the field translations.
field_test_entity_info_translatable('test_entity', TRUE);
$eid = $evid = 1;
$entity_type = 'test_entity';
$entity = field_test_create_entity($eid, $evid, $this->instance['bundle']);
$field_translations = array();
$available_langcodes = field_available_languages($entity_type, $this->field);
$this
->assertTrue(count($available_langcodes) > 1, 'Field is translatable.');
foreach ($available_langcodes as $langcode) {
$field_translations[$langcode] = $this
->_generateTestFieldValues($this->field['cardinality']);
}
// Save and reload the field translations.
$entity->{$this->field_name} = $field_translations;
field_attach_insert($entity);
unset($entity->{$this->field_name});
field_attach_load($entity_type, array(
$eid => $entity,
));
// Check if the correct values were saved/loaded.
foreach ($field_translations as $langcode => $items) {
$result = TRUE;
foreach ($items as $delta => $item) {
$result = $result && $item['value'] == $entity->{$this->field_name}[$langcode][$delta]['value'];
}
$this
->assertTrue($result, format_string('%language translation correctly handled.', array(
'%language' => $langcode,
)));
}
// Test default values.
$field_name_default = drupal_strtolower($this
->randomName() . '_field_name');
$field_definition = $this->field_definition;
$field_definition['field_name'] = $field_name_default;
$field = field_create_field($field_definition);
$instance_definition = $this->instance_definition;
$instance_definition['field_name'] = $field_name_default;
$instance_definition['default_value'] = array(
array(
'value' => rand(1, 127),
),
);
$instance = field_create_instance($instance_definition);
$translation_langcodes = array_slice($available_langcodes, 0, 2);
asort($translation_langcodes);
$translation_langcodes = array_values($translation_langcodes);
$eid++;
$evid++;
$values = array(
'eid' => $eid,
'evid' => $evid,
'fttype' => $instance['bundle'],
'langcode' => $translation_langcodes[0],
);
foreach ($translation_langcodes as $langcode) {
$values[$this->field_name][$langcode] = $this
->_generateTestFieldValues($this->field['cardinality']);
}
$entity = entity_create($entity_type, $values);
ksort($entity->{$field_name_default});
$field_langcodes = array_keys($entity->{$field_name_default});
$this
->assertEqual($translation_langcodes, $field_langcodes, 'Missing translations did not get a default value.');
foreach ($entity->{$field_name_default} as $langcode => $items) {
$this
->assertEqual($items, $instance['default_value'], format_string('Default value correctly populated for language %language.', array(
'%language' => $langcode,
)));
}
// Check that explicit empty values are not overridden with default values.
foreach (array(
NULL,
array(),
) as $empty_items) {
$eid++;
$evid++;
$values = array(
'eid' => $eid,
'evid' => $evid,
'fttype' => $instance['bundle'],
'langcode' => $translation_langcodes[0],
);
foreach ($translation_langcodes as $langcode) {
$values[$this->field_name][$langcode] = $this
->_generateTestFieldValues($this->field['cardinality']);
$values[$field_name_default][$langcode] = $empty_items;
}
$entity = entity_create($entity_type, $values);
foreach ($entity->{$field_name_default} as $langcode => $items) {
$this
->assertEqual($items, $empty_items, format_string('Empty value correctly populated for language %language.', array(
'%language' => $langcode,
)));
}
}
}