it-swarm.it

Come posso cambiare un tema in base all'URL?

Ho un Drupal in esecuzione su example.org. Che ha un tema X installato e attivato. Ora per un periodo limitato si suppone che si terrà un evento sul sito per il quale è presente una sezione speciale stato "scolpito". 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 es. http://example.org/event2011/about , http://example.org/event2011/node/12 ). 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 .

38
Samyak Bhuta

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 fosse necessario modificare il tema solo per http://example.com/event2011 , ma non per http://example.com/event2011/node/12 , quindi il codice deve essere modificato in

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

Per quanto riguarda l'uso 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 in hook_menu_alter(). I moduli che implementano funzionalità di cambio tema più generiche (ad esempio, un modulo che consente di impostare il tema in modo dinamico in base al ruolo dell'utente corrente) dovrebbero invece utilizzare hook_custom_theme().

33
kiamlaluno

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.

22
tim.plunkett

In alternativa puoi utilizzare la nuova opzione theme callback Del sistema di menu hook_menu_alter() come indicato di seguito. p.s Acquista hook_menu () per maggiori dettagli su 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();
}
?>

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

8
electblake

Usare ThemeKey è semplice ed è il modulo più popolare e potente finora (con supporto per 8.x) per cambiare tema regole che consentono la selezione automatica di un tema in base al percorso corrente, ai termini della tassonomia, alla lingua, al tipo di nodo e a 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 desideri come dici/my_url, quindi seleziona il tema che desideri abilitare in questo url. Puoi anche usare caratteri jolly come web/* o /^web/.*.

Controllare: 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)

Dai un'occhiata 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 a tema .


In alternativa c'è anche Switchtheme (7.x) che aggiunge un blocco per consentire agli utenti di passare da un tema all'altro.

6
kenorb

Puoi semplicemente usare Context e usare il tema per applicarti 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;)

6
Amitav Roy

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

Ci sono situazioni in cui potresti non voler usare arg () . In effetti, la documentazione Drupal API in realtà suggerisce 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 event2011, l'utilizzo di arg(0) restituirà node come primo Componente URL, al contrario dell'alias.

print_r(arg(0));

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

Invece, se devi lavorare con un alias ci sono diversi modi per ottenere l'URL corrente in Drupal , incluso 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';
  }
}
5
rjb

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 vuoi passare

3
drupalfever

È possibile utilizzare il modulo Tema della 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 Drupal path)
  • Consentire di utilizzare il carattere '*' come carattere jolly in Drupal percorsi.
  • 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.
1
IT Pro Manager

È possibile utilizzare 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 all'impostazione predefinita del sito su pagine specifiche.

Caratteristiche :

Assegna un tema a una singola pagina o a un elenco di pagine. (Imposta una pagina come Drupal path) Consenti di usare il carattere '*' come carattere jolly in Drupal percorsi. Consenti di organizzare i temi. (Se le pagine sono diversi definiti, verrà utilizzato il primo tema nell'elenco) Consenti di abilitare/disabilitare un tema. Drupal amichevole per principianti.

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 a quelli predefiniti del sito per la creazione, la modifica e la visualizzazione di contenuti, è possibile utilizzare Tema contenuto che consente di utilizzare temi diversi rispetto all'impostazione predefinita del sito per la creazione, la modifica e visualizzazione di pagine.

0
onlink