adab9fccb84da1b39dc3a401746181f40b1ed04b
[yaffs-website] / vendor / chi-teck / drupal-code-generator / templates / d7 / hook / field_storage_write.twig
1 /**
2  * Implements hook_field_storage_write().
3  */
4 function {{ machine_name }}_field_storage_write($entity_type, $entity, $op, $fields) {
5   list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
6   if (!isset($vid)) {
7     $vid = $id;
8   }
9
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);
15
16     $all_languages = field_available_languages($entity_type, $field);
17     $field_languages = array_intersect($all_languages, array_keys((array) $entity->$field_name));
18
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;
24       if ($languages) {
25         db_delete($table_name)
26           ->condition('entity_type', $entity_type)
27           ->condition('entity_id', $id)
28           ->condition('language', $languages, 'IN')
29           ->execute();
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')
35           ->execute();
36       }
37     }
38
39     // Prepare the multi-insert query.
40     $do_insert = FALSE;
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);
44     }
45     $query = db_insert($table_name)->fields($columns);
46     $revision_query = db_insert($revision_name)->fields($columns);
47
48     foreach ($field_languages as $langcode) {
49       $items = (array) $entity->{$field_name}[$langcode];
50       $delta_count = 0;
51       foreach ($items as $delta => $item) {
52         // We now know we have something to insert.
53         $do_insert = TRUE;
54         $record = array(
55           'entity_type' => $entity_type,
56           'entity_id' => $id,
57           'revision_id' => $vid,
58           'bundle' => $bundle,
59           'delta' => $delta,
60           'language' => $langcode,
61         );
62         foreach ($field['columns'] as $column => $attributes) {
63           $record[_field_sql_storage_columnname($field_name, $column)] = isset($item[$column]) ? $item[$column] : NULL;
64         }
65         $query->values($record);
66         if (isset($vid)) {
67           $revision_query->values($record);
68         }
69
70         if ($field['cardinality'] != FIELD_CARDINALITY_UNLIMITED && ++$delta_count == $field['cardinality']) {
71           break;
72         }
73       }
74     }
75
76     // Execute the query if we have values to insert.
77     if ($do_insert) {
78       $query->execute();
79       $revision_query->execute();
80     }
81   }
82 }