You are here

public function SearchApiAttachmentsEntityreferenceAlterSettings::alterItems in Search API attachments 7

Alter items before indexing.

Items which are removed from the array won't be indexed, but will be marked as clean for future indexing. This could for instance be used to implement some sort of access filter for security purposes (e.g., don't index unpublished nodes or comments).

Parameters

array $items: An array of items to be altered, keyed by item IDs.

Overrides SearchApiAttachmentsAlterSettings::alterItems

File

contrib/search_api_attachments_entityreference/includes/callback_attachments_entityreference_settings.inc, line 16
Search API data alteration callback.

Class

SearchApiAttachmentsEntityreferenceAlterSettings

Code

public function alterItems(array &$items) {

  // Get the entity reference fields.
  $entityreference_fields = $this
    ->getEntityReferenceFields();

  // Get the file fields.
  $file_fields = $this
    ->getFileFields();

  // Extension restriction.
  $exclude = array();
  foreach (explode(' ', $this->options['excluded_extensions']) as $ext) {
    $exclude[$ext] = file_get_mimetype('dummy.' . $ext);
  }

  // File size restriction.
  if (isset($this->options['max_file_size'])) {
    $max_file_size = parse_size($this->options['max_file_size']);
  }
  else {
    $max_file_size = '0';
  }
  foreach ($items as &$item) {

    // Support the search_api_et module. It adds its prefix to entity types.
    $entity_type = strpos($this->index->item_type, 'search_api_et_') === 0 ? substr($this->index->item_type, 14) : $this->index->item_type;
    $item_wrapper = entity_metadata_wrapper($entity_type, $item);

    // Case of entity reference fields.
    foreach ($entityreference_fields as $entityreference_field) {
      if (isset($item->{$entityreference_field['field_name']})) {
        $referenced_entities = $item_wrapper->{$entityreference_field['field_name']}
          ->value();

        // Manage case of single value fields by reproducing the structure of
        // multiple values fields.
        if (is_object($referenced_entities)) {
          $referenced_entities = array(
            $referenced_entities,
          );
        }

        // Index the files content.
        if (!empty($referenced_entities) && $entityreference_field['settings']['target_type'] == 'file') {
          if ($content = $this
            ->getFilesContent($referenced_entities, $exclude, $max_file_size)) {
            $item->{'attachments_' . $entityreference_field['field_name']} = $content;
          }
        }
        elseif (!empty($file_fields) && !empty($referenced_entities)) {
          foreach ($file_fields as $file_field) {
            foreach ($referenced_entities as $referenced_entity) {

              // The referenced entity has the file field.
              if (isset($referenced_entity->{$file_field['field_name']}) && !empty($referenced_entity->{$file_field['field_name']})) {

                // Get the files.
                $files = field_get_items($entityreference_field['settings']['target_type'], $referenced_entity, $file_field['field_name']);
                if (!empty($files)) {
                  if ($content = $this
                    ->getFilesContent($files, $exclude, $max_file_size)) {
                    $item->{'attachments_' . $file_field['field_name']} = $content;
                  }
                }
              }
            }
          }
        }
      }
    }
  }
}