it-swarm-eu.dev

Správný způsob, jak programově změnit aktivní Drupal téma)?

Jaký je správný způsob, jak programově změnit aktivní Drupal téma)?

22
markdorison

Řešení Drupal 6:

Chcete se ujistit, že změníte globální $custom_theme proměnná poměrně brzy na spuštění stránky.

global $custom_theme;
$custom_theme = 'garland';
15
Dave Reid

Vím, že jste se ptali, jak to udělat programaticky, ale v případě, že je to vaše řešení, nikoli skutečný problém, můžete také použít modul ThemeKey . To vám umožní nastavit podmínky, které při splnění změní téma. Můžete vytvořit podmínky na základě cest, taxonomie, typu obsahu, vytvořit nebo upravit datum a další. Chcete-li získat ještě více možností, můžete také přidat modul modul Themekey Properties .

Opět vím, že to není programově, ale nejsem si jistý, zda skutečnou otázkou za vaší otázkou je, jak změnit témata na základě podmínek.

15
Chaulky

Nejlepší způsob, jak toho dosáhnout, je vytvořit aktualizační háček v modulu:

function yourmodule_update_N() {
  variable_set('theme_default','yourtheme');
}
14
Boga

V Drupal 7, použijte hook_custom_theme():

/**
 * Implements hook_custom_theme()
 * Switch theme for a mobile browser
 * @return string The theme to use
 */
function mymodule_custom_theme()  {
    //dpm($_SERVER['HTTP_USER_AGENT']);
    $theme = 'bartik'; // core theme, used as fallback
    $themes_available = list_themes(); // get available themes
    if (preg_match("/Mobile|Android|BlackBerry|iPhone|Windows Phone/", $_SERVER['HTTP_USER_AGENT'])) {
        if (array_key_exists('custommobiletheme', $themes_available)) $theme = 'custommobiletheme';
        else { drupal_set_message("Unable to switch to mobile theme, because it is not installed.", 'warning'); }
    }
    else if (array_key_exists('nonmobiletheme', $themes_available)) $theme = 'nonmobiletheme';
    // else, fall back to bartik

    return $theme;
}

Přizpůsobeno od <emoticode />

Vraťte strojově čitelný název motivu, který se použije pro aktuální stránku.

Komentáře pro tuto funkci mohou být užitečné pro přečtení:

Tento háček lze použít k dynamickému nastavení motivu pro aktuální požadavek na stránku. Měl by jej používat moduly, které potřebují přepsat téma na základě dynamických podmínek (například modul, který umožňuje nastavení motivu na základě aktuální role uživatele). Návratová hodnota tohoto zavěšení bude použita na všech stránkách kromě těch, které mají platný motiv na stránku nebo na sekci nastavený pomocí funkce zpětného volání motivu v hook_menu (); motivy na těchto stránkách lze přepsat pouze pomocí hook_menu_alter ().

Vrácení různých motivů na stejnou cestu nemusí fungovat s mezipamětí stránky. Toto je s největší pravděpodobností problém, pokud by anonymní uživatel na dané cestě mohl za různých podmínek vrátit různá témata.

Protože najednou lze použít pouze jedno téma, bude mít přednost poslední (tj. Nejváženější) modul, který z tohoto háku vrátí platné jméno tématu.

7
Agi Hammerthief

Změna aktivního motivu pomocí Drush

drush vset theme_default garland
drush vset admin_theme garland
drush cc all

Změna aktivního motivu pomocí modulu

Základy změny výchozího a administrativního tématu:

// Changes the theme to Garland
variable_set('theme_default', $theme_default);
// Changes the administration theme to Garland
variable_set('admin_theme', $admin_theme);

Zde je malá funkce, která bezpečně nastaví motivy zpět na výchozí Drupal motivy jako Bartik nebo Garland (testováno v Drupal 6 a 7)):

/**
 * Set the active Drupal themes (the default and the administration theme) to default ones.
 * Tested in Drupal 6, 7 (but possibly working in version 8 too according to the documentations [some similarities between 7 and 8]).
 */
function TESTMODULE_set_active_theme_to_default($affect_admin_theme = TRUE) {

  // Provides a list of currently available themes.
  $list_themes = list_themes(TRUE);
  // 6, 7, 8, etc.
  $major_version = (int)VERSION;

  $theme_default = isset($list_themes['bartik']) ? 'bartik' : 'garland';
  $admin_theme   = isset($list_themes['seven']) ? 'seven' : 'garland';

  // Changes the theme to Garland
  variable_set('theme_default', $theme_default);

  // Changes the administration theme to Garland if argument is TRUE
  if($affect_admin_theme){
    variable_set('admin_theme', $admin_theme);
  }

  // if Switchtheme module (https://drupal.org/project/switchtheme) is enabled, use it
  if (module_exists('switchtheme')) {
    if (empty($_GET['theme']) || $_GET['theme'] !== $theme_default) {
      $query = array(
        'theme' => $theme_default
      );
      // in D6, drupal_goto's second argument is the query string,
      // in >=D7, a more general $options array is used
      if($major_version < 7){
        $options = $query;
      }
      else{
        $options = array('query' => $query);
      }

      drupal_goto($_GET['q'], $options);
    }
  }

  drupal_set_message(t('Default theme has been changed to %theme_default, administration theme has been changed to %admin_theme.', array(
    '%theme_default' => $theme_default,
    '%admin_theme' => $admin_theme
  )));

}

Můžete to nazvat implementací hook_init () (komentář není potřeba):

/**
 * Implements hook_init()
 */
function TESTMODULE_init() {  
  // ATTENTION! Comment out the following line if it's not needed anymore!
  TESTMODULE_set_active_theme_to_default();
}
7
Sk8erPeter

Pro Drupal 8:

V nastavení.php

$config['system.theme']['default'] = 'my_custom_theme';

Aktualizujte konfiguraci programově:

\Drupal::configFactory()
->getEditable('system.theme')
->set('default', 'machine_name')
->save();
3
JeroenT