Jak zmienić motyw na podstawie adresu URL?

38

Mam instancję Drupala działającą na example.org. Który ma zainstalowany i aktywowany motyw X. Teraz przez ograniczony czas w miejscu, w którym została „wydzielona” specjalna sekcja, powinno się odbyć wydarzenie. Wszystkie rzeczy związane z tym wydarzeniem będą dostępne na stronie example.org/event2011.

Chcę wyświetlać inny motyw przy każdym wyświetlaniu strony w tej sekcji (np. Http://example.org/event2011/about , http://example.org/event2011/node/123 ). W jaki sposób mogę to zrobić?

Przeszedłem przez wiele modułów, ale żaden z nich nie obsługuje Drupala 7. Najlepiej byłoby, gdyby zrobiono to za pomocą modułów i nie chcę niczego zmieniać na poziomie kodu.

Samyak Bhuta
źródło
1
Czy chcesz, aby pod ścieżką / event2011 / node / 123 wyglądała cała osobna strona?
Jeremy French,

Odpowiedzi:

33

Biorąc pod uwagę, że zmiana jest ograniczona czasowo i że implementacja takiego kodu nie jest trudna, proponuję zaimplementować niestandardowy moduł zmieniający motyw używany na określonych stronach.

Wystarczy zaimplementować hook_custom_theme()w następujący sposób:

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

Jeśli trzeba zmienić motyw tylko dla http://example.com/event2011 , ale nie dla http://example.com/event2011/node/123 , należy zmienić kod na

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

Jeśli chodzi o korzystanie z wywołań tematycznych w definicji wywołania zwrotnego menu, dokumentacja mówi:

Zasadniczo korzystanie z funkcji wywołania zwrotnego kompozycji powinno być ograniczone do stron, których funkcjonalność jest bardzo ściśle związana z określonym motywem, ponieważ można je zastąpić tylko modułami, które są specjalnie kierowane na te strony hook_menu_alter(). hook_custom_theme()Zamiast tego należy używać modułów wdrażających bardziej ogólną funkcję przełączania motywów (na przykład moduł, który umożliwia dynamiczne ustawianie motywu w zależności od roli bieżącego użytkownika) .

kiamlaluno
źródło
Sugerowałbym funkcję current_path () api.drupal.org/api/drupal/includes%21path.inc/function/… . Będziesz miał łatwiejszy stan „za”
sierpień
22

Niestandardowe rozwiązanie, jak sugeruje inny komentarz, jest prawdopodobnie najlepsze, ale jeśli naprawdę chcesz użyć modułu, najlepszym rozwiązaniem jest ThemeKey . Od 23.05.11 ma stabilne wydanie.

tim.plunkett
źródło
8

Alternatywnie możesz użyć nowej theme callbackopcji systemu menu, hook_menu_alter()jak opisano poniżej. ps Checkout hook_menu (), aby uzyskać więcej informacji na temattheme 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();
}
?>

Dodatkowo istnieje również przykład użycia bardziej tradycyjnego 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';
  }
}
?>

Zaczerpnięte z: http://drupal.org/node/224333#custom_theme

electblake
źródło
6

Możesz po prostu użyć kontekstu i użyć motywu, aby zastosować go, gdy ścieżka to / event2011 /, możesz po prostu ustawić ścieżkę w stanie cotext i zmienić motyw w działaniu zawartości. Dzięki temu możesz bardzo łatwo przełączać się między motywami w witrynie na podstawie adresu URL. Działa nawet na telefony komórkowe;)

Amitav Roy
źródło
akcja motywu przekazuje niestandardowe zmienne do motywu, tak naprawdę go nie zmienia
Alex Weber
6

Korzystanie z ThemeKey jest proste i jak dotąd jest najpopularniejszym i najmocniejszym modułem (z obsługą wersji 8.x) reguł przełączania motywów, które pozwalają na automatyczny wybór motywu w zależności od bieżącej ścieżki, terminów taksonomicznych, języka, typu węzła i wielu innych, wiele innych właściwości. Można go również łatwo rozszerzyć, aby obsługiwał dodatkowe właściwości ujawniane przez inne moduły. Oprócz standardowych funkcji ThemeKey automatycznie rozszerza funkcje wielu modułów contrib i ma moduły rozszerzające go.

Użycie (7.x)

Po włączeniu modułu przejdź do admin/config/user-interface/themekey. Istnieje wiele opcji przełączania motywu, ale prawdopodobnie path:node_aliasbyłbyś zainteresowany , więc ustaw wartość, jak chcesz, tak jak mówisz / my_url, a następnie wybierz motyw, który chcesz włączyć w tym adresie URL. Możesz także używać symboli wieloznacznych, takich jak web/*lub /^web/.*.

Sprawdź: jak załadować motyw ścieżki

Zaawansowane użycie

ThemeKey 7.x zawiera opcjonalny moduł o nazwie ThemeKey Przykład, aby zademonstrować programistom, jak rozszerzyć ThemeKey.

Pomoc (7.x)

Sprawdź samouczek wideo autorstwa Mustardseed (7.x).

Więcej pomocy na ten temat można znaleźć na stronie /admin/help/themekey.

Sprawdź także inne pytania dotyczące SE związane z .


Alternatywnie istnieje również Switchtheme (7.x), który dodaje blok, aby umożliwić użytkownikom przełączanie się między włączonymi motywami.

kenorb
źródło
5

Korzystając z aliasów URL lub modułu Pathauto , pamiętaj o subtelnościach i różnicach podczas korzystania ze składników bieżącej ścieżki Drupal.

Są sytuacje, w których możesz nie chcieć używać arg () . W rzeczywistości dokumentacja Drupal API faktycznie sugeruje unikanie korzystania z tej funkcji tam, gdzie to możliwe, ponieważ wynikowy kod jest trudny do odczytania.

Rozważ następujący przykład zaproponowany przez kiamlaluno :

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

W Drupal 7, jeśli węzeł ma alias event2011 , użycie arg(0)zwróci nodejako pierwszy składnik adresu URL, w przeciwieństwie do aliasu.

print_r(arg(0));

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

Zamiast tego, jeśli trzeba pracować z aliasu istnieje kilka sposobów, aby uzyskać aktualny adres URL w Drupal , włącznie z menu_get_object(), current_path(), request_path()i inne.

Oto przerobiony przykład, który używa aliasu jako wyzwalacza do przełączania motywu:

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

  if ($current_page_path[0] == 'event2011') {
    return 'custom_theme_machine_name';
  }
}
rjb
źródło
3

Jak zmienić motyw w zależności od roli użytkownika:

Utwórz niestandardowy moduł, a następnie skopiuj i wklej następujące elementy:

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

Musisz wymienić:

mymodule => z nazwą twojego modułu

moja specjalna rola => z nazwą roli, którą będą musieli pełnić Twoi użytkownicy, aby mogli zobaczyć inny motyw.

mytheme => z nazwą motywu, na który chcesz się przełączyć

drupalfever
źródło
1

Możesz użyć modułu Motyw strony , aby dokładnie to osiągnąć

Moduł Motyw strony jest prostym i łatwym w użyciu modułem, który pozwala używać innych motywów niż domyślna strona na określonych stronach.

cechy

  • Przypisz motyw do pojedynczej strony lub listy stron. (Ustaw stronę jako ścieżkę Drupala)
  • Pozwól używać znaku „*” jako symbolu wieloznacznego na ścieżkach Drupala.
  • Pozwalaj układać motywy. (Jeśli strony mają kilka zdefiniowanych stron, zostanie użyty pierwszy motyw na liście)
  • Pozwól włączyć / wyłączyć motyw.
  • Drupal początkujący przyjazny.
Menedżer IT Pro
źródło
0

Możesz użyć modułu Motyw strony, aby osiągnąć dokładnie to: Moduł Motyw strony jest prostym i łatwym w użyciu modułem, który pozwala używać innych motywów niż domyślna strona na określonych stronach.

Cechy :

Przypisz motyw do pojedynczej strony lub listy stron. (Ustaw stronę jako ścieżkę Drupala) Pozwól używać znaku „*” jako symbolu wieloznacznego w ścieżkach Drupala. Pozwalaj układać motywy. (Jeśli strony mają kilka zdefiniowanych definicji, zostanie użyty pierwszy motyw z listy). Pozwól włączyć / wyłączyć motyw. Drupal początkujący przyjazny.

tak jak możesz: Sekcje, które mają większość takich samych funkcji jak Motyw strony, ale dodają wybór oparty na rolach i obszar „fragmentu php” do wyboru motywu.

ale jeśli chcesz używać innych motywów niż domyślna strona do tworzenia, edytowania i przeglądania stron, możesz użyć motywu treści, który pozwala używać innych motywów niż domyślny serwis do tworzenia, edytowania i przeglądania stron.

onlink
źródło