web-dev-qa-db-fra.com

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

J'ai une Drupal exécutée sur example.org. Qui a un thème X installé et activé. Maintenant, pour une période limitée, un événement est censé se tenir sur le site pour lequel une section spéciale a été "découpé". 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 consultée (par exemple http://example.org/event2011/about , http://example.org/event2011/node/12 ). Comment je fais ça?

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

38
Samyak Bhuta

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

Il suffit d'implémenter hook_custom_theme() 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/12 , le code doit être changé en

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

Quant à l'utilisation des rappels de thème dans la définition d'un rappel de menu, la documentation dit:

En règle générale, l'utilisation des fonctions de rappel de thème doit être limitée aux pages dont la fonctionnalité est très étroitement liée à un thème particulier, car elles ne peuvent être remplacées que par des modules qui ciblent spécifiquement ces pages dans hook_menu_alter(). Les modules implémentant une fonctionnalité de changement de thème plus générique (par exemple, un module qui permet au thème d'être défini dynamiquement en fonction du rôle de l'utilisateur actuel) devraient utiliser hook_custom_theme() à la place.

33
kiamlaluno

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

22
tim.plunkett

Vous pouvez également utiliser la nouvelle option theme callback Du système de menus hook_menu_alter() comme indiqué ci-dessous. p.s Checkout hook_menu () pour plus de détails sur le theme 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 existe également un exemple d'utilisation de la fonction hook_custom_theme() plus traditionnelle _

<?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

8
electblake

L'utilisation de ThemeKey est simple et c'est le module le plus populaire et le plus puissant jusqu'à présent (avec prise en charge de 8.x) pour le changement de thème des règles qui permettent la sélection automatique d'un thème en fonction du chemin d'accès actuel, des termes de taxonomie, de la langue, du type de nœud et de nombreuses 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 ses fonctionnalités à de nombreux modules contrib et comporte des modules qui l'étendent.

Utilisation (7.x)

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

Vérifiez: Comment charger un thème pour le chemin

Utilisation avancée

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

Aide (7.x)

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

Vous trouverez plus d'aide à ce sujet sur /admin/help/themekey.

Consultez également les autres questions SE liées à themekey .


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

6
kenorb

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. Vous pouvez ainsi basculer très facilement entre les thèmes d'un site en fonction de l'URL. Fonctionne même pour les mobiles;)

6
Amitav Roy

Lorsque vous utilisez alias d'URL ou module Pathauto , soyez conscient des subtilités et des différences lors de l'utilisation des composants du chemin Drupal Drupal $ === actuel).

Il y a des situations où vous ne voudrez peut-être pas utiliser arg () . En fait, la documentation de l'API Drupal suggère en fait d'éviter d'utiliser cette fonction lorsque cela est possible, car le code résultant est difficile à lire.

Prenons l'exemple suivant, tel que proposé par kiamlaluno :

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

Dans Drupal 7, si un noeud a un alias event2011, l'utilisation de arg(0) renverra node comme premier Composant URL, par opposition à l'alias.

print_r(arg(0));

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

Au lieu de cela, si vous devez travailler avec un alias, il existe 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';
  }
}
5
rjb

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

Créez un module personnalisé et copiez et 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 le nom de votre module

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

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

3
drupalfever

Vous pouvez utiliser le module Thème de la page pour réaliser exactement cela

Le module Page Theme 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éfinissez une page comme un Drupal)
  • Permet d'utiliser le caractère '*' comme caractère générique dans les chemins Drupal.
  • Permet d'organiser les thèmes. (Si plusieurs pages sont définies, le premier thème de la liste sera utilisé)
  • Permet d'activer/désactiver un thème.
  • Drupal novice friendly.
1
IT Pro Manager

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

Traits :

Attribuez un thème à une seule page ou à une liste de pages. (Définissez une page comme un chemin Drupal) Autorisez l'utilisation du caractère '*' comme caractère générique dans les chemins Drupal. Autorisez l'organisation des thèmes. (Si les pages sont plusieurs définis, le premier thème de la liste sera utilisé) Permet d'activer/désactiver un thème. Drupal amical novice.

comme 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 les rôles et une zone "d'extrait php" pour choisir le thème.

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

0
onlink