You are here

public function HelpTopicSection::renderTopicForSearch in Drupal 9

Same name and namespace in other branches
  1. 8 core/modules/help_topics/src/Plugin/HelpSection/HelpTopicSection.php \Drupal\help_topics\Plugin\HelpSection\HelpTopicSection::renderTopicForSearch()

Renders one topic for search indexing or search results.

Parameters

string $topic_id: The ID of the topic to be indexed.

\Drupal\Core\Language\LanguageInterface $language: The language to render the topic in.

Return value

array An array of information about the topic, with elements:

  • title: The title of the topic in this language.
  • text: The text of the topic in this language.
  • url: The URL of the topic as a \Drupal\Core\Url object.
  • cacheable_metadata: (optional) An object to add as a cache dependency if this topic is shown in search results.

Overrides SearchableHelpInterface::renderTopicForSearch

File

core/modules/help_topics/src/Plugin/HelpSection/HelpTopicSection.php, line 205

Class

HelpTopicSection
Provides the help topics list section for the help page.

Namespace

Drupal\help_topics\Plugin\HelpSection

Code

public function renderTopicForSearch($topic_id, LanguageInterface $language) {
  $plugin = $this->pluginManager
    ->createInstance($topic_id);
  if (!$plugin) {
    return [];
  }

  // We are rendering this topic for search indexing or search results,
  // possibly in a different language than the current language. The topic
  // title and body come from translatable things in the Twig template, so we
  // need to set the default language to the desired language, render them,
  // then restore the default language so we do not affect other cron
  // processes. Also, just in case there is an exception, wrap the whole
  // thing in a try/finally block, and reset the language in the finally part.
  $old_language = $this->defaultLanguage
    ->get();
  try {
    if ($old_language
      ->getId() !== $language
      ->getId()) {
      $this->defaultLanguage
        ->set($language);
      $this->translationManager
        ->setDefaultLangcode($language
        ->getId());
      $this->languageManager
        ->reset();
    }
    $topic = [];

    // Render the title in this language.
    $title_build = [
      'title' => [
        '#type' => '#markup',
        '#markup' => $plugin
          ->getLabel(),
      ],
    ];
    $topic['title'] = $this->renderer
      ->renderPlain($title_build);
    $cacheable_metadata = CacheableMetadata::createFromRenderArray($title_build);

    // Render the body in this language. For this, we need to set up a render
    // context, because the Twig plugins that provide the body assumes one
    // is present.
    $context = new RenderContext();
    $build = [
      'body' => $this->renderer
        ->executeInRenderContext($context, [
        $plugin,
        'getBody',
      ]),
    ];
    $topic['text'] = $this->renderer
      ->renderPlain($build);
    $cacheable_metadata
      ->addCacheableDependency(CacheableMetadata::createFromRenderArray($build));
    $cacheable_metadata
      ->addCacheableDependency($plugin);
    if (!$context
      ->isEmpty()) {
      $cacheable_metadata
        ->addCacheableDependency($context
        ->pop());
    }

    // Add the other information.
    $topic['url'] = $plugin
      ->toUrl();
    $topic['cacheable_metadata'] = $cacheable_metadata;
  } finally {

    // Restore the original language.
    if ($old_language
      ->getId() !== $language
      ->getId()) {
      $this->defaultLanguage
        ->set($old_language);
      $this->translationManager
        ->setDefaultLangcode($old_language
        ->getId());
      $this->languageManager
        ->reset();
    }
  }
  return $topic;
}