You are here

function image_field_caption_field_attach_update in Image Field Caption 7.2

Implements hook_field_attach_update().

1 call to image_field_caption_field_attach_update()
image_field_caption_field_attach_insert in ./image_field_caption.module
Implements hook_field_attach_insert().

File

./image_field_caption.module, line 235
Provides a caption textarea for image fields.

Code

function image_field_caption_field_attach_update($entity_type, $entity) {
  list($id, $vid, $bundle) = entity_extract_ids($entity_type, $entity);
  if (!isset($vid)) {
    $vid = $id;
  }
  $image_fields = image_field_caption_get_image_fields($entity_type, $bundle);
  foreach ($image_fields as $field_name => $image_field) {

    // Skip the caption when it isn't present, or if it is disabled.
    if (!isset($image_field['settings']['image_field_caption']) || !$image_field['settings']['image_field_caption']['enabled']) {
      continue;
    }
    $field = field_info_field($field_name);
    $table_name = 'field_image_field_caption';
    $revision_name = 'field_image_field_caption_revision';
    $all_languages = field_available_languages($entity_type, $field);
    if (!isset($entity->{$field_name})) {
      continue;
    }
    $field_languages = array_intersect($all_languages, array_keys((array) $entity->{$field_name}));

    // Delete and insert, rather than update, in case a value was added.
    // Delete languages present in the incoming $entity->$field_name.
    // Delete all languages if $entity->$field_name is empty.
    $languages = !empty($entity->{$field_name}) ? $field_languages : $all_languages;
    if ($languages) {
      db_delete($table_name)
        ->condition('field_name', $field_name)
        ->condition('entity_type', $entity_type)
        ->condition('entity_id', $id)
        ->condition('language', $languages, 'IN')
        ->execute();
      db_delete($revision_name)
        ->condition('field_name', $field_name)
        ->condition('entity_type', $entity_type)
        ->condition('entity_id', $id)
        ->condition('revision_id', $vid)
        ->condition('language', $languages, 'IN')
        ->execute();
    }

    // Prepare the multi-insert query.
    $do_insert = FALSE;
    $columns = array(
      'field_name',
      'entity_type',
      'entity_id',
      'revision_id',
      'bundle',
      'delta',
      'language',
      'caption',
      'caption_format',
    );
    $query = db_insert($table_name)
      ->fields($columns);
    $revision_query = db_insert($revision_name)
      ->fields($columns);
    foreach ($field_languages as $langcode) {
      $items = (array) $entity->{$field_name}[$langcode];
      $delta_count = 0;
      foreach ($items as $delta => $item) {
        if (empty($item['image_field_caption']['value'])) {
          continue;
        }

        // We now know we have someting to insert.
        $do_insert = TRUE;
        $record = array(
          'field_name' => $field_name,
          'entity_type' => $entity_type,
          'entity_id' => $id,
          'revision_id' => $vid,
          'bundle' => $bundle,
          'delta' => $delta,
          'language' => $langcode,
          'caption' => $item['image_field_caption']['value'],
          'caption_format' => $item['image_field_caption']['format'],
        );
        $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();
    }
  }
}