Comment changer un thème basé sur l'URL?


38

J'ai une instance de Drupal sur example.org. Qui a un thème X installé et activé. Désormais, pendant une période limitée, un événement est censé se dérouler sur le site pour lequel une section spéciale a été "découpée". Toutes les choses liées à cet événement iront à example.org/event2011.

Je souhaite afficher un thème différent chaque fois qu'une page de cette section est affichée (par exemple, http://example.org/event2011/about , http://example.org/event2011/node/123 ). Comment je fais ça?

J'ai parcouru de nombreux modules, mais aucun ne prend en charge Drupal 7. De préférence, j'aimerais que ce soit fait à l'aide de modules et je ne veux rien changer moi-même au niveau du code.


1
Souhaitez-vous avoir un site entièrement séparé sous le chemin / event2011 / node / 123?
Jeremy French

Réponses:


33

Étant donné que le changement concerne une période limitée et que la mise en œuvre d'un tel code n'est pas difficile, je suggérerais de mettre en œuvre un module personnalisé qui modifie le thème utilisé pour des pages spécifiques.

Il suffit de mettre hook_custom_theme()en œuvre comme suit:

function mymodule_custom_theme() {
  if (arg(0) == 'event2011') {
    return 'the theme to use for that page';
  }
}

Si vous devez modifier le thème uniquement pour http://example.com/event2011 , mais pas pour http://example.com/event2011/node/123 , le code doit être remplacé par

function mymodule_custom_theme() {
  if (arg(0) == 'event2011' && !arg(1)) {
    return 'the theme to use for that page';
  }
}

En ce qui concerne l'utilisation des rappels de thème dans la définition d'un rappel de menu, la documentation indique:

En règle générale, l’utilisation des fonctions de rappel de thème doit être limitée aux pages dont les fonctionnalités sont très étroitement liées à un thème particulier, car elles ne peuvent être remplacées que par des modules qui ciblent spécifiquement ces pages hook_menu_alter(). Les modules implémentant des fonctionnalités de commutation de thème plus génériques (par exemple, un module permettant de définir le thème de manière dynamique en fonction du rôle de l'utilisateur actuel) doivent utiliser à la hook_custom_theme()place.


Je suggérerais la fonction current_path () api.drupal.org/api/drupal/includes%21path.inc/function/… . Vous aurez une plus facile « pour » état
augusto

22

Une solution personnalisée comme l’autre commentaire suggère est probablement la meilleure solution, mais si vous voulez vraiment utiliser un module, votre meilleur choix est ThemeKey . Depuis le 23/05/11, il a une version stable.


8

Sinon, vous pouvez utiliser la nouvelle theme callbackoption du système de menus, hook_menu_alter()comme indiqué ci-dessous. ps Checkout hook_menu () pour plus de détails sur latheme callback

<?php
/**
* Implements hook_menu_alter().
*/
function mymodule_menu_alter(&$items) {
  // Set the theme callback function for all node pages. As per the
  // standard behavior for hook_menu() properties, this will be
  // inherited by all paths underneath node/%node as well, unless
  // they define their own theme callback.
  $items['node/%node']['theme callback'] = 'mymodule_default_node_theme';

  // Set a different theme callback for node edit pages, and pass
  // along the node object to this function so we can make decisions
  // based on it.
  $items['node/%node/edit']['theme callback'] = 'mymodule_edit_node_theme';
  $items['node/%node/edit']['theme arguments'] = array(1);
}
/**
* Defaults to using the 'some_theme' theme for node pages.
*/
function mymodule_default_node_theme() {
  return 'some_theme';
}

/**
* For editing page nodes, uses the 'some_other_theme' theme.
*/
function mymodule_edit_node_theme($node) {
  return $node->type == 'page' ? 'some_other_theme' : mymodule_default_node_theme();
}
?>

De plus, il y a aussi un exemple d'utilisation du plus traditionnel hook_custom_theme()

<?php 
/**
* Implements hook_custom_theme().
*/
function mymodule_custom_theme() {
  // check path using arg(0)
  // check $user
  // do whatever special checking you want and simply return theme key (name of theme folder most of the time)
    return 'special_theme';
  }
}
?>

Tiré de: http://drupal.org/node/224333#custom_theme


6

Vous pouvez simplement utiliser Context et utiliser le thème pour être appliqué lorsque le chemin est / event2011 / vous pouvez simplement définir le chemin en condition de cotext et changer le thème dans l'action du contenu. C'était que vous pouvez très facilement basculer entre les thèmes sur un site basé sur l'URL. Même travaille pour les mobiles;)


l'action de thème transmet des variables personnalisées au thème, elle ne le change pas réellement
Alex Weber

6

Utiliser ThemeKey est simple et c’est le module le plus populaire et le plus populaire à ce jour (avec prise en charge de 8.x) pour les règles de commutation de thème qui permettent la sélection automatique d’un thème en fonction du chemin actuel, des termes de taxonomie, de la langue, du type de nœud, etc. beaucoup d'autres propriétés. Il peut également être facilement étendu pour prendre en charge des propriétés supplémentaires exposées par d'autres modules. Outre les fonctionnalités standard, ThemeKey étend automatiquement les fonctionnalités de nombreux modules contrib et est étendu par des modules.

Utilisation (7.x)

Après avoir activé le module, allez à admin/config/user-interface/themekey. Il existe de nombreuses options pour changer de thème, mais cela vous intéressera probablement path:node_alias. Réglez donc la valeur comme vous le souhaitez, comme vous le dites / my_url, puis sélectionnez le thème que vous souhaitez activer à cette adresse. Vous pouvez également utiliser des caractères génériques tels que web/*ou/^web/.* .

Vérifier: Comment charger un thème pour un chemin

Utilisation avancée

ThemeKey 7.x contient un module optionnel appelé ThemeKey Example pour montrer aux développeurs comment étendre ThemeKey.

Aide (7.x)

Découvrez le didacticiel vidéo de Mustardseed (7.x).

Plus d'aide sur ce sujet peut être trouvée à /admin/help/themekey.

Vérifiez également les autres questions SE liées à .


Alternativement, il existe également Switchtheme (7.x) qui ajoute un bloc pour permettre aux utilisateurs de basculer entre les thèmes activés.


5

Lorsque vous utilisez des alias d'URL ou le module Pathauto , tenez compte des subtilités et des différences lors de l'utilisation de composants du chemin Drupal actuel.

Il y a des situations où vous pouvez ne pas vouloir utiliser arg () . En fait, la documentation de l'API Drupal suggère en fait d'éviter l'utilisation de cette fonction dans la mesure du possible, car le code résultant est difficile à lire.

Prenons l'exemple suivant, proposé par kiamlaluno :

function mymodule_custom_theme() {
  if (arg(0) == 'event2011') {
    return 'custom_theme_machine_name';
  }
}

Dans Drupal 7, si un nœud a un alias de event2011 , using arg(0)retournera en nodetant que premier composant URL, par opposition à l'alias.

print_r(arg(0));

Array
(
    [0] => node
    [1] => 150
)

Au lieu de cela, si vous avez besoin de travailler avec un alias , il y a plusieurs façons d'obtenir l'URL actuelle dans Drupal , y compris menu_get_object(), current_path(), request_path()et d' autres.

Voici un exemple retravaillé qui utilise un alias comme déclencheur pour changer de thème:

function mymodule_custom_theme() {
  $current_page_path = explode('/', request_path());      

  if ($current_page_path[0] == 'event2011') {
    return 'custom_theme_machine_name';
  }
}

3

Comment changer de thème en fonction du rôle de l'utilisateur:

Créez un module personnalisé et copiez-collez les éléments suivants:

<?php
/**
 * Implementation of hook_init().
 */
function mymodule_init() {
  global $custom_theme, $user;
  if (in_array('my special role', $user->roles)) {
    $custom_theme = 'mytheme';
  }
}
?>

Vous devez remplacer:

mymodule => avec votre nom de module

mon rôle spécial => avec le nom du rôle que vos utilisateurs devront avoir pour qu'ils puissent voir un thème différent.

mytheme => avec le nom du thème que vous souhaitez basculer vers


1

Vous pouvez utiliser le module Thème de page pour obtenir exactement cela

Le module Thème de page est un module simple et facile à utiliser qui permet d’utiliser des thèmes différents de ceux proposés par défaut sur le site par défaut.

traits

  • Attribuez un thème à une seule page ou à une liste de pages. (Définir une page en tant que chemin Drupal)
  • Permet d'utiliser le caractère '*' comme caractère générique dans les chemins Drupal.
  • Permet d'organiser des thèmes. (Si plusieurs pages sont définies, le premier thème de la liste sera utilisé)
  • Autoriser à activer / désactiver un thème.
  • Drupal novice amical.

0

Vous pouvez utiliser le module Thème de page pour obtenir exactement cela: Le module Thème de page est un module simple et facile à utiliser qui permet d’utiliser des thèmes différents de ceux du site par défaut sur des pages spécifiques.

Caractéristiques :

Attribuez un thème à une seule page ou à une liste de pages. (Définir une page en tant que chemin Drupal) Permet d'utiliser le caractère '*' comme caractère générique dans les chemins Drupal. Permet d'organiser des thèmes. (Si plusieurs pages sont définies, le premier thème de la liste sera utilisé) Autoriser pour activer / désactiver un thème. Drupal novice amical.

de même que vous pouvez utiliser: Sections qui ont la plupart des mêmes fonctionnalités que le thème de la page, mais ajoute une sélection basée sur le rôle et une zone "extrait php" pour choisir le thème.

Toutefois, si vous souhaitez utiliser des thèmes différents de ceux définis par défaut par le site pour la création, la modification et l'affichage de pages, vous pouvez utiliser le thème de contenu, qui permet d'utiliser des thèmes différents de ceux définis par défaut pour la création, la modification et la visualisation de contenu.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.