Come posso modificare il tema attivo a livello di codice?


20

Come posso cambiare il tema attivo di Drupal 8 a livello di codice?

In Drupal 6, abbiamo usato il seguente codice.

global $custom_theme;
$custom_theme = 'garland';

In Drupal 7, abbiamo usato hook_custom_theme().

In Drupal 8, qual è il modo corretto per farlo?

Risposte:


22

In Drupal 8, usi i negoziatori di temi , che essenzialmente sono servizi che utilizzano un tag specifico. Guarda i negoziatori tematici implementati da Drupal, per capire esattamente come funzionano; l'esempio fornito nel record delle modifiche non viene aggiornato.

user.services.yml

  theme.negotiator.admin_theme:
    class: Drupal\user\Theme\AdminNegotiator
    arguments: ['@current_user', '@config.factory', '@entity.manager', '@router.admin_context']
    tags:
      - { name: theme_negotiator, priority: -40 }

AdminNegotiator.php

namespace Drupal\user\Theme;

use Drupal\Core\Config\ConfigFactoryInterface;
use Drupal\Core\Entity\EntityManagerInterface;
use Drupal\Core\Routing\AdminContext;
use Drupal\Core\Routing\RouteMatchInterface;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\Theme\ThemeNegotiatorInterface;

/**
 * Sets the active theme on admin pages.
 */
class AdminNegotiator implements ThemeNegotiatorInterface {

  /**
   * The current user.
   *
   * @var \Drupal\Core\Session\AccountInterface
   */
  protected $user;

  /**
   * The config factory.
   *
   * @var \Drupal\Core\Config\ConfigFactoryInterface
   */
  protected $configFactory;

  /**
   * The entity manager.
   *
   * @var \Drupal\Core\Entity\EntityManagerInterface
   */
  protected $entityManager;

  /**
   * The route admin context to determine whether a route is an admin one.
   *
   * @var \Drupal\Core\Routing\AdminContext
   */
  protected $adminContext;

  /**
   * Creates a new AdminNegotiator instance.
   *
   * @param \Drupal\Core\Session\AccountInterface $user
   *   The current user.
   * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
   *   The config factory.
   * @param \Drupal\Core\Entity\EntityManagerInterface $entity_manager
   *   The entity manager.
   * @param \Drupal\Core\Routing\AdminContext $admin_context
   *   The route admin context to determine whether the route is an admin one.
   */
  public function __construct(AccountInterface $user, ConfigFactoryInterface $config_factory, EntityManagerInterface $entity_manager, AdminContext $admin_context) {
    $this->user = $user;
    $this->configFactory = $config_factory;
    $this->entityManager = $entity_manager;
    $this->adminContext = $admin_context;
  }

  /**
   * {@inheritdoc}
   */
  public function applies(RouteMatchInterface $route_match) {
    return ($this->entityManager->hasHandler('user_role', 'storage') && $this->user->hasPermission('view the administration theme') && $this->adminContext->isAdminRoute($route_match->getRouteObject()));
  }

  /**
   * {@inheritdoc}
   */
  public function determineActiveTheme(RouteMatchInterface $route_match) {
    return $this->configFactory->get('system.theme')->get('admin');
  }

}

Il codice è abbastanza facile da capire: il applies()metodo ritorna TRUEquando il percorso corrente è quello per cui il tuo modulo vuole cambiare il tema; il determineActiveTheme()metodo restituisce il nome della macchina del tema del tema da applicare.

Vedi anche ThemeNegotiator :: determinActiveTheme () non dovrebbe richiedere il passaggio di un RouteMatch per una possibile modifica degli argomenti ricevuti dai metodi utilizzati dai negoziatori di temi; se viene applicata quella patch, dovrai cambiare anche il codice del negoziatore di temi.


Non si applica apply () deve essere scritto come si applica ($ route_match) nell'esempio sopra? Ha pubblicato la stessa domanda nella pagina do collegata. Grazie!
Stefanos Petrakis,

@StefanosPetrakis Hmmm ... Qualsiasi implementazione corrente lo ottiene come parametro, contrariamente a quanto dice quel record di modifica.
kiamlaluno

Ho aggiornato la risposta, usando il codice che Drupal core sta effettivamente utilizzando in uno dei suoi negoziatori di temi.
kiamlaluno
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.