Como altero um tema com base no URL?

38

Eu tenho uma instância do Drupal em execução no example.org. Que tem um tema X instalado e ativado. Agora, por um período limitado, um evento deve ser realizado no site para o qual uma seção especial foi "esculpida". Todas as coisas relacionadas a esse evento irão para example.org/event2011.

Eu quero ter um tema diferente para ser mostrado sempre que uma página sob esta seção é visto (por exemplo http://example.org/event2011/about , http://example.org/event2011/node/123 ). Como faço isso?

Eu já passei por muitos módulos, mas nenhum deles suporta o Drupal 7. De preferência, eu gostaria que isso fosse feito usando módulos e não quero mudar nada no nível do código.

Samyak Bhuta
fonte
1
Você deseja ter um site separado inteiro sob o caminho / event2011 / node / 123 como você é?
Jeremy French

Respostas:

33

Considerando que a mudança ocorre por um período limitado de tempo e que a implementação desse código não é difícil, sugiro que implemente um módulo personalizado que altere o tema que está sendo usado para páginas específicas.

Basta implementar da hook_custom_theme()seguinte maneira:

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

Se você precisar alterar o tema apenas para http://example.com/event2011 , mas não para http://example.com/event2011/node/123 , o código deverá ser alterado para

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

Quanto ao uso de retornos de chamada de tema na definição de um retorno de menu, a documentação diz:

Como regra geral, o uso de funções de retorno de chamada de tema deve ser limitado a páginas cuja funcionalidade está intimamente ligada a um tema específico, uma vez que elas só podem ser substituídas por módulos direcionados especificamente a essas páginas hook_menu_alter(). Os módulos que implementam uma funcionalidade de troca de tema mais genérica (por exemplo, um módulo que permita que o tema seja definido dinamicamente com base na função do usuário atual) devem ser usados hook_custom_theme().

kiamlaluno
fonte
Eu sugeriria a função current_path () api.drupal.org/api/drupal/includes%21path.inc/function/… . Você vai ter um mais fácil "para" condição
augusto
22

Uma solução personalizada como o outro comentário sugere é provavelmente a melhor, mas se você realmente deseja usar um módulo, sua melhor aposta é a ThemeKey . A partir de 23/05/11, ele possui uma versão estável.

tim.plunkett
fonte
8

Como alternativa, você pode usar a nova theme callbackopção do sistema de menus, hook_menu_alter()conforme descrito abaixo. ps Checkout hook_menu () para obter mais detalhes sobre otheme 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();
}
?>

Além disso, há também um exemplo de uso dos métodos mais tradicionais 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';
  }
}
?>

Retirado de: http://drupal.org/node/224333#custom_theme

electblake
fonte
6

Você pode simplesmente usar o Contexto e usar o tema para ser aplicado quando o caminho for / event2011 /. Você pode simplesmente definir o caminho na condição de cotext e alterar o tema na ação do conteúdo. Foi assim que você pode alternar facilmente entre temas em um site com base no URL. Até funciona para celulares;)

Amitav Roy
fonte
a ação tema passa variáveis personalizadas para o tema, que na verdade não mudá-lo
Alex Weber
6

O uso do ThemeKey é simples e, até o momento, é o módulo mais popular e poderoso (com suporte para 8.x) para regras de troca de temas que permitem a seleção automática de um tema, dependendo do caminho atual, termos de taxonomia, idioma, tipo de nó e muitos, muitas outras propriedades. Também pode ser facilmente estendido para suportar propriedades adicionais expostas por outros módulos. Além dos recursos padrão, o ThemeKey estende automaticamente os recursos de muitos módulos contrib e possui módulos que o estendem.

Uso (7.x)

Após ativar o módulo, vá para admin/config/user-interface/themekey. Existem muitas opções para alternar o tema, mas provavelmente você se interessaria path:node_alias; portanto, defina o valor conforme desejar / my_url e selecione o tema que deseja ativar nesse URL. Você também pode usar curingas como web/*ou /^web/.*.

Verificação: Como carregar um tema para o caminho

Uso avançado

O ThemeKey 7.x contém um módulo opcional chamado ThemeKey Example para demonstrar aos desenvolvedores como estender o ThemeKey.

Ajuda (7.x)

Confira o tutorial em vídeo da Mustardseed (7.x).

Mais ajuda sobre esse tópico pode ser encontrada em /admin/help/themekey.

Verifique também outras questões relacionadas ao .


Como alternativa, também existe o Switchtheme (7.x), que adiciona um bloco para permitir que os usuários alternem entre os temas ativados.

kenorb
fonte
5

Ao usar aliases de URL ou o módulo Pathauto , esteja ciente das sutilezas e diferenças ao usar componentes do caminho atual do Drupal.

Há situações em que você pode não querer usar arg () . De fato, a documentação da API Drupal na verdade sugere evitar o uso dessa função sempre que possível, pois o código resultante é difícil de ler.

Considere o seguinte exemplo, conforme proposto por kiamlaluno :

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

No Drupal 7, se um nó tiver um alias de event2011 , use arg(0)retornará nodecomo o primeiro componente de URL, em oposição ao alias.

print_r(arg(0));

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

Em vez disso, se você precisa trabalhar com um alias, existem várias maneiras de obter a URL atual em Drupal , incluindo menu_get_object(), current_path(), request_path()e outros.

Aqui está um exemplo reformulado que usa um alias como gatilho para alternar o tema:

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

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

Como alternar tema dependendo da função do usuário:

Crie um módulo personalizado e copie e cole o seguinte:

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

Você precisa substituir:

mymodule => com o nome do seu módulo

minha função especial => com o nome da função que seus usuários precisam ter para que possam ver um tema diferente.

mytheme => com o nome do tema para o qual você deseja alternar

drupalfever
fonte
1

Você pode usar o módulo Tema da página para obter exatamente isso

O módulo Tema da página é um módulo simples e fácil de usar, que permite usar temas diferentes do padrão do site em páginas específicas.

Recursos

  • Atribua um tema a uma única página ou lista de páginas. (Defina uma página como um caminho Drupal)
  • Permite usar o caractere '*' como curinga nos caminhos do Drupal.
  • Permitir organizar temas. (Se houver várias páginas definidas, o primeiro tema da lista será usado)
  • Permitir ativar / desativar um tema.
  • Drupal iniciante amigável.
Gerente profissional de TI
fonte
0

Você pode usar o módulo Tema da página para obter exatamente isso: O módulo Tema da página é um módulo simples e fácil de usar, que permite usar temas diferentes do padrão do site em páginas específicas.

Recursos :

Atribua um tema a uma única página ou lista de páginas. (Defina uma página como um caminho Drupal) Permite usar o caractere '*' como curinga nos caminhos Drupal. Permitir organizar temas. (Se houver várias páginas definidas, o primeiro tema da lista será usado) Permitir ativar / desativar um tema. Drupal iniciante amigável.

como você pode usar: Seções que possuem a maioria dos recursos do Tema da página, mas adicionam uma seleção baseada em função e uma área "snpet php" para escolher o tema.

mas se você quiser usar temas diferentes do padrão do site na criação, edição e exibição de páginas, poderá usar o Tema de Conteúdo, que permite usar temas diferentes do padrão do site na criação, edição e exibição de páginas.

onlink
fonte