Come posso cambiare un tema in base all'URL?


38

Ho un'istanza di Drupal in esecuzione su example.org. Che ha un tema X installato e attivato. Ora per un periodo limitato un evento dovrebbe essere tenuto sul sito per il quale è stata "scolpita" una sezione speciale. Tutte le cose relative a quell'evento andranno a example.org/event2011.

Voglio avere un tema diverso da mostrare ogni volta che viene visualizzata una pagina in questa sezione (ad esempio http://example.org/event2011/about , http://example.org/event2011/node/123 ). Come lo faccio?

Ho attraversato molti moduli, ma nessuno di essi supporta Drupal 7. Preferibilmente, vorrei che fosse fatto usando i moduli e non volevo cambiare nulla da solo a livello di codice.


1
Stai cercando di avere un sito completamente separato sotto il percorso / event2011 / node / 123 come sei?
Jeremy French

Risposte:


33

Considerando che la modifica è per un periodo di tempo limitato e che l'implementazione di tale codice non è difficile, suggerirei di implementare un modulo personalizzato che modifica il tema utilizzato per pagine specifiche.

È sufficiente implementare hook_custom_theme()come segue:

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

Se è necessario modificare il tema solo per http://example.com/event2011 , ma non per http://example.com/event2011/node/123 , è necessario modificare il codice in

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

Per quanto riguarda l'utilizzo dei callback a tema nella definizione di un callback di menu, la documentazione dice:

Come regola generale, l'uso delle funzioni di callback del tema dovrebbe essere limitato alle pagine la cui funzionalità è strettamente legata a un particolare tema, poiché possono essere sovrascritte solo da moduli che hanno come target specifico quelle pagine hook_menu_alter(). I moduli che implementano funzionalità di commutazione del tema più generiche (ad esempio un modulo che consente di impostare il tema in modo dinamico in base al ruolo dell'utente corrente) dovrebbero hook_custom_theme()invece utilizzare .


Suggerirei la funzione current_path () api.drupal.org/api/drupal/includes%21path.inc/function/… . Avrai una condizione "per" più facile
agosto

22

Una soluzione personalizzata come suggerisce l'altro commento è probabilmente la migliore, ma se vuoi davvero usare un modulo, la tua scommessa migliore è ThemeKey . A partire dal 23/05/11, ha una versione stabile.


8

In alternativa è possibile utilizzare la nuova theme callbackopzione del sistema di menu hook_menu_alter()come indicato di seguito. ps Checkout hook_menu () per maggiori dettagli sutheme 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();
}
?>

Inoltre c'è anche un esempio dell'uso del più tradizionale 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';
  }
}
?>

Tratto da: http://drupal.org/node/224333#custom_theme


6

Puoi semplicemente usare il contesto e usare il tema per essere applicato quando il percorso è / event2011 / puoi semplicemente impostare il percorso in condizione di cotext e cambiare il tema nell'azione del contenuto. In questo modo puoi facilmente passare da un tema all'altro in un sito basato sull'URL. Funziona anche per cellulari;)


l'azione del tema passa variabili personalizzate al tema, in realtà non lo cambia
Alex Weber,

6

L'uso di ThemeKey è semplice ed è il modulo più popolare e potente finora (con supporto per 8.x) per le regole di commutazione dei temi che consentono la selezione automatica di un tema in base al percorso corrente, termini di tassonomia, lingua, tipo di nodo e molti, molte altre proprietà. Può anche essere facilmente esteso per supportare proprietà aggiuntive esposte da altri moduli. Oltre alle funzionalità standard, ThemeKey estende automaticamente le funzionalità di molti moduli contrib e ha moduli che lo estendono.

Utilizzo (7.x)

Dopo aver abilitato il modulo, vai a admin/config/user-interface/themekey. Ci sono molte opzioni per cambiare il tema, ma probabilmente ti interesserebbe path:node_alias, quindi imposta il valore come vuoi come dici / my_url e quindi seleziona il tema che vuoi abilitare in questo url. È inoltre possibile utilizzare caratteri jolly come web/*o /^web/.*.

Verifica: come caricare un tema per il percorso

Utilizzo avanzato

ThemeKey 7.x contiene un modulo opzionale chiamato ThemeKey Example per dimostrare agli sviluppatori come estendere ThemeKey.

Aiuto (7.x)

Guarda il video tutorial di Mustardseed (7.x).

Ulteriori informazioni su tale argomento sono disponibili all'indirizzo /admin/help/themekey.

Controlla anche le altre domande SE relative al .


In alternativa c'è anche Switchtheme (7.x) che aggiunge un blocco per consentire agli utenti di passare tra i temi abilitati.


5

Quando si utilizzano gli alias URL o il modulo Pathauto , prestare attenzione alle sottigliezze e alle differenze quando si utilizzano componenti del percorso Drupal corrente.

Ci sono situazioni in cui potresti non voler usare arg () . In effetti, la documentazione dell'API Drupal suggerisce in realtà di evitare l'uso di questa funzione laddove possibile, poiché il codice risultante è difficile da leggere.

Considera il seguente esempio, come proposto da kiamlaluno :

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

In Drupal 7, se un nodo ha un alias di event2011 , using arg(0)restituirà nodecome primo componente URL, al contrario dell'alias .

print_r(arg(0));

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

Invece, se avete bisogno di lavorare con un alias ci sono diversi modi per ottenere l'URL corrente in Drupal , tra cui menu_get_object(), current_path(), request_path()e altri.

Ecco un esempio rielaborato che utilizza un alias come trigger per cambiare il tema:

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

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

3

Come cambiare tema in base al ruolo dell'utente:

Crea un modulo personalizzato e copia e incolla quanto segue:

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

Devi sostituire:

mymodule => con il nome del tuo modulo

il mio ruolo speciale => con il nome del ruolo che i tuoi utenti dovranno avere per poter vedere un tema diverso.

mytheme => con il nome del tema a cui si desidera passare


1

È possibile utilizzare il modulo Tema pagina per ottenere esattamente questo

Il modulo Tema pagina è un modulo semplice e facile da usare che consente di utilizzare temi diversi rispetto al valore predefinito del sito su pagine specifiche.

Caratteristiche

  • Assegna un tema a una singola pagina o a un elenco di pagine. (Imposta una pagina come percorso Drupal)
  • Consentire di utilizzare il carattere '*' come carattere jolly nei percorsi Drupal.
  • Consenti di organizzare i temi. (Se le pagine sono definite in modo diverso, verrà utilizzato il primo tema nell'elenco)
  • Consenti di abilitare / disabilitare un tema.
  • Drupal alle prime armi.

0

È possibile utilizzare il modulo Tema pagina per ottenere esattamente questo: Il modulo Tema pagina è un modulo semplice e facile da usare che consente di utilizzare temi diversi rispetto al valore predefinito del sito su pagine specifiche.

Caratteristiche :

Assegna un tema a una singola pagina o a un elenco di pagine. (Imposta una pagina come percorso Drupal) Consenti di utilizzare il carattere '*' come carattere jolly nei percorsi Drupal. Consenti di organizzare i temi. (Se le pagine sono definite in modo diverso, verrà utilizzato il primo tema nell'elenco) Consenti di abilitare / disabilitare un tema. Drupal alle prime armi.

come puoi usare: sezioni che hanno la maggior parte delle stesse funzionalità del tema Pagina, ma aggiunge una selezione basata sui ruoli e un'area "frammento php" per scegliere il tema.

ma se si desidera utilizzare temi diversi rispetto alle impostazioni predefinite del sito per la creazione, la modifica e la visualizzazione dei contenuti, è possibile utilizzare Tema contenuti che consente di utilizzare temi diversi rispetto alle impostazioni predefinite del sito per la creazione, la modifica e la visualizzazione dei contenuti.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.