Wie ändere ich ein Thema basierend auf der URL?


38

Ich habe eine Drupal-Instanz auf example.org. Welches hat ein Theme X installiert und aktiviert. Jetzt soll für eine begrenzte Zeit eine Veranstaltung auf dem Gelände stattfinden, für die ein besonderer Abschnitt "herausgearbeitet" wurde. Alle mit diesem Ereignis zusammenhängenden Informationen werden unter example.org/event2011 abgerufen.

Ich möchte, dass ein anderes Thema angezeigt wird, wenn eine Seite in diesem Abschnitt angezeigt wird (z. B. http://example.org/event2011/about , http://example.org/event2011/node/123 ). Wie mache ich das?

Ich habe viele Module durchlaufen, aber keines von ihnen unterstützt Drupal 7. Am liebsten würde ich es mit Modulen machen und möchte auf Codeebene nichts an mir selbst ändern.


1
Möchten Sie eine separate Site unter dem Pfad / event2011 / node / 123 haben, wie Sie aussehen?
Jeremy French

Antworten:


33

In Anbetracht der Tatsache, dass die Änderung nur für einen begrenzten Zeitraum gültig ist und die Implementierung eines solchen Codes nicht schwierig ist, würde ich vorschlagen, ein benutzerdefiniertes Modul zu implementieren, das das Thema ändert, das für bestimmte Seiten verwendet wird.

Es reicht aus, hook_custom_theme()Folgendes zu implementieren :

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

Wenn Sie das Design nur für http://example.com/event2011 , aber nicht für http://example.com/event2011/node/123 ändern müssen, sollte der Code in geändert werden

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

Zur Verwendung der Theme-Callbacks in der Definition eines Menü-Callbacks heißt es in der Dokumentation :

In der Regel sollte die Verwendung von Theme-Callback-Funktionen auf Seiten beschränkt werden, deren Funktionalität sehr stark an ein bestimmtes Thema gebunden ist, da sie nur von Modulen überschrieben werden können, die speziell auf diese Seiten ausgerichtet sind hook_menu_alter(). Module, die allgemeinere Themenwechselfunktionen implementieren (z. B. ein Modul, mit dem das Thema dynamisch basierend auf der Rolle des aktuellen Benutzers festgelegt werden kann), sollten hook_custom_theme()stattdessen verwendet werden.


Ich würde die current_path () - Funktion api.drupal.org/api/drupal/includes%21path.inc/function/… vorschlagen . Sie haben eine einfachere "für" Bedingung
August

22

Eine benutzerdefinierte Lösung, wie sie in den anderen Kommentaren vorgeschlagen wird, ist wahrscheinlich die beste. Wenn Sie jedoch wirklich ein Modul verwenden möchten, ist ThemeKey die beste Wahl . Ab dem 23.05.11 gibt es eine stabile Version.


8

Alternativ können Sie die unten beschriebene neue theme callbackOption des Menüsystems verwenden hook_menu_alter(). ps Checkout hook_menu () für weitere Details zurtheme 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();
}
?>

Darüber hinaus gibt es auch ein Beispiel für die Verwendung der traditionelleren 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';
  }
}
?>

Entnommen aus: http://drupal.org/node/224333#custom_theme


6

Sie können einfach Context verwenden und das Thema verwenden, um angewendet zu werden, wenn der Pfad / event2011 / lautet. Sie können einfach den Pfad in den Zustand von cotext setzen und das Thema in der Aktion des Inhalts ändern. Dies war Sie können sehr einfach zwischen Themen auf einer Website basierend auf URL wechseln. Funktioniert sogar für Handys;)


Die Themenaktion übergibt benutzerdefinierte Variablen an das Thema, ändert es jedoch nicht
Alex Weber

6

Die Verwendung von ThemeKey ist einfach und das bislang beliebteste und leistungsfähigste Modul (mit Unterstützung für 8.x) für Themenwechselregeln, die die automatische Auswahl eines Themas in Abhängigkeit von aktuellem Pfad, Taxonomiebegriffen, Sprache, Knotentyp und vielen anderen Kriterien ermöglichen. viele andere Eigenschaften. Es kann auch problemlos erweitert werden, um zusätzliche Eigenschaften zu unterstützen, die von anderen Modulen bereitgestellt werden. Neben den Standardfunktionen erweitert ThemeKey automatisch die Funktionen vieler Contrib-Module und lässt diese durch Module erweitern.

Verwendung (7.x)

Gehen Sie nach dem Aktivieren des Moduls zu admin/config/user-interface/themekey. Es gibt viele Optionen zum Wechseln des Themas, aber wahrscheinlich interessieren path:node_aliasSie sich dafür. Stellen Sie den Wert so ein, wie Sie möchten, wie Sie / my_url sagen, und wählen Sie dann das Thema aus, das Sie unter dieser URL aktivieren möchten. Sie können auch Platzhalter wie web/*oder verwenden /^web/.*.

Überprüfen Sie, wie ein Thema für Pfad geladen wird

Fortgeschrittene Nutzung

ThemeKey 7.x enthält ein optionales Modul namens ThemeKey Example, um Entwicklern die Erweiterung von ThemeKey zu demonstrieren.

Hilfe (7.x)

Schauen Sie sich das Video-Tutorial von Mustardseed (7.x) an.

Weitere Hilfe zu diesem Thema finden Sie unter /admin/help/themekey.

Überprüfen Sie auch andere SE-Fragen im Zusammenhang mit .


Alternativ gibt es auch Switchtheme (7.x), das einen Block hinzufügt, mit dem Benutzer zwischen aktivierten Themen wechseln können.


5

Beachten Sie bei der Verwendung von URL-Aliasnamen oder des Pathauto-Moduls die Feinheiten und Unterschiede bei der Verwendung von Komponenten des aktuellen Drupal-Pfads.

Es gibt Situationen, in denen Sie arg () möglicherweise nicht verwenden möchten . Tatsächlich wird in der Drupal-API-Dokumentation empfohlen, die Verwendung dieser Funktion nach Möglichkeit zu vermeiden, da der resultierende Code schwer zu lesen ist.

Betrachten Sie das folgende Beispiel, wie es von kiamlaluno vorgeschlagen wurde :

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

In Drupal 7, wenn ein Knoten eine Alias von event2011 , indem arg(0)kehrt nodeals erste URL - Komponente, wie an den Alias entgegengesetzt.

print_r(arg(0));

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

Stattdessen, wenn Sie mit einem Aliasnamen arbeiten müssen gibt es mehr Möglichkeiten , die aktuelle URL in Drupal zu bekommen , einschließlich menu_get_object(), current_path(), request_path()und andere.

Hier ist ein überarbeitetes Beispiel, das einen Alias ​​als Auslöser für das Wechseln des Themas verwendet:

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

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

3

So wechseln Sie das Thema je nach Benutzerrolle:

Erstellen Sie ein benutzerdefiniertes Modul und kopieren und fügen Sie Folgendes ein:

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

Sie müssen ersetzen:

mymodule => mit deinem Modulnamen

Meine spezielle Rolle => mit dem Namen der Rolle, die Ihre Benutzer benötigen, damit sie ein anderes Thema sehen können.

mytheme => mit dem Namen des Themas, zu dem Sie wechseln möchten


1

Sie können das Seiten-Design- Modul verwenden, um genau das zu erreichen

Das Seiten-Design-Modul ist ein einfaches und benutzerfreundliches Modul, mit dem auf bestimmten Seiten andere Designs als die Site-Standardeinstellungen verwendet werden können.

Eigenschaften

  • Weisen Sie einer einzelnen Seite oder Liste von Seiten ein Thema zu. (Eine Seite als Drupal-Pfad festlegen)
  • Erlaubt die Verwendung des Zeichens '*' als Platzhalter in Drupal-Pfaden.
  • Gestatten, Themen zu ordnen. (Wenn mehrere Seiten definiert sind, wird das erste Thema in der Liste verwendet.)
  • Erlaubt das Aktivieren / Deaktivieren eines Themas.
  • Drupal-Neuling freundlich.

0

Mit dem Seiten- Design-Modul können Sie genau das erreichen: Das Seiten-Design-Modul ist ein einfaches und benutzerfreundliches Modul, mit dem auf bestimmten Seiten andere Designs als die Standard-Website verwendet werden können.

Eigenschaften :

Weisen Sie einer einzelnen Seite oder Liste von Seiten ein Thema zu. (Legen Sie eine Seite als Drupal-Pfad fest.) Ermöglichen Sie die Verwendung des Zeichens '*' als Platzhalter in Drupal-Pfaden. Gestatten, Themen zu ordnen. (Wenn mehrere Seiten definiert sind, wird das erste Thema in der Liste verwendet.) Ermöglicht das Aktivieren / Deaktivieren eines Themas. Drupal-Neuling freundlich.

Wie gewünscht, wie Sie es verwenden können: Abschnitte, die die meisten Funktionen des Seitenthemas aufweisen, jedoch eine rollenbasierte Auswahl und einen "PHP-Snippet" -Bereich zur Auswahl des Themas hinzufügen.

Wenn Sie jedoch beim Erstellen, Bearbeiten und Anzeigen von Seiten andere Themen als die Standard-Website verwenden möchten, können Sie das Inhalts-Design verwenden , mit dem beim Erstellen, Bearbeiten und Anzeigen von Seiten andere Themen als die Standard-Website verwendet werden können.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.