You are here

class SearchApiAttachmentsEntityreferenceAlterSettings in Search API attachments 7

Hierarchy

Expanded class hierarchy of SearchApiAttachmentsEntityreferenceAlterSettings

1 string reference to 'SearchApiAttachmentsEntityreferenceAlterSettings'
search_api_attachments_entityreference_search_api_alter_callback_info in contrib/search_api_attachments_entityreference/search_api_attachments_entityreference.module
Implements hook_search_api_alter_callback_info().

File

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

View source
class SearchApiAttachmentsEntityreferenceAlterSettings extends SearchApiAttachmentsAlterSettings {

  /**
   * {@inheritdoc}
   */
  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;
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
  }

  /**
   * {@inheritdoc}
   */
  public function propertyInfo() {
    $ret = array();
    if ($this->index
      ->getEntityType() == 'file') {
      $ret['attachments_content'] = array(
        'label' => 'File content',
        'description' => 'File content',
        'type' => 'text',
      );
    }
    else {
      $fields = $this
        ->getFileFields() + $this
        ->getEntityReferenceFields();
      foreach ($fields as $name => $field) {
        $ret['attachments_' . $name] = array(
          'label' => 'Attachment content: ' . $name,
          'description' => $name,
          'type' => 'text',
        );
      }
    }
    return $ret;
  }

  /**
   * {@inheritdoc}
   */
  protected function getFileFields() {
    $ret = array();
    foreach (field_info_fields() as $name => $field) {
      if ($field['type'] == 'file') {
        $ret[$name] = $field;
      }
    }
    return $ret;
  }

  /**
   * {@inheritdoc}
   */
  protected function getEntityReferenceFields() {
    $ret = array();
    foreach (field_info_fields() as $name => $field) {
      if ($field['type'] == 'entityreference') {
        $ret[$name] = $field;
      }
    }
    return $ret;
  }

  /**
   * Extracts and returns contents of files.
   *
   * @param array $files
   *   The array of file objects/arrays.
   * @param array $exclude
   *   The array of file extensions to exclude.
   * @param int $max_file_size
   *   The maximum file size.
   *
   * @return string
   *   Extracted contents of files imploded by the space character.
   */
  protected function getFilesContent($files, $exclude, $max_file_size) {
    $ret = '';

    // Limit to the max number of value per field.
    if (isset($this->options['number_indexed']) && $this->options['number_indexed'] != '0' && count($files) > $this->options['number_indexed']) {
      $files = array_slice($files, 0, $this->options['number_indexed']);
    }
    foreach ($files as $file) {
      $file = (array) $file;

      // Private file restriction.
      if (!$this
        ->isTemporary($file) && !($this->options['excluded_private'] && $this
        ->isPrivate($file))) {

        // Extension restriction.
        if (!in_array($file['filemime'], $exclude)) {

          // File size restriction.
          $file_size_errors = file_validate_size((object) $file, $max_file_size);
          if (empty($file_size_errors)) {
            $ret .= ' ' . $this
              ->getFileContent($file);
          }
        }
      }
    }
    return trim($ret);
  }

}

Members

Namesort descending Modifiers Type Description Overrides
SearchApiAbstractAlterCallback::$index protected property The index whose items will be altered.
SearchApiAbstractAlterCallback::$options protected property The configuration options for this callback, if it has any.
SearchApiAbstractAlterCallback::configurationFormSubmit public function Implements SearchApiAlterCallbackInterface::configurationFormSubmit(). Overrides SearchApiAlterCallbackInterface::configurationFormSubmit 4
SearchApiAbstractAlterCallback::configurationFormValidate public function Implements SearchApiAlterCallbackInterface::configurationFormValidate(). Overrides SearchApiAlterCallbackInterface::configurationFormValidate 1
SearchApiAbstractAlterCallback::isMultiEntityIndex protected function Determines whether the given index contains multiple types of entities.
SearchApiAbstractAlterCallback::supportsIndex public function Implements SearchApiAlterCallbackInterface::supportsIndex(). Overrides SearchApiAlterCallbackInterface::supportsIndex 10
SearchApiAbstractAlterCallback::__construct public function Implements SearchApiAlterCallbackInterface::__construct(). Overrides SearchApiAlterCallbackInterface::__construct 1
SearchApiAttachmentsAlterSettings::CACHE_TABLE constant 1
SearchApiAttachmentsAlterSettings::configurationForm public function Adds configuration form. Overrides SearchApiAbstractAlterCallback::configurationForm
SearchApiAttachmentsAlterSettings::extractExif protected function Extracts images metadata.
SearchApiAttachmentsAlterSettings::extractPdftotext protected function Extracts pdf file content using pdftotext.
SearchApiAttachmentsAlterSettings::extractPythonPdf2txt protected function Extracts pdf file content using python pdf2txt script.
SearchApiAttachmentsAlterSettings::extractSimple protected function Extracts file content for text files.
SearchApiAttachmentsAlterSettings::extractSolr protected function Extract data using Solr.
SearchApiAttachmentsAlterSettings::extractTika protected function Extracts file content using local tika executable.
SearchApiAttachmentsAlterSettings::extractTikaServer protected function Extracts file content using a tika server.
SearchApiAttachmentsAlterSettings::getFileContent protected function Extracts th file content.
SearchApiAttachmentsAlterSettings::getIndexableFileFields protected function Retrieve list of fields, that should be indexed.
SearchApiAttachmentsAlterSettings::getRealpath protected function Helper method to get a file's real path.
SearchApiAttachmentsAlterSettings::imageMimetypes protected function Helper function to store image's mimetypes.
SearchApiAttachmentsAlterSettings::isFileIndexable public function Checks if file is allowed to be indexed. 1
SearchApiAttachmentsAlterSettings::isMultipleIndexWithFile protected function
SearchApiAttachmentsAlterSettings::isPrivate protected function Check if the file is private.
SearchApiAttachmentsAlterSettings::isTemporary protected function Check if the file is temporary.
SearchApiAttachmentsAlterSettings::pdfMimetypes protected function Helper function to store pdf's mimetypes.
SearchApiAttachmentsAlterSettings::textMimetypes protected function Helper function to store text's mimetypes.
SearchApiAttachmentsEntityreferenceAlterSettings::alterItems public function Alter items before indexing. Overrides SearchApiAttachmentsAlterSettings::alterItems
SearchApiAttachmentsEntityreferenceAlterSettings::getEntityReferenceFields protected function
SearchApiAttachmentsEntityreferenceAlterSettings::getFileFields protected function Helper method to get all file fields. Overrides SearchApiAttachmentsAlterSettings::getFileFields
SearchApiAttachmentsEntityreferenceAlterSettings::getFilesContent protected function Extracts and returns contents of files.
SearchApiAttachmentsEntityreferenceAlterSettings::propertyInfo public function Adds attachments property. Overrides SearchApiAttachmentsAlterSettings::propertyInfo