2 * Implements hook_field_storage_write().
4 function {{ machine_name }}_field_storage_write($entity_type, $entity, $op, $fields) {
5 list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
10 foreach ($fields as $field_id) {
11 $field = field_info_field_by_id($field_id);
12 $field_name = $field['field_name'];
13 $table_name = _field_sql_storage_tablename($field);
14 $revision_name = _field_sql_storage_revision_tablename($field);
16 $all_languages = field_available_languages($entity_type, $field);
17 $field_languages = array_intersect($all_languages, array_keys((array) $entity->$field_name));
19 // Delete and insert, rather than update, in case a value was added.
20 if ($op == FIELD_STORAGE_UPDATE) {
21 // Delete languages present in the incoming $entity->$field_name.
22 // Delete all languages if $entity->$field_name is empty.
23 $languages = !empty($entity->$field_name) ? $field_languages : $all_languages;
25 db_delete($table_name)
26 ->condition('entity_type', $entity_type)
27 ->condition('entity_id', $id)
28 ->condition('language', $languages, 'IN')
30 db_delete($revision_name)
31 ->condition('entity_type', $entity_type)
32 ->condition('entity_id', $id)
33 ->condition('revision_id', $vid)
34 ->condition('language', $languages, 'IN')
39 // Prepare the multi-insert query.
41 $columns = array('entity_type', 'entity_id', 'revision_id', 'bundle', 'delta', 'language');
42 foreach ($field['columns'] as $column => $attributes) {
43 $columns[] = _field_sql_storage_columnname($field_name, $column);
45 $query = db_insert($table_name)->fields($columns);
46 $revision_query = db_insert($revision_name)->fields($columns);
48 foreach ($field_languages as $langcode) {
49 $items = (array) $entity->{$field_name}[$langcode];
51 foreach ($items as $delta => $item) {
52 // We now know we have something to insert.
55 'entity_type' => $entity_type,
57 'revision_id' => $vid,
60 'language' => $langcode,
62 foreach ($field['columns'] as $column => $attributes) {
63 $record[_field_sql_storage_columnname($field_name, $column)] = isset($item[$column]) ? $item[$column] : NULL;
65 $query->values($record);
67 $revision_query->values($record);
70 if ($field['cardinality'] != FIELD_CARDINALITY_UNLIMITED && ++$delta_count == $field['cardinality']) {
76 // Execute the query if we have values to insert.
79 $revision_query->execute();