drupal9

Usando ThemeNegotiator para cambiar de theme por código en Drupal 8, 9 y 10

Para cambiar de theme por código de acuerdo a cierta condición en nuestro desarrollo en Drupal 8, 9 y 10 debemos:

( Según la documentación oficial https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Theme%21ThemeNegotiatorInterface.php/interface/ThemeNegotiatorInterface/8.2.x )

1. Para configurar el tema activo, debemos crear  un nuevo servicio etiquetado con 'theme_negotiator' tal como ve la sección de tags.

services:
  group_theme_switcher.change_theme:
    class: Drupal\group_theme_switcher\Theme\SelectGroupTheme
    tags:
      - { name: theme_negotiator, priority: 1000 }
  • Debemos mantener la priority en alto, 1000 por ejemplo, para asegurarnos de que nuestro nuevo negotiator no sea accidentalmente sobreescrito por otro negotiator.

 2. Crear una clase (para nuestro ejemplo SelectGroupTheme) e implementarla con la interface ThemeNegotiatorInterface.

<?php
namespace Drupal\group_theme_switcher\Theme;

use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\Core\Theme\ThemeNegotiatorInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;


//SelectGroupTheme
class SelectGroupTheme implements ThemeNegotiatorInterface {
}

3. Dentro de nuestra nueva clase SelectGroupTheme debemos escribir los siguientes Métodos obligatorios:

  public function applies(RouteMatchInterface $route_match) {
  }

 y

  public function determineActiveTheme(RouteMatchInterface $route_match) {
  }

Estos nuevos métodos hacen lo siguiente:

  *  applies: Define si este negotiator de temas debe usarse para establecer el tema o no.

    ** El parametro $route_match nos trae el route de la ruta actual.

    ** Este método retorna TRUE si se debe utilizar este negotiator o FALSE para dejar que otros negotiators decidan.

  * determineActiveTheme: Determine el tema activo para la solicitud, sólo se ejecuta si el método applies retorna TRUE.

    ** El parametro $route_match nos trae el route de la ruta actual.

    ** Este método retorna el nombre del tema a usar, o NULL si en su lugar se deben utilizar otros negotiators, como el predeterminado configurado.

  con lo cual nuestro código quedaría de esta forma:

<?php
namespace Drupal\group_theme_switcher\Theme;

use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\Core\Theme\ThemeNegotiatorInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;


//SelectGroupTheme
class SelectGroupTheme implements ThemeNegotiatorInterface {
  public function applies(RouteMatchInterface $route_match) {
  }

  public function determineActiveTheme(RouteMatchInterface $route_match) {
  }
}

4.   Ahora procederemos a poner código de ejemplo dentro de nuestros métodos mencionados para hacer que 2 de nuestros routes tengan temas diferentes:

class SelectGroupTheme implements ThemeNegotiatorInterface {

  public function applies(RouteMatchInterface $route_match) {
    $route_name = $route_match->getRouteName();
    $valid = FALSE;
    $routes = [
        'entity.node.canonical',
        'entity.group.canonical' 
    ];
   
    if (in_array($route_name, $routes)) {
        $valid = TRUE;
    }
    
    return $valid;
  }
  
  public function determineActiveTheme(RouteMatchInterface $route_match) {
      $route_name = $route_match->getRouteName();
  
      if ($route_name == 'entity.group.canonical') {
        $theme = 'olivero';
      }
  
      if ($route_name == 'entity.node.canonical') {
        $theme = 'other_theme';
      }
  
      return $theme;
  }  

}

 

En esta sección de ejemplo hacemos lo siguiente:

  • En el método applies estamos diciendo que si $route_match es uno de los routers entity.group.canonical  o entity.node.canonical entonces retorne TRUE.
  • En el método determineActiveTheme estamos diciendo que si el router es entity.group.canonical entonces retorne el tema olivero, si el router es entity.node.canonical entonces retorna otro tema de nombre other_theme.

Para ver otro ejemplo podemos ir a theme.negotiator.admin_theme service en user.services.yml.

 

Me pareció interesante el artículo

Deseo más información

O también puedes comunicarte con nosotros.

por whatsapp por whatsapp

Añadir nuevo comentario

Me gustaría más información sobre:

CAPTCHA