function hook_field_storage_write

Write field data for an entity.

This hook is invoked from field_attach_insert() and field_attach_update(), to ask the field storage module to save field data.

Parameters

\Drupal\Core\Entity\EntityInterface $entity: The entity on which to operate.

$op: FIELD_STORAGE_UPDATE when updating an existing entity, FIELD_STORAGE_INSERT when inserting a new entity.

$fields: An array listing the fields to be written. The keys and values of the array are field UUIDs.

Related topics

2 functions implement hook_field_storage_write()

Note: this list is generated by pattern matching, so it may include some functions that are not actually implementations of this hook.

field_sql_storage_field_storage_write in drupal/core/modules/field_sql_storage/field_sql_storage.module
Implements hook_field_storage_write().
field_test_field_storage_write in drupal/core/modules/field/tests/modules/field_test/field_test.storage.inc
Implements hook_field_storage_write().
2 invocations of hook_field_storage_write()
field_attach_insert in drupal/core/modules/field/field.attach.inc
Save field data for a new entity.
field_attach_update in drupal/core/modules/field/field.attach.inc
Saves field data for an existing entity.

File

drupal/core/modules/field/field.api.php, line 1343

Code

function hook_field_storage_write(\Drupal\Core\Entity\EntityInterface $entity, $op, $fields) {
  $id = $entity
    ->id();
  $vid = $entity
    ->getRevisionId();
  $bundle = $entity
    ->bundle();
  if (!isset($vid)) {
    $vid = $id;
  }
  foreach ($fields as $field_id) {
    $field = field_info_field_by_id($field_id);
    $field_name = $field['field_name'];
    $table_name = _field_sql_storage_tablename($field);
    $revision_name = _field_sql_storage_revision_tablename($field);
    $all_langcodes = field_available_languages($entity
      ->entityType(), $field);
    $field_langcodes = array_intersect($all_langcodes, array_keys((array) $entity->{$field_name}));

    // Delete and insert, rather than update, in case a value was added.
    if ($op == FIELD_STORAGE_UPDATE) {

      // Delete language codes present in the incoming $entity->$field_name.
      // Delete all language codes if $entity->$field_name is empty.
      $langcodes = !empty($entity->{$field_name}) ? $field_langcodes : $all_langcodes;
      if ($langcodes) {
        db_delete($table_name)
          ->condition('entity_type', $entity
          ->entityType())
          ->condition('entity_id', $id)
          ->condition('langcode', $langcodes, 'IN')
          ->execute();
        db_delete($revision_name)
          ->condition('entity_type', $entity
          ->entityType())
          ->condition('entity_id', $id)
          ->condition('revision_id', $vid)
          ->condition('langcode', $langcodes, 'IN')
          ->execute();
      }
    }

    // Prepare the multi-insert query.
    $do_insert = FALSE;
    $columns = array(
      'entity_type',
      'entity_id',
      'revision_id',
      'bundle',
      'delta',
      'langcode',
    );
    foreach ($field['columns'] as $column => $attributes) {
      $columns[] = _field_sql_storage_columnname($field_name, $column);
    }
    $query = db_insert($table_name)
      ->fields($columns);
    $revision_query = db_insert($revision_name)
      ->fields($columns);
    foreach ($field_langcodes as $langcode) {
      $items = (array) $entity->{$field_name}[$langcode];
      $delta_count = 0;
      foreach ($items as $delta => $item) {

        // We now know we have someting to insert.
        $do_insert = TRUE;
        $record = array(
          'entity_type' => $entity
            ->entityType(),
          'entity_id' => $id,
          'revision_id' => $vid,
          'bundle' => $bundle,
          'delta' => $delta,
          'langcode' => $langcode,
        );
        foreach ($field['columns'] as $column => $attributes) {
          $record[_field_sql_storage_columnname($field_name, $column)] = isset($item[$column]) ? $item[$column] : NULL;
        }
        $query
          ->values($record);
        if (isset($vid)) {
          $revision_query
            ->values($record);
        }
        if ($field['cardinality'] != FIELD_CARDINALITY_UNLIMITED && ++$delta_count == $field['cardinality']) {
          break;
        }
      }
    }

    // Execute the query if we have values to insert.
    if ($do_insert) {
      $query
        ->execute();
      $revision_query
        ->execute();
    }
  }
}