You are here

class Search in Google Site Search 8

Handles search using Google Search Engine.

Plugin annotation


@SearchPlugin(
  id = "gss_search",
  title = @Translation("Google Site Search")
)

Hierarchy

Expanded class hierarchy of Search

1 file declares its use of Search
RouteSubscriber.php in src/Routing/RouteSubscriber.php
1 string reference to 'Search'
gss.info.yml in ./gss.info.yml
gss.info.yml

File

src/Plugin/Search/Search.php, line 32

Namespace

Drupal\gss\Plugin\Search
View source
class Search extends ConfigurableSearchPluginBase implements AccessibleInterface {

  /**
   * Max number of items (`num`) via API.
   */
  const MAX_NUM = 10;

  /**
   * Total number of results.
   *
   * @var integer
   */
  protected $count;

  /**
   * Labels (facets) for the current search.
   *
   * @var object
   */
  protected $labels;

  /**
   * The language manager.
   *
   * @var \Drupal\Core\Language\LanguageManagerInterface
   */
  protected $languageManager;

  /**
   * A module manager object.
   *
   * @var \Drupal\Core\Extension\ModuleHandlerInterface
   */
  protected $moduleHandler;

  /**
   * HTTP client.
   *
   * @var \GuzzleHttp\Client
   */
  protected $httpClient;

  /**
   * Key storage.
   *
   * @var \Drupal\key\KeyRepository
   */
  protected $keyRepository;

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
    return new static($configuration, $plugin_id, $plugin_definition, $container
      ->get('language_manager'), $container
      ->get('module_handler'), $container
      ->get('http_client'), $container
      ->get('key.repository'));
  }

  /**
   * Constructs a \Drupal\node\Plugin\Search\NodeSearch object.
   *
   * @param array $configuration
   *   A configuration array containing information about the plugin instance.
   * @param string $plugin_id
   *   The plugin_id for the plugin instance.
   * @param mixed $plugin_definition
   *   The plugin implementation definition.
   * @param \Drupal\Core\Language\LanguageManagerInterface $language_manager
   *   The language manager.
   * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
   *   A module manager object.
   * @param \GuzzleHttp\Client $http_client
   *   The http client.
   * @param \Drupal\key\KeyRepository $key_repository
   *   The key repository.
   */
  public function __construct(array $configuration, $plugin_id, $plugin_definition, LanguageManagerInterface $language_manager, ModuleHandlerInterface $module_handler, Client $http_client, KeyRepository $key_repository) {
    $this->languageManager = $language_manager;
    $this->moduleHandler = $module_handler;
    $this->httpClient = $http_client;
    $this->keyRepository = $key_repository;
    parent::__construct($configuration, $plugin_id, $plugin_definition);

    // Allow overrides, e.g. different search engines per language.
    $this
      ->setConfiguration($configuration);
  }

  /**
   * {@inheritdoc}
   */
  public function defaultConfiguration() {
    $all_languages = $this
      ->getSupportedLanguages();
    $values = [];
    foreach ($all_languages as $language) {
      $values["search_engine_id_" . $language
        ->getId()] = NULL;
    }
    $values["api_key"] = NULL;
    $values["base_url"] = 'https://www.googleapis.com/customsearch/v1';

    // @todo autocomplete
    // "autocomplete" => TRUE,
    $values["page_size"] = 10;
    $values["pager_size"] = 9;
    $values["images"] = FALSE;
    $values["labels"] = TRUE;

    // @todo number_of_results
    // "number_of_results" => TRUE,
    // @todo info
    // "info" => FALSE,
    return $values;
  }

  /**
   * Gets the configured pager size.
   */
  public function getPagerSize() {
    return $this->configuration['pager_size'];
  }

  /**
   * Gets the search results count.
   */
  public function getCount() {
    return $this->count;
  }

  /**
   * Get supported languages.
   *
   * @return array
   *   An array of supported language objects.
   */
  public function getSupportedLanguages() {
    $languages = [];

    // Special any language.
    $any_langcode = LanguageInterface::LANGCODE_NOT_SPECIFIED;
    $any_language = $this->languageManager
      ->getLanguage($any_langcode);
    if ($any_language) {
      $languages[$any_langcode] = $any_language;
    }

    // Configurable languages.
    $languages += $this->languageManager
      ->getLanguages();
    return $languages;
  }

  /**
   * {@inheritdoc}
   */
  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
    $form['api_key'] = [
      '#title' => $this
        ->t('Google search API key'),
      '#type' => 'key_select',
      '#default_value' => $this->configuration['api_key'],
      '#empty_value' => '',
      '#empty_option' => $this
        ->t('- Debug mode -'),
      '#description' => '<br />' . $this
        ->t('Debug mode will generate sample content for the search results.'),
    ];
    $all_languages = $this
      ->getSupportedLanguages();
    $language_default = $this->languageManager
      ->getDefaultLanguage()
      ->getId();
    foreach ($all_languages as $langcode => $language) {
      $element_key = 'search_engine_id_' . $language
        ->getId();
      $form[$element_key] = [
        '#type' => 'textfield',
        '#default_value' => $this->configuration['search_engine_id_' . $language
          ->getId()],
      ];
      if ($langcode === $language_default) {
        $form[$element_key]['#title'] = $this
          ->t('Google search engine ID (@language, Default site language)', [
          '@language' => $language
            ->getName(),
        ]);
        $form[$element_key]['#description'] = $this
          ->t('This is used when there is no search engine configured for the current language.');
      }
      elseif ($langcode === LanguageInterface::LANGCODE_NOT_SPECIFIED) {
        $form[$element_key]['#title'] = $this
          ->t('Google search engine ID (All languages)');
        $form[$element_key]['#description'] = $this
          ->t('This is used when there is no search engine configured for the current language or the default site language.');
      }
      else {
        $form[$element_key]['#title'] = $this
          ->t('Google search engine ID (@language)', [
          '@language' => $language
            ->getName(),
        ]);
      }
    }
    $form['base_url'] = array(
      '#title' => $this
        ->t('Search engine base url'),
      '#type' => 'textfield',
      '#description' => $this
        ->t('The base URL to send the query to. Use this to override the default request to Google, useful for proxying the request.'),
      '#default_value' => $this->configuration['base_url'],
    );
    $form['miscellaneous'] = array(
      '#type' => 'fieldset',
      '#title' => $this
        ->t('Miscellaneous'),
    );
    $form['miscellaneous']['page_size'] = array(
      '#title' => $this
        ->t('Page size'),
      '#type' => 'textfield',
      '#description' => $this
        ->t('Number of results to display per page.'),
      '#default_value' => $this->configuration['page_size'],
      '#size' => 5,
      '#max_length' => 5,
    );
    $form['miscellaneous']['pager_size'] = array(
      '#title' => $this
        ->t('Pager size'),
      '#type' => 'textfield',
      '#description' => $this
        ->t('Number of pages to show in the pager. Input ONLY odd numbers like 5, 7 or 9 and NOT 6, 8 or 10, for example.'),
      '#default_value' => $this->configuration['pager_size'],
      '#size' => 5,
      '#max_length' => 5,
    );
    $form['miscellaneous']['images'] = array(
      '#title' => $this
        ->t('Image Search'),
      '#type' => 'checkbox',
      '#description' => $this
        ->t('Enable image search.'),
      '#default_value' => $this->configuration['images'],
    );
    $form['miscellaneous']['labels'] = array(
      '#title' => $this
        ->t('Show labels'),
      '#type' => 'checkbox',
      '#description' => $this
        ->t('Let the user filter the search result by labels. <a href=":search-labels">Read more about search labels</a>.', [
        ':search-labels' => 'https://developers.google.com/custom-search/docs/ref_prebuiltlabels',
      ]),
      '#default_value' => $this->configuration['labels'],
    );
    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
    $keys = [];
    $languages = $this
      ->getSupportedLanguages();
    foreach ($languages as $language) {
      $keys[] = 'search_engine_id_' . $language
        ->getId();
    }
    $defaults = [
      'api_key',
      'base_url',
      // @todo autocomplete
      // 'autocomplete',
      'page_size',
      'pager_size',
      'images',
      'labels',
    ];
    $keys = array_merge($keys, $defaults);
    foreach ($keys as $key) {
      $this->configuration[$key] = $form_state
        ->getValue($key);
    }
  }

  /**
   * {@inheritdoc}
   */
  public function access($operation = 'view', AccountInterface $account = NULL, $return_as_object = FALSE) {
    $result = AccessResult::allowedIfHasPermission($account, 'access content');
    return $return_as_object ? $result : $result
      ->isAllowed();
  }

  /**
   * {@inheritdoc}
   */
  public function execute() {
    if ($this
      ->isSearchExecutable()) {
      $page = pager_find_page();
      $results = $this
        ->findResults($page);

      // API total results is unreliable. Sometimes when requesting a large
      // offset we get no results, and
      // $response->searchInformation->totalResults is 0. In this case return
      // the previous page's items.
      while ($page && !count($results)) {
        $results = $this
          ->findResults(--$page);
      }
      pager_default_initialize($this->count, $this->configuration['page_size']);
      if ($results) {
        return $this
          ->prepareResults($results);
      }
    }
    return array();
  }

  /**
   * Queries to find search results, and sets status messages.
   *
   * This method can assume that $this->isSearchExecutable() has already been
   * checked and returned TRUE.
   *
   * @return array|null
   *   Results from search query execute() method, or NULL if the search
   *   failed.
   */
  protected function findResults($page) {
    $items = [];
    $page_size = $this->configuration['page_size'];

    // Reconcile items per page with api max 10.
    $count = 0;
    $n = $page_size < self::MAX_NUM ? $page_size : self::MAX_NUM;
    for ($i = 0; $i < $page_size; $i += self::MAX_NUM) {
      $offset = $page * $page_size + $i;
      if (!($response = $this
        ->getResults($n, $offset))) {
        break;
      }
      if (isset($response->items)) {
        $this->count = $response->searchInformation->totalResults;
        $items = array_merge($items, $response->items);
      }
      else {
        break;
      }
      if ($this->configuration['labels'] && !empty($response->context->facets)) {
        $this->labels = $response->context->facets;
      }
    }
    return $items;
  }

  /**
   * Get query result.
   *
   * @param int $n
   *   Number of items.
   * @param int $offset
   *   Offset of items (0-indexed).
   * @param string $search_type
   *   One of:
   *   - NULL (regular search).
   *   - "image".
   *
   * @return object|null
   *   Decoded response from Google, or NULL on error.
   */
  protected function getResults($n = 1, $offset = 0, $search_type = NULL) {
    $language = $this->languageManager
      ->getCurrentLanguage()
      ->getId();
    $language_default = $this->languageManager
      ->getDefaultLanguage()
      ->getId();
    $any_language = LanguageInterface::LANGCODE_NOT_SPECIFIED;
    $api_key = $this->keyRepository
      ->getKey($this->configuration['api_key']);
    $query = $this
      ->getParameters();
    $search_engine_id = NULL;
    if (!empty($this->configuration['search_engine_id_' . $language])) {

      // Language specific search engine id.
      $search_engine_id = $this->configuration['search_engine_id_' . $language];
    }
    elseif (!empty($this->configuration['search_engine_id_' . $language_default])) {

      // Default language search engine id.
      $search_engine_id = $this->configuration['search_engine_id_' . $language_default];
      $language = $language_default;
    }
    elseif (!empty($this->configuration['search_engine_id_' . $any_language])) {

      // Any language search engine id.
      $search_engine_id = $this->configuration['search_engine_id_' . $any_language];
    }

    // Exit, no search engine id defined.
    if (empty($search_engine_id)) {
      return NULL;
    }

    // make sure we actually have a base url
    $base_url = $this->configuration['base_url'];
    if (empty($base_url)) {
      $default_config = $this
        ->defaultConfiguration();
      $base_url = $default_config['base_url'];
    }
    $keywords = $this
      ->getKeywords();
    if (isset($query['label'])) {
      $keywords .= '+more:' . $query['label'];
    }
    $options = array(
      'query' => array(
        'q' => $keywords,
        'key' => !is_null($api_key) ? $api_key
          ->getKeyValue() : NULL,
        'cx' => $search_engine_id,
        // hl: "interface language", also used to weight results.
        'hl' => $language,
        // lr: "language restrict", supposed to limit results to only the set
        // language, defined with a "lang_" prefix.
        'lr' => 'lang_' . $language,
        'start' => $offset + 1,
        'num' => $n,
      ),
    );
    if (@$query['type'] == 'image') {
      $options['query']['searchType'] = 'image';
    }
    if (!is_null($api_key)) {
      try {
        $response = $this->httpClient
          ->get($base_url, $options);
        $json = $response
          ->getBody();
      } catch (\Exception $e) {
        \Drupal::logger('gss')
          ->error($e
          ->getMessage());
        return NULL;
      }
    }
    else {
      $json = $this
        ->generateSampleItems($base_url, $options);
    }
    return json_decode($json);
  }

  /**
   * Returns dummy search results for debug mode.
   *
   * @return string
   *   JSON data for debug mode.
   */
  protected function generateSampleItems($base_url, $options) {
    drupal_set_message($this
      ->t('GSS Debug mode enabled, visit the <a href=":settings">search page settings</a> to disable.', [
      ':settings' => Url::fromRoute('entity.search_page.edit_form', [
        'search_page' => $this->searchPageId,
      ])
        ->toString(),
    ]), 'warning');
    $random = new Random();
    $results = [
      'kind' => 'customsearch#search',
      'url' => [
        'type' => 'application/json',
        'template' => 'https://www.googleapis.com/customsearch/v1?q={searchTerms}&num={count?}&start={startIndex?}&lr={language?}&safe={safe?}&cx={cx?}&cref={cref?}&sort={sort?}&filter={filter?}&gl={gl?}&cr={cr?}&googlehost={googleHost?}&c2coff={disableCnTwTranslation?}&hq={hq?}&hl={hl?}&siteSearch={siteSearch?}&siteSearchFilter={siteSearchFilter?}&exactTerms={exactTerms?}&excludeTerms={excludeTerms?}&linkSite={linkSite?}&orTerms={orTerms?}&relatedSite={relatedSite?}&dateRestrict={dateRestrict?}&lowRange={lowRange?}&highRange={highRange?}&searchType={searchType}&fileType={fileType?}&rights={rights?}&imgSize={imgSize?}&imgType={imgType?}&imgColorType={imgColorType?}&imgDominantColor={imgDominantColor?}&alt=json',
      ],
      'queries' => [
        'request' => [
          'title' => "Google Custom Seearch - {$options['query']['q']}",
          'totalResults' => rand($options['query']['start'], 10000),
          'searchTerms' => $options['query']['q'],
          'count' => $options['query']['num'],
          'startIndex' => $options['query']['start'],
          'inputEncoding' => 'utf8',
          'outputEncoding' => 'utf8',
          'safe' => 'off',
          'cx' => $options['query']['cx'],
        ],
      ],
      'context' => [],
      'items' => [],
    ];
    $results['searchInformation'] = [
      'totalResults' => $results['queries']['request']['totalResults'],
    ];

    // Items.
    for ($i = 0; $i < $options['query']['num']; $i++) {
      $title = $random
        ->sentences(1);
      $link = Url::fromRoute('<front>', [], [
        'absolute' => TRUE,
      ])
        ->toString();
      $snippet = $random
        ->paragraphs(1);
      $article = (object) [
        'name' => $title,
        'description' => $snippet,
      ];
      $pagemap = new \stdClass();
      if (rand(0, 1)) {
        $image = '';
        $directory = "public://gss";
        if (file_prepare_directory($directory, FILE_MODIFY_PERMISSIONS | FILE_CREATE_DIRECTORY)) {
          $image = $random
            ->image("public://gss/gss_{$i}.jpg", '240x160', '240x160');
        }
        $pagemap->cse_thumbnail = [
          (object) [
            'width' => 240,
            'height' => 160,
            'src' => $image,
          ],
        ];
        $pagemap->cse_image = [
          (object) [
            'src' => $image,
          ],
        ];
        $article->image = $image;
      }
      $pagemap->article = [
        $article,
      ];
      $results['items'][$i] = [
        'kind' => 'customsearch#result',
        'title' => $title,
        'htmlTitle' => Html::escape($title),
        'link' => $link,
        'display_link' => $link,
        'snippet' => $snippet,
        'htmlSnippet' => Html::escape($snippet),
        'cacheId' => $random
          ->string(),
        'formattedUrl' => $link,
        'htmlFormatterUrl' => Html::escape($link),
        'pagemap' => $pagemap,
      ];
    }

    // Labels.
    if ($this->configuration['labels']) {
      $results['context']['facets'] = [];
      $labels = [];
      for ($i = 0; $i < rand(2, 4); $i++) {
        $label = $random
          ->string();
        if (!isset($labels[$label])) {
          $results['context']['facets'][][] = [
            'label' => $label,
            'anchor' => $label,
            'label_with_op' => "more:{$label}",
          ];
        }
        $labels[$label] = TRUE;
      }
      $query = $this
        ->getParameters();
      if (isset($query['label']) && !isset($labels[$query['label']])) {
        $results['context']['facets'][][] = [
          'label' => $query['label'],
          'anchor' => $query['label'],
          'label_with_op' => "more:{$query['label']}",
        ];
      }
    }
    return json_encode($results);
  }

  /**
   * Prepares search results for rendering.
   *
   * @param array $items
   *   Results found from a successful search query execute() method.
   *
   * @return array
   *   Array of search result item render arrays (empty array if no results).
   */
  protected function prepareResults(array $items) {
    $results = [];
    foreach ($items as $item) {
      $extra = $this->moduleHandler
        ->invokeAll('gss_search_result', [
        $item,
      ]);
      $results[] = [
        'link' => $item->link,
        'type' => NULL,
        'title' => $item->title,
        'node' => NULL,
        'extra' => $extra,
        'score' => NULL,
        'snippet' => [
          '#markup' => $item->htmlSnippet,
        ],
        'langcode' => $this->languageManager
          ->getCurrentLanguage()
          ->getId(),
      ];
    }
    return $results;
  }

  /**
   * {@inheritdoc}
   */
  public function buildResults() {
    $results = $this
      ->execute();
    $built = [];
    foreach ($results as $result) {
      $built[] = [
        '#theme' => "search_result__{$this->getPluginId()}",
        '#result' => $result,
        '#plugin_id' => $this
          ->getPluginId(),
      ];
    }
    return $built;
  }

  /**
   * Gets render array for search option links.
   */
  public function getSearchOptions(Request $request) {
    $options = [];
    if ($this->configuration['images']) {
      $query = $this
        ->getParameters();
      $active = $query['type'] == 'image';
      $query['type'] = 'image';
      $url = Url::createFromRequest($request);
      $url
        ->setOption('query', $query);
      $url
        ->setOption('attributes', $active ? [
        'class' => [
          'is-active',
        ],
      ] : []);
      $options['images'] = [
        '#title' => $this
          ->t('Images'),
        '#type' => 'link',
        '#url' => $url,
      ];
    }
    if (count($options)) {
      $query = $this
        ->getParameters();
      $active = empty($query['type']);
      if (!$active) {
        unset($query['type']);
      }
      $url = Url::createFromRequest($request);
      $url
        ->setOption('query', $query);
      $url
        ->setOption('attributes', $active ? [
        'class' => [
          'is-active',
        ],
      ] : []);
      $options['all'] = [
        '#title' => $this
          ->t('All'),
        '#type' => 'link',
        '#url' => $url,
        '#weight' => -1,
      ];
      return [
        '#theme' => 'item_list',
        '#items' => $options,
      ];
    }
    return [];
  }

  /**
   * Gets render array for labels.
   *
   * @param \Symfony\Component\HttpFoundation\Request $request
   *   The current request.
   *
   * @return array
   *   A render array.
   */
  public function getLabels(Request $request) {

    // Don't output anything if there are no labels to display.
    if (empty($this->labels)) {
      return [];
    }

    // Generate a URL for the current search page and extract the active label,
    // if any.
    $url = Url::createFromRequest($request);
    $search_query_parameters = $this
      ->getParameters();
    $active_label = NULL;
    if (isset($search_query_parameters['label']) && $search_query_parameters['label']) {
      $active_label = $search_query_parameters['label'];
      unset($search_query_parameters['label']);
    }
    $build = [
      '#theme' => 'item_list__gss_labels',
      '#title' => $this
        ->t('Show only results of type:'),
      '#wrapper_attributes' => [
        'class' => [
          'search-labels',
        ],
      ],
      '#context' => [
        'list_style' => 'comma-list',
      ],
    ];

    // Add the 'All results' option.
    $build['#items'][] = [
      '#title' => $this
        ->t('All results'),
      '#type' => 'link',
      '#url' => $url
        ->setOption('query', $search_query_parameters),
    ];

    // Add each label as an option.
    foreach ($this->labels as $facet_set) {
      foreach ($facet_set as $facet) {
        $url = clone $url;

        // Add the current label as a search parameter.
        $search_query_parameters['label'] = $facet->label;
        $url
          ->setOption('query', $search_query_parameters);
        $url
          ->setOption('attributes', $active_label == $facet->label ? [
          'class' => [
            'is-active',
          ],
        ] : []);
        $build['#items'][] = [
          '#title' => $this
            ->t($facet->anchor),
          '#type' => 'link',
          '#url' => $url,
        ];
      }
    }
    return $build;
  }

}

Members

Namesort descending Modifiers Type Description Overrides
CacheableDependencyTrait::$cacheContexts protected property Cache contexts.
CacheableDependencyTrait::$cacheMaxAge protected property Cache max-age.
CacheableDependencyTrait::$cacheTags protected property Cache tags.
CacheableDependencyTrait::getCacheContexts public function 3
CacheableDependencyTrait::getCacheMaxAge public function 3
CacheableDependencyTrait::getCacheTags public function 3
CacheableDependencyTrait::setCacheability protected function Sets cacheability; useful for value object constructors.
ConfigurableSearchPluginBase::$searchPageId protected property The unique ID for the search page using this plugin.
ConfigurableSearchPluginBase::calculateDependencies public function Calculates dependencies for the configured plugin. Overrides DependentPluginInterface::calculateDependencies
ConfigurableSearchPluginBase::getConfiguration public function Gets this plugin's configuration. Overrides ConfigurableInterface::getConfiguration
ConfigurableSearchPluginBase::setConfiguration public function Sets the configuration for this plugin instance. Overrides ConfigurableInterface::setConfiguration
ConfigurableSearchPluginBase::setSearchPageId public function Sets the ID for the search page using this plugin. Overrides ConfigurableSearchPluginInterface::setSearchPageId
ConfigurableSearchPluginBase::validateConfigurationForm public function Form validation handler. Overrides PluginFormInterface::validateConfigurationForm
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
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.
RefinableCacheableDependencyTrait::addCacheableDependency public function 1
RefinableCacheableDependencyTrait::addCacheContexts public function
RefinableCacheableDependencyTrait::addCacheTags public function
RefinableCacheableDependencyTrait::mergeCacheMaxAge public function
Search::$count protected property Total number of results.
Search::$httpClient protected property HTTP client.
Search::$keyRepository protected property Key storage.
Search::$labels protected property Labels (facets) for the current search.
Search::$languageManager protected property The language manager.
Search::$moduleHandler protected property A module manager object.
Search::access public function Checks data value access. Overrides AccessibleInterface::access
Search::buildConfigurationForm public function Form constructor. Overrides PluginFormInterface::buildConfigurationForm
Search::buildResults public function Executes the search and builds render arrays for the result items. Overrides SearchPluginBase::buildResults
Search::create public static function Creates an instance of the plugin. Overrides SearchPluginBase::create
Search::defaultConfiguration public function Gets default configuration for this plugin. Overrides ConfigurableSearchPluginBase::defaultConfiguration
Search::execute public function Executes the search. Overrides SearchInterface::execute
Search::findResults protected function Queries to find search results, and sets status messages.
Search::generateSampleItems protected function Returns dummy search results for debug mode.
Search::getCount public function Gets the search results count.
Search::getLabels public function Gets render array for labels.
Search::getPagerSize public function Gets the configured pager size.
Search::getResults protected function Get query result.
Search::getSearchOptions public function Gets render array for search option links.
Search::getSupportedLanguages public function Get supported languages.
Search::MAX_NUM constant Max number of items (`num`) via API.
Search::prepareResults protected function Prepares search results for rendering.
Search::submitConfigurationForm public function Form submission handler. Overrides PluginFormInterface::submitConfigurationForm
Search::__construct public function Constructs a \Drupal\node\Plugin\Search\NodeSearch object. Overrides ConfigurableSearchPluginBase::__construct
SearchPluginBase::$keywords protected property The keywords to use in a search.
SearchPluginBase::$searchAttributes protected property Array of attributes - usually from the request object.
SearchPluginBase::$searchParameters protected property Array of parameters from the query string from the request.
SearchPluginBase::buildSearchUrlQuery public function Builds the URL GET query parameters array for search. Overrides SearchInterface::buildSearchUrlQuery 1
SearchPluginBase::getAttributes public function Returns the currently set attributes (from the request). Overrides SearchInterface::getAttributes
SearchPluginBase::getHelp public function Returns the searching help. Overrides SearchInterface::getHelp 1
SearchPluginBase::getKeywords public function Returns the currently set keywords of the plugin instance. Overrides SearchInterface::getKeywords
SearchPluginBase::getParameters public function Returns the current parameters set using setSearch(). Overrides SearchInterface::getParameters
SearchPluginBase::getType public function Returns the search index type this plugin uses. Overrides SearchInterface::getType 2
SearchPluginBase::isSearchExecutable public function Verifies if the values set via setSearch() are valid and sufficient. Overrides SearchInterface::isSearchExecutable 2
SearchPluginBase::searchFormAlter public function Alters the search form when being built for a given plugin. Overrides SearchInterface::searchFormAlter 1
SearchPluginBase::setSearch public function Sets the keywords, parameters, and attributes to be used by execute(). Overrides SearchInterface::setSearch 1
SearchPluginBase::suggestedTitle public function Provides a suggested title for a page of search results. Overrides SearchInterface::suggestedTitle
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.