You are here

class SolrDocument in Search API Solr 8.3

Same name in this branch
  1. 8.3 src/Plugin/DataType/SolrDocument.php \Drupal\search_api_solr\Plugin\DataType\SolrDocument
  2. 8.3 src/Plugin/search_api/datasource/SolrDocument.php \Drupal\search_api_solr\Plugin\search_api\datasource\SolrDocument
Same name and namespace in other branches
  1. 8.2 src/Plugin/search_api/datasource/SolrDocument.php \Drupal\search_api_solr\Plugin\search_api\datasource\SolrDocument
  2. 4.x src/Plugin/search_api/datasource/SolrDocument.php \Drupal\search_api_solr\Plugin\search_api\datasource\SolrDocument

Represents a datasource which exposes external Solr Documents.

Plugin annotation


@SearchApiDatasource(
  id = "solr_document",
  label = @Translation("Solr Document"),
  description = @Translation("Search through external Solr content. (Only works if this index is attached to a Solr-based server.)"),
)

Hierarchy

Expanded class hierarchy of SolrDocument

File

src/Plugin/search_api/datasource/SolrDocument.php, line 25

Namespace

Drupal\search_api_solr\Plugin\search_api\datasource
View source
class SolrDocument extends DatasourcePluginBase implements PluginFormInterface {
  protected $solr_field = 'solr_field';
  protected $solr_document = 'solr_document';
  use PluginFormTrait;
  use LoggerTrait;

  /**
   * The Solr document factory.
   *
   * @var \Drupal\search_api_solr\SolrDocumentFactoryInterface
   */
  protected $solrDocumentFactory;

  /**
   * The Solr field manager.
   *
   * @var \Drupal\search_api_solr\SolrFieldManagerInterface
   */
  protected $solrFieldManager;

  /**
   * Sets the Solr document factory.
   *
   * @param \Drupal\search_api_solr\SolrDocumentFactoryInterface $factory
   *   The new entity field manager.
   *
   * @return $this
   */
  public function setSolrDocumentFactory(SolrDocumentFactoryInterface $factory) {
    $this->solrDocumentFactory = $factory;
    return $this;
  }

  /**
   * Returns the Solr document factory.
   *
   * @return \Drupal\search_api_solr\SolrDocumentFactoryInterface
   *   The Solr document factory.
   */
  public function getSolrDocumentFactory() {
    return $this->solrDocumentFactory ?: \Drupal::getContainer()
      ->get($this->solr_document . '.factory');
  }

  /**
   * Sets the Solr field manager.
   *
   * @param \Drupal\search_api_solr\SolrFieldManagerInterface $solr_field_manager
   *   The new entity field manager.
   *
   * @return $this
   */
  public function setSolrFieldManager(SolrFieldManagerInterface $solr_field_manager) {
    $this->solrFieldManager = $solr_field_manager;
    return $this;
  }

  /**
   * Returns the Solr field manager.
   *
   * @return \Drupal\search_api_solr\SolrFieldManagerInterface
   *   The Solr field manager.
   */
  public function getSolrFieldManager() {
    return $this->solrFieldManager ?: \Drupal::getContainer()
      ->get($this->solr_field . '.manager');
  }

  /**
   * {@inheritdoc}
   *
   * @throws \Drupal\Core\TypedData\Exception\MissingDataException
   */
  public function getItemId(ComplexDataInterface $item) {
    return $this
      ->getFieldValue($item, 'id_field');
  }

  /**
   * {@inheritdoc}
   *
   * @throws \Drupal\Core\TypedData\Exception\MissingDataException
   */
  public function getItemLabel(ComplexDataInterface $item) {
    return $this
      ->getFieldValue($item, 'label_field');
  }

  /**
   * {@inheritdoc}
   *
   * @throws \Drupal\Core\TypedData\Exception\MissingDataException
   */
  public function getItemLanguage(ComplexDataInterface $item) {
    if ($this->configuration['language_field']) {
      return $this
        ->getFieldValue($item, 'language_field');
    }
    return parent::getItemLanguage($item);
  }

  /**
   * {@inheritdoc}
   *
   * @throws \Drupal\Core\TypedData\Exception\MissingDataException
   */
  public function getItemUrl(ComplexDataInterface $item) {
    try {
      return Url::fromUri($this
        ->getFieldValue($item, 'url_field'));
    } catch (\InvalidArgumentException $e) {

      // Log the exception and return NULL.
      $this
        ->logException($e);
    }
  }

  /**
   * Retrieves a scalar field value from a result item.
   *
   * @param \Drupal\Core\TypedData\ComplexDataInterface $item
   *   The result item.
   * @param string $config_key
   *   The key in the configuration.
   *
   * @return mixed|null
   *   The scalar value of the specified field (first value for multi-valued
   *   fields), if it exists; NULL otherwise.
   *
   * @throws \Drupal\Core\TypedData\Exception\MissingDataException
   */
  protected function getFieldValue(ComplexDataInterface $item, $config_key) {
    if (empty($this->configuration[$config_key])) {
      return NULL;
    }
    $values = $item
      ->get($this->configuration[$config_key])
      ->getValue();
    if (is_array($values)) {
      $values = $values ? reset($values) : NULL;
    }
    return $values ?: NULL;
  }

  /**
   * {@inheritdoc}
   */
  public function getPropertyDefinitions() {
    return $this
      ->getSolrFieldManager()
      ->getFieldDefinitions($this->index);
  }

  /**
   * {@inheritdoc}
   */
  public function loadMultiple(array $ids) {
    $documents = [];
    try {

      // Query the index for the Solr documents.
      $results = $this->index
        ->query()
        ->addCondition('search_api_id', $ids, 'IN')
        ->execute()
        ->getResultItems();
      foreach ($results as $id => $result) {
        $documents[$id] = $this->solrDocumentFactory
          ->create($result);
      }
    } catch (SearchApiException $e) {

      // Couldn't load items from server, return an empty array.
    }
    return $documents;
  }

  /**
   * {@inheritdoc}
   */
  public function defaultConfiguration() {
    $config = [];
    $config['id_field'] = '';
    $config['request_handler'] = '';
    $config['label_field'] = '';
    $config['language_field'] = '';
    $config['url_field'] = '';
    $config['default_query'] = '*:*';
    return $config;
  }

  /**
   * {@inheritdoc}
   */
  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {

    // Get the available fields from the server (if a server has already been
    // set).
    $fields = $single_valued_fields = [];
    foreach ($this
      ->getPropertyDefinitions() as $name => $property) {
      $fields[$name] = $property
        ->getLabel();
      if (!$property
        ->isList()) {
        $single_valued_fields[$name] = $property
          ->getLabel();
      }
    }
    $form['id_field'] = [
      '#type' => 'textfield',
      '#title' => $this
        ->t('ID field'),
      '#required' => TRUE,
      '#description' => $this
        ->t('Enter the name of the field from your Solr schema that contains unique ID values.'),
      '#default_value' => $this->configuration['id_field'],
    ];

    // If there is already a valid server, we can transform the text field into
    // a select box.
    if ($single_valued_fields) {
      $form['id_field']['#type'] = 'select';
      $form['id_field']['#options'] = $single_valued_fields;
      $form['id_field']['#description'] = $this
        ->t('Select the Solr index field that contains unique ID values.');
    }
    $form['advanced'] = [
      '#type' => 'details',
      '#title' => $this
        ->t('Advanced configuration'),
    ];
    $form['advanced']['request_handler'] = [
      '#type' => 'textfield',
      '#title' => $this
        ->t('Request handler'),
      '#description' => $this
        ->t("Enter the name of a requestHandler from the core's solrconfig.xml file.  This should only be necessary if you need to specify a handler to use other than the default."),
      '#default_value' => $this->configuration['request_handler'],
    ];
    $form['advanced']['default_query'] = [
      '#type' => 'textfield',
      '#title' => $this
        ->t('Default query'),
      '#description' => $this
        ->t("Enter a default query parameter. This is only necessary if a default query cannot be specified in the solrconfig.xml file."),
      '#default_value' => $this->configuration['default_query'],
    ];
    $form['advanced']['label_field'] = [
      '#type' => 'textfield',
      '#title' => $this
        ->t('Label field'),
      '#description' => $this
        ->t('Enter the name of the field from your Solr schema that should be considered the label (if any).'),
      '#default_value' => $this->configuration['label_field'],
    ];
    $form['advanced']['language_field'] = [
      '#type' => 'textfield',
      '#title' => $this
        ->t('Language field'),
      '#description' => $this
        ->t('Enter the name of the field from your Solr schema that should be considered the language (if any).'),
      '#default_value' => $this->configuration['language_field'],
    ];
    $form['advanced']['url_field'] = [
      '#type' => 'textfield',
      '#title' => $this
        ->t('URL field'),
      '#description' => $this
        ->t('Enter the name of the field from your Solr schema that should be considered the URL (if any).'),
      '#default_value' => $this->configuration['url_field'],
    ];

    // If there is already a valid server, we can transform the text fields into
    // select boxes.
    if ($fields) {
      $fields = [
        '' => $this
          ->t('None'),
      ] + $fields;
      $form['advanced']['label_field']['#type'] = 'select';
      $form['advanced']['label_field']['#options'] = $fields;
      $form['advanced']['label_field']['#description'] = $this
        ->t('Select the Solr index field that should be considered the label (if any).');
      $form['advanced']['language_field']['#type'] = 'select';
      $form['advanced']['language_field']['#options'] = $fields;
      $form['advanced']['language_field']['#description'] = $this
        ->t("Select the Solr index field that contains the document's language code (if any).");
      $form['advanced']['url_field']['#type'] = 'select';
      $form['advanced']['url_field']['#options'] = $fields;
      $form['advanced']['url_field']['#description'] = $this
        ->t("Select the Solr index field that contains the document's URL (if any).");
    }
    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function validateConfigurationForm(array &$form, FormStateInterface $form_state) {

    // We want the form fields displayed inside an "Advanced configuration"
    // fieldset, but we don't want them to be actually stored inside a nested
    // "advanced" key. (This could also be done via "#parents", but that's
    // pretty tricky to get right in a subform.)
    $values =& $form_state
      ->getValues();
    $values += $values['advanced'];
    unset($values['advanced']);
  }

}

Members

Namesort descending Modifiers Type Description Overrides
ConfigurablePluginBase::calculateDependencies public function Calculates dependencies for the configured plugin. Overrides DependentPluginInterface::calculateDependencies 6
ConfigurablePluginBase::calculatePluginDependencies Deprecated protected function Calculates and adds dependencies of a specific plugin instance.
ConfigurablePluginBase::create public static function Creates an instance of the plugin. Overrides ContainerFactoryPluginInterface::create 4
ConfigurablePluginBase::getConfiguration public function Gets this plugin's configuration. Overrides ConfigurableInterface::getConfiguration
ConfigurablePluginBase::getDescription public function Returns the plugin's description. Overrides ConfigurablePluginInterface::getDescription
ConfigurablePluginBase::getPluginDependencies Deprecated protected function Calculates and returns dependencies of a specific plugin instance.
ConfigurablePluginBase::label public function Returns the label for use on the administration pages. Overrides ConfigurablePluginInterface::label
ConfigurablePluginBase::moduleHandler Deprecated protected function Wraps the module handler.
ConfigurablePluginBase::onDependencyRemoval public function Informs the plugin that some of its dependencies are being removed. Overrides ConfigurablePluginInterface::onDependencyRemoval 5
ConfigurablePluginBase::setConfiguration public function Sets the configuration for this plugin instance. Overrides ConfigurableInterface::setConfiguration 3
ConfigurablePluginBase::themeHandler Deprecated protected function Wraps the theme handler.
DatasourcePluginBase::canContainEntityReferences public function Determines whether this datasource can contain entity references. Overrides DatasourceInterface::canContainEntityReferences 1
DatasourcePluginBase::checkItemAccess public function Checks whether a user has permission to view the given item. Overrides DatasourceInterface::checkItemAccess
DatasourcePluginBase::getAffectedItemsForEntityChange public function Identifies items affected by a change to a referenced entity. Overrides DatasourceInterface::getAffectedItemsForEntityChange 1
DatasourcePluginBase::getBundles public function Retrieves the bundles associated to this datasource. Overrides DatasourceInterface::getBundles 1
DatasourcePluginBase::getEntityTypeId public function Retrieves the entity type ID of items from this datasource, if any. Overrides DatasourceInterface::getEntityTypeId 1
DatasourcePluginBase::getFieldDependencies public function Retrieves any dependencies of the given fields. Overrides DatasourceInterface::getFieldDependencies 1
DatasourcePluginBase::getItemAccessResult public function Checks whether a user has permission to view the given item. Overrides DatasourceInterface::getItemAccessResult 1
DatasourcePluginBase::getItemBundle public function Retrieves the item's bundle. Overrides DatasourceInterface::getItemBundle 1
DatasourcePluginBase::getItemIds public function Returns a list of IDs of items from this datasource. Overrides DatasourceInterface::getItemIds 1
DatasourcePluginBase::getListCacheContexts public function Returns the list cache contexts associated with this datasource. Overrides DatasourceInterface::getListCacheContexts 1
DatasourcePluginBase::getViewModes public function Returns the available view modes for this datasource. Overrides DatasourceInterface::getViewModes 1
DatasourcePluginBase::load public function Loads an item. Overrides DatasourceInterface::load
DatasourcePluginBase::viewItem public function Returns the render array for the provided item and view mode. Overrides DatasourceInterface::viewItem 1
DatasourcePluginBase::viewMultipleItems public function Returns the render array for the provided items and view mode. Overrides DatasourceInterface::viewMultipleItems 1
DependencySerializationTrait::$_entityStorages protected property An array of entity type IDs keyed by the property name of their storages.
DependencySerializationTrait::$_serviceIds protected property An array of service IDs keyed by property name used for serialization.
DependencySerializationTrait::__sleep public function 1
DependencySerializationTrait::__wakeup public function 2
DependencyTrait::$dependencies protected property The object's dependencies.
DependencyTrait::addDependencies protected function Adds multiple dependencies.
DependencyTrait::addDependency protected function Adds a dependency.
HideablePluginBase::isHidden public function Determines whether this plugin should be hidden in the UI. Overrides HideablePluginInterface::isHidden 1
IndexPluginBase::$index protected property The index this processor is configured for.
IndexPluginBase::getIndex public function Retrieves the index this plugin is configured for. Overrides IndexPluginInterface::getIndex
IndexPluginBase::setIndex public function Sets the index this plugin is configured for. Overrides IndexPluginInterface::setIndex
IndexPluginBase::__construct public function Constructs a \Drupal\Component\Plugin\PluginBase object. Overrides ConfigurablePluginBase::__construct 2
LoggerTrait::$logger protected property The logging channel to use.
LoggerTrait::getLogger public function Retrieves the logger.
LoggerTrait::logException protected function Logs an exception.
LoggerTrait::setLogger public function Sets the logger.
MessengerTrait::$messenger protected property The messenger. 29
MessengerTrait::messenger public function Gets the messenger. 29
MessengerTrait::setMessenger public function Sets the messenger.
PluginBase::$configuration protected property Configuration information passed into the plugin. 1
PluginBase::$pluginDefinition protected property The plugin implementation definition. 1
PluginBase::$pluginId protected property The plugin_id.
PluginBase::DERIVATIVE_SEPARATOR constant A string which is used to separate base plugin IDs from the derivative ID.
PluginBase::getBaseId public function Gets the base_plugin_id of the plugin instance. Overrides DerivativeInspectionInterface::getBaseId
PluginBase::getDerivativeId public function Gets the derivative_id of the plugin instance. Overrides DerivativeInspectionInterface::getDerivativeId
PluginBase::getPluginDefinition public function Gets the definition of the plugin implementation. Overrides PluginInspectionInterface::getPluginDefinition 3
PluginBase::getPluginId public function Gets the plugin_id of the plugin instance. Overrides PluginInspectionInterface::getPluginId
PluginBase::isConfigurable public function Determines if the plugin is configurable.
PluginDependencyTrait::calculatePluginDependencies protected function Calculates and adds dependencies of a specific plugin instance. Aliased as: traitCalculatePluginDependencies 1
PluginDependencyTrait::getPluginDependencies protected function Calculates and returns dependencies of a specific plugin instance. Aliased as: traitGetPluginDependencies
PluginDependencyTrait::moduleHandler protected function Wraps the module handler. Aliased as: traitModuleHandler 1
PluginDependencyTrait::themeHandler protected function Wraps the theme handler. Aliased as: traitThemeHandler 1
PluginFormTrait::submitConfigurationForm public function Form submission handler. 7
SolrDocument::$solrDocumentFactory protected property The Solr document factory.
SolrDocument::$solrFieldManager protected property The Solr field manager.
SolrDocument::$solr_document protected property 1
SolrDocument::$solr_field protected property 1
SolrDocument::buildConfigurationForm public function Form constructor. Overrides PluginFormInterface::buildConfigurationForm 1
SolrDocument::defaultConfiguration public function Gets default configuration for this plugin. Overrides ConfigurablePluginBase::defaultConfiguration 1
SolrDocument::getFieldValue protected function Retrieves a scalar field value from a result item.
SolrDocument::getItemId public function Overrides DatasourceInterface::getItemId
SolrDocument::getItemLabel public function Overrides DatasourcePluginBase::getItemLabel
SolrDocument::getItemLanguage public function Overrides DatasourcePluginBase::getItemLanguage
SolrDocument::getItemUrl public function Overrides DatasourcePluginBase::getItemUrl
SolrDocument::getPropertyDefinitions public function Retrieves the properties exposed by the underlying complex data type. Overrides DatasourcePluginBase::getPropertyDefinitions
SolrDocument::getSolrDocumentFactory public function Returns the Solr document factory.
SolrDocument::getSolrFieldManager public function Returns the Solr field manager.
SolrDocument::loadMultiple public function Loads multiple items. Overrides DatasourcePluginBase::loadMultiple
SolrDocument::setSolrDocumentFactory public function Sets the Solr document factory.
SolrDocument::setSolrFieldManager public function Sets the Solr field manager.
SolrDocument::validateConfigurationForm public function Form validation handler. Overrides PluginFormTrait::validateConfigurationForm
StringTranslationTrait::$stringTranslation protected property The string translation service. 1
StringTranslationTrait::formatPlural protected function Formats a string containing a count of items.
StringTranslationTrait::getNumberOfPlurals protected function Returns the number of plurals supported by a given language.
StringTranslationTrait::getStringTranslation protected function Gets the string translation service.
StringTranslationTrait::setStringTranslation public function Sets the string translation service to use. 2
StringTranslationTrait::t protected function Translates a string to the current language or to a given language.