You are here

class SearchApiRow in Search API 8

Provides a row plugin for displaying a result as a rendered item.

Plugin annotation


@ViewsRow(
  id = "search_api",
  title = @Translation("Rendered entity"),
  help = @Translation("Displays entity of the matching search API item"),
)

Hierarchy

Expanded class hierarchy of SearchApiRow

See also

search_api_views_plugins_row_alter()

File

src/Plugin/views/row/SearchApiRow.php, line 28

Namespace

Drupal\search_api\Plugin\views\row
View source
class SearchApiRow extends RowPluginBase {
  use LoggerTrait;

  /**
   * The search index.
   *
   * @var \Drupal\search_api\IndexInterface
   */
  protected $index;

  /**
   * The entity type manager.
   *
   * @var \Drupal\Core\Entity\EntityTypeManagerInterface
   */
  protected $entityTypeManager;

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {

    /** @var static $row */
    $row = parent::create($container, $configuration, $plugin_id, $plugin_definition);
    $row
      ->setEntityTypeManager($container
      ->get('entity_type.manager'));
    $row
      ->setLogger($container
      ->get('logger.channel.search_api'));
    return $row;
  }

  /**
   * Retrieves the entity type manager.
   *
   * @return \Drupal\Core\Entity\EntityTypeManagerInterface
   *   The entity type manager.
   */
  public function getEntityTypeManager() {
    return $this->entityTypeManager ?: \Drupal::entityTypeManager();
  }

  /**
   * Sets the entity type manager.
   *
   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entity_type_manager
   *   The new entity type manager.
   *
   * @return $this
   */
  public function setEntityTypeManager(EntityTypeManagerInterface $entity_type_manager) {
    $this->entityTypeManager = $entity_type_manager;
    return $this;
  }

  /**
   * {@inheritdoc}
   */
  public function init(ViewExecutable $view, DisplayPluginBase $display, array &$options = NULL) {
    parent::init($view, $display, $options);
    $base_table = $view->storage
      ->get('base_table');
    $this->index = SearchApiQuery::getIndexFromTable($base_table, $this
      ->getEntityTypeManager());
    if (!$this->index) {
      $view_label = $view->storage
        ->label();
      throw new \InvalidArgumentException("View '{$view_label}' is not based on Search API but tries to use its row plugin.");
    }
  }

  /**
   * {@inheritdoc}
   */
  protected function defineOptions() {
    $options = parent::defineOptions();
    $options['view_modes'] = [
      'default' => [],
    ];
    return $options;
  }

  /**
   * {@inheritdoc}
   */
  public function buildOptionsForm(&$form, FormStateInterface $form_state) {
    parent::buildOptionsForm($form, $form_state);
    foreach ($this->index
      ->getDatasources() as $datasource_id => $datasource) {
      $datasource_label = $datasource
        ->label();
      $bundles = $datasource
        ->getBundles();
      if (!$datasource
        ->getViewModes()) {
        $form['view_modes'][$datasource_id] = [
          '#type' => 'item',
          '#title' => $this
            ->t('View mode for datasource %name', [
            '%name' => $datasource_label,
          ]),
          '#description' => $this
            ->t("This datasource doesn't have any view modes available. It is therefore not possible to display results of this datasource using this row plugin."),
        ];
        continue;
      }
      foreach ($bundles as $bundle_id => $bundle_label) {
        $title = $this
          ->t('View mode for datasource %datasource, bundle %bundle', [
          '%datasource' => $datasource_label,
          '%bundle' => $bundle_label,
        ]);
        $view_modes = $datasource
          ->getViewModes($bundle_id);
        if (!$view_modes) {
          $form['view_modes'][$datasource_id][$bundle_id] = [
            '#type' => 'item',
            '#title' => $title,
            '#description' => $this
              ->t("This bundle doesn't have any view modes available. It is therefore not possible to display results of this bundle using this row plugin."),
          ];
          continue;
        }
        $form['view_modes'][$datasource_id][$bundle_id] = [
          '#type' => 'select',
          '#options' => $view_modes,
          '#title' => $title,
          '#default_value' => key($view_modes),
        ];
        if (isset($this->options['view_modes'][$datasource_id][$bundle_id])) {
          $form['view_modes'][$datasource_id][$bundle_id]['#default_value'] = $this->options['view_modes'][$datasource_id][$bundle_id];
        }
      }
    }
  }

  /**
   * {@inheritdoc}
   */
  public function preRender($result) {

    // Load all result objects at once, before rendering.
    // Set $entity->view property to be accessible in preprocess functions.
    $items_to_load = [];
    foreach ($result as $i => $row) {
      if (empty($row->_object)) {
        $items_to_load[$i] = $row->search_api_id;
      }
      else {
        $entity = $row->_object
          ->getValue();
        if ($entity instanceof EntityInterface && !isset($entity->view)) {
          $entity->view = $this->view;
        }
      }
    }
    $items = $this->index
      ->loadItemsMultiple($items_to_load);
    foreach ($items_to_load as $i => $item_id) {
      if (isset($items[$item_id])) {
        $result[$i]->_object = $items[$item_id];
        $result[$i]->_item
          ->setOriginalObject($items[$item_id]);
        $entity = $items[$item_id]
          ->getValue();
        if ($entity instanceof EntityInterface && !isset($entity->view)) {
          $entity->view = $this->view;
        }
      }
    }
  }

  /**
   * {@inheritdoc}
   */
  public function render($row) {
    $datasource_id = $row->search_api_datasource;
    if (!$row->_object instanceof ComplexDataInterface) {
      $context = [
        '%item_id' => $row->search_api_id,
        '%view' => $this->view->storage
          ->label(),
      ];
      $this
        ->getLogger()
        ->warning('Failed to load item %item_id in view %view.', $context);
      return '';
    }
    if (!$this->index
      ->isValidDatasource($datasource_id)) {
      $context = [
        '%datasource' => $datasource_id,
        '%view' => $this->view->storage
          ->label(),
      ];
      $this
        ->getLogger()
        ->warning('Item of unknown datasource %datasource returned in view %view.', $context);
      return '';
    }

    // Always use the default view mode if it was not set explicitly in the
    // options.
    $bundle = $this->index
      ->getDatasource($datasource_id)
      ->getItemBundle($row->_object);
    $view_mode = $this->options['view_modes'][$datasource_id][$bundle] ?? 'default';
    try {
      $build = $this->index
        ->getDatasource($datasource_id)
        ->viewItem($row->_object, $view_mode);

      // Add the excerpt to the render array to allow adding it to view modes.
      if (isset($row->search_api_excerpt)) {
        $build['#search_api_excerpt'] = $row->search_api_excerpt;
      }
      return $build;
    } catch (SearchApiException $e) {
      $this
        ->logException($e);
      return '';
    }
  }

  /**
   * {@inheritdoc}
   */
  public function query() {
  }

}

Members

Namesort descending Modifiers Type Description Overrides
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
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::$definition public property Plugins's definition
PluginBase::$displayHandler public property The display object this plugin is for.
PluginBase::$options public property Options for this plugin will be held here.
PluginBase::$pluginDefinition protected property The plugin implementation definition. 1
PluginBase::$pluginId protected property The plugin_id.
PluginBase::$renderer protected property Stores the render API renderer. 3
PluginBase::$view public property The top object of a view. 1
PluginBase::calculateDependencies public function Calculates dependencies for the configured plugin. Overrides DependentPluginInterface::calculateDependencies 14
PluginBase::DERIVATIVE_SEPARATOR constant A string which is used to separate base plugin IDs from the derivative ID.
PluginBase::destroy public function Clears a plugin. Overrides ViewsPluginInterface::destroy 2
PluginBase::doFilterByDefinedOptions protected function Do the work to filter out stored options depending on the defined options.
PluginBase::filterByDefinedOptions public function Filter out stored options depending on the defined options. Overrides ViewsPluginInterface::filterByDefinedOptions
PluginBase::getAvailableGlobalTokens public function Returns an array of available token replacements. Overrides ViewsPluginInterface::getAvailableGlobalTokens
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::getProvider public function Returns the plugin provider. Overrides ViewsPluginInterface::getProvider
PluginBase::getRenderer protected function Returns the render API renderer. 1
PluginBase::globalTokenForm public function Adds elements for available core tokens to a form. Overrides ViewsPluginInterface::globalTokenForm
PluginBase::globalTokenReplace public function Returns a string with any core tokens replaced. Overrides ViewsPluginInterface::globalTokenReplace
PluginBase::INCLUDE_ENTITY constant Include entity row languages when listing languages.
PluginBase::INCLUDE_NEGOTIATED constant Include negotiated languages when listing languages.
PluginBase::isConfigurable public function Determines if the plugin is configurable.
PluginBase::listLanguages protected function Makes an array of languages, optionally including special languages.
PluginBase::pluginTitle public function Return the human readable name of the display. Overrides ViewsPluginInterface::pluginTitle
PluginBase::preRenderAddFieldsetMarkup public static function Moves form elements into fieldsets for presentation purposes. Overrides ViewsPluginInterface::preRenderAddFieldsetMarkup
PluginBase::preRenderFlattenData public static function Flattens the structure of form elements. Overrides ViewsPluginInterface::preRenderFlattenData
PluginBase::queryLanguageSubstitutions public static function Returns substitutions for Views queries for languages.
PluginBase::setOptionDefaults protected function Fills up the options of the plugin with defaults.
PluginBase::summaryTitle public function Returns the summary of the settings in the display. Overrides ViewsPluginInterface::summaryTitle 6
PluginBase::themeFunctions public function Provide a full list of possible theme templates used by this style. Overrides ViewsPluginInterface::themeFunctions 1
PluginBase::trustedCallbacks public static function Lists the trusted callbacks provided by the implementing class. Overrides TrustedCallbackInterface::trustedCallbacks 6
PluginBase::unpackOptions public function Unpack options over our existing defaults, drilling down into arrays so that defaults don't get totally blown away. Overrides ViewsPluginInterface::unpackOptions
PluginBase::usesOptions public function Returns the usesOptions property. Overrides ViewsPluginInterface::usesOptions 8
PluginBase::validate public function Validate that the plugin is correct and can be saved. Overrides ViewsPluginInterface::validate 6
PluginBase::viewsTokenReplace protected function Replaces Views' tokens in a given string. The resulting string will be sanitized with Xss::filterAdmin. 1
PluginBase::VIEWS_QUERY_LANGUAGE_SITE_DEFAULT constant Query string to indicate the site default language.
PluginBase::__construct public function Constructs a PluginBase object. Overrides PluginBase::__construct
RowPluginBase::$usesFields protected property Does the row plugin support to add fields to its output. 4
RowPluginBase::$usesOptions protected property Denotes whether the plugin has an additional options form. Overrides PluginBase::$usesOptions 1
RowPluginBase::submitOptionsForm public function Perform any necessary changes to the form values prior to storage. There is no need for this function to actually store the data. Overrides PluginBase::submitOptionsForm 1
RowPluginBase::usesFields public function Returns the usesFields property. 4
RowPluginBase::validateOptionsForm public function Validate the options form. Overrides PluginBase::validateOptionsForm 1
SearchApiRow::$entityTypeManager protected property The entity type manager.
SearchApiRow::$index protected property The search index.
SearchApiRow::buildOptionsForm public function Provide a form for setting options. Overrides RowPluginBase::buildOptionsForm
SearchApiRow::create public static function Creates an instance of the plugin. Overrides PluginBase::create
SearchApiRow::defineOptions protected function Information about options for all kinds of purposes will be held here. @code 'option_name' => array( Overrides RowPluginBase::defineOptions
SearchApiRow::getEntityTypeManager public function Retrieves the entity type manager.
SearchApiRow::init public function Initialize the row plugin. Overrides PluginBase::init
SearchApiRow::preRender public function Allow the style to do stuff before each row is rendered. Overrides RowPluginBase::preRender
SearchApiRow::query public function Add anything to the query that we might need to. Overrides RowPluginBase::query
SearchApiRow::render public function Render a row object. This usually passes through to a theme template of some form, but not always. Overrides RowPluginBase::render
SearchApiRow::setEntityTypeManager public function Sets the entity type manager.
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.
TrustedCallbackInterface::THROW_EXCEPTION constant Untrusted callbacks throw exceptions.
TrustedCallbackInterface::TRIGGER_SILENCED_DEPRECATION constant Untrusted callbacks trigger silenced E_USER_DEPRECATION errors.
TrustedCallbackInterface::TRIGGER_WARNING constant Untrusted callbacks trigger E_USER_WARNING errors.