function HelpTopicSection::renderTopicForSearch

Same name and namespace in other branches
  1. 11.x core/modules/help/src/Plugin/HelpSection/HelpTopicSection.php \Drupal\help\Plugin\HelpSection\HelpTopicSection::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;
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.