Skip to content
Snippets Groups Projects

#3363955 use frontend theme for rendering

2 files
+ 54
3
Compare changes
  • Side-by-side
  • Inline
Files
2
+ 51
3
@@ -2,20 +2,32 @@
@@ -2,20 +2,32 @@
namespace Drupal\yoast_analysis;
namespace Drupal\yoast_analysis;
 
use Drupal\Core\Config\ConfigFactory;
 
use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Render\RendererInterface;
use Drupal\Core\Render\RendererInterface;
 
use Drupal\Core\Theme\ActiveTheme;
 
use Drupal\Core\Theme\MissingThemeDependencyException;
 
use Drupal\Core\Theme\ThemeInitializationInterface;
 
use Drupal\Core\Theme\ThemeManagerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
class TextExtractor {
class TextExtractor {
protected EntityTypeManagerInterface $entityTypeManager;
protected EntityTypeManagerInterface $entityTypeManager;
protected RendererInterface $renderer;
protected RendererInterface $renderer;
protected ContainerInterface $container;
protected ContainerInterface $container;
 
protected ThemeManagerInterface $themeManager;
 
protected ThemeInitializationInterface $themeInitializer;
 
protected ConfigFactoryInterface $configFactory;
public function __construct(EntityTypeManagerInterface $entityTypeManager, RendererInterface $renderer, ContainerInterface $container) {
public function __construct(EntityTypeManagerInterface $entity_type_manager, RendererInterface $renderer, ContainerInterface $container, ThemeInitializationInterface $theme_initilizer, ThemeManagerInterface $theme_manager, ConfigFactoryInterface $config_factory) {
$this->entityTypeManager = $entityTypeManager;
$this->entityTypeManager = $entity_type_manager;
$this->renderer = $renderer;
$this->renderer = $renderer;
$this->container = $container;
$this->container = $container;
 
$this->themeInitializer = $theme_initilizer;
 
$this->themeManager = $theme_manager;
 
$this->configFactory = $config_factory;
}
}
public function getEntityHtml(EntityInterface $entity, $view_mode = 'yoast_analysis'): string {
public function getEntityHtml(EntityInterface $entity, $view_mode = 'yoast_analysis'): string {
@@ -26,7 +38,11 @@ class TextExtractor {
@@ -26,7 +38,11 @@ class TextExtractor {
$build['#entity_type'] = $entity->getEntityTypeId();
$build['#entity_type'] = $entity->getEntityTypeId();
$build['#' . $build['#entity_type']] = $entity;
$build['#' . $build['#entity_type']] = $entity;
return (string) $this->renderer->render($build);
$original_theme = $this->switchToDefaultTheme();
 
$output = $this->renderer->render($build);
 
$this->switchThemeBack($original_theme);
 
 
return (string) $output;
}
}
/**
/**
@@ -61,4 +77,36 @@ class TextExtractor {
@@ -61,4 +77,36 @@ class TextExtractor {
return $this->getEntityMetatags($entity)['description'];
return $this->getEntityMetatags($entity)['description'];
}
}
 
private function switchToDefaultTheme(): ?ActiveTheme {
 
$activeTheme = $this->themeManager->getActiveTheme();
 
$defaultTheme = $this->configFactory
 
->get('system.theme')
 
->get('default');
 
try {
 
$defaultTheme = $this->themeInitializer
 
->getActiveThemeByName($defaultTheme);
 
}
 
catch (MissingThemeDependencyException) {
 
return NULL;
 
}
 
if ($defaultTheme->getName() === $activeTheme->getName()) {
 
return NULL;
 
}
 
 
$this->themeManager->setActiveTheme($defaultTheme);
 
// Ensure that statically cached default variables are reset correctly,
 
// especially the directory variable.
 
drupal_static_reset('template_preprocess');
 
// Return the previously active theme, for switching back.
 
return $activeTheme;
 
}
 
 
private function switchThemeBack(?ActiveTheme $previousTheme): void {
 
if ($previousTheme === NULL
 
|| $previousTheme === $this->themeManager->getActiveTheme()) {
 
return;
 
}
 
$this->themeManager->setActiveTheme($previousTheme);
 
drupal_static_reset('template_preprocess');
 
}
}
}
Loading