¿Cómo cambio un tema basado en la URL?

38

Tengo una instancia de Drupal ejecutándose en example.org. Que tiene un tema X instalado y activado. Ahora, por un período limitado, se supone que un evento se llevará a cabo en el sitio para el cual se ha "dividido" una sección especial. Todas las cosas relacionadas con ese evento irán a example.org/event2011.

Quiero tener un tema diferente que se muestra cada vez que se visita una página bajo esta sección (por ejemplo http://example.org/event2011/about , http://example.org/event2011/node/123 ). ¿Cómo puedo hacer eso?

He pasado por muchos módulos, pero ninguno de ellos es compatible con Drupal 7. Preferiblemente, me gustaría que se haga usando módulos y no quiero cambiar nada a nivel de código.

Samyak Bhuta
fuente
1
¿Está buscando tener un sitio completamente separado debajo de la ruta / event2011 / node / 123 como se ve?
Jeremy French

Respuestas:

33

Teniendo en cuenta que el cambio es por un período de tiempo limitado y que implementar dicho código no es difícil, sugeriría implementar un módulo personalizado que cambie el tema que se utiliza para páginas específicas.

Es suficiente implementar de la hook_custom_theme()siguiente manera:

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

Si necesita cambiar el tema solo para http://example.com/event2011 , pero no para http://example.com/event2011/node/123 , entonces el código debe cambiarse a

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

En cuanto a usar las devoluciones de llamada de tema en la definición de una devolución de llamada de menú, la documentación dice:

Como regla general, el uso de funciones de devolución de llamada de tema debe limitarse a páginas cuya funcionalidad está estrechamente vinculada a un tema en particular, ya que solo pueden anularse mediante módulos que se dirigen específicamente a esas páginas hook_menu_alter(). En su hook_custom_theme()lugar, deberían usarse módulos que implementen una funcionalidad de cambio de tema más genérica (por ejemplo, un módulo que permita que el tema se configure dinámicamente en función del rol del usuario actual) .

kiamlaluno
fuente
Sugeriría la función current_path () api.drupal.org/api/drupal/includes%21path.inc/function/… . Tendrá una condición "para" más fácil
augusto
22

Una solución personalizada como sugiere el otro comentario es probablemente la mejor, pero si realmente desea utilizar un módulo, su mejor opción es ThemeKey . A partir del 23/05/11, tiene una versión estable.

tim.plunkett
fuente
8

Alternativamente, puede utilizar la nueva theme callbackopción del sistema de menús hook_menu_alter()como se describe a continuación. ps Checkout hook_menu () para más detalles sobre eltheme 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();
}
?>

Además, también hay un ejemplo del uso de los más tradicionales. 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';
  }
}
?>

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

electblake
fuente
6

Simplemente puede usar Context y usar el tema para aplicarlo cuando la ruta es / event2011 / simplemente puede configurar la ruta en condición de texto y cambiar el tema en la acción del contenido. Esto fue muy fácil de cambiar entre temas en un sitio basado en URL. Incluso funciona para móviles;)

Amitav Roy
fuente
tema de la acción pasa variables personalizadas con el tema, en realidad no lo cambia
Alex Weber
6

Usar ThemeKey es simple y es el módulo más popular y potente hasta ahora (con soporte para 8.x) para reglas de cambio de tema que permiten la selección automática de un tema dependiendo de la ruta actual, términos de taxonomía, idioma, tipo de nodo y muchos, Muchas otras propiedades. También se puede ampliar fácilmente para admitir propiedades adicionales expuestas por otros módulos. Además de las características estándar, ThemeKey extiende automáticamente sus características de muchos módulos contrib y tiene módulos que lo extienden.

Uso (7.x)

Después de habilitar el módulo, vaya a admin/config/user-interface/themekey. Hay muchas opciones para cambiar el tema, pero probablemente le interese path:node_alias, por lo tanto, configure el valor que desee como dice / my_url y luego seleccione el tema que desea habilitar en esta url. También puede usar comodines como web/*o /^web/.*.

Comprobar: Cómo cargar un tema para la ruta

Uso avanzado

ThemeKey 7.x contiene un módulo opcional llamado ThemeKey Example para demostrar a los desarrolladores cómo extender ThemeKey.

Ayuda (7.x)

Mira el video tutorial de Mustardseed (7.x).

Puede encontrar más ayuda sobre ese tema en /admin/help/themekey.

Consulte también otras preguntas de SE relacionadas con .


Alternativamente, también hay Switchtheme (7.x) que agrega un bloque para permitir a los usuarios cambiar entre los temas habilitados.

kenorb
fuente
5

Cuando use alias de URL o el módulo Pathauto , tenga en cuenta las sutilezas y diferencias al usar componentes de la ruta actual de Drupal.

Hay situaciones en las que es posible que no desee utilizar arg () . De hecho, la documentación de la API de Drupal en realidad sugiere evitar el uso de esta función cuando sea posible, ya que el código resultante es difícil de leer.

Considere el siguiente ejemplo, según lo propuesto por kiamlaluno :

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

En Drupal 7, si un nodo tiene un alias de event2011 , el uso arg(0)devolverá nodecomo el primer componente de URL, a diferencia del alias.

print_r(arg(0));

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

En cambio, si es necesario trabajar con un alias que hay varias maneras de obtener la URL actual en Drupal , incluyendo menu_get_object(), current_path(), request_path()y otros.

Aquí hay un ejemplo modificado que usa un alias como desencadenante para cambiar el tema:

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

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

Cómo cambiar el tema según el rol del usuario:

Cree un módulo personalizado y copie y pegue lo siguiente:

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

Tienes que reemplazar:

mymodule => con el nombre de su módulo

my special role => con el nombre de la función que sus usuarios deberán tener para que puedan ver un tema diferente.

mytheme => con el nombre del tema al que desea cambiar

fiebre del drupal
fuente
1

Puede usar el módulo de Tema de página para lograr exactamente eso

El módulo de tema de página es un módulo simple y fácil de usar que permite usar temas diferentes a los predeterminados del sitio en páginas específicas.

Caracteristicas

  • Asigne un tema a una sola página o lista de páginas. (Establecer una página como ruta de Drupal)
  • Permitir utilizar el carácter '*' como comodín en las rutas de Drupal.
  • Permitir organizar los temas. (Si hay varias páginas definidas, se utilizará el primer tema de la lista)
  • Permitir habilitar / deshabilitar un tema.
  • Novato Drupal amigable.
IT Pro Manager
fuente
0

Podrías usar el módulo de tema de página para lograr exactamente eso: El módulo de Tema de página es un módulo simple y fácil de usar que permite usar diferentes temas que los predeterminados del sitio en páginas específicas.

Caracteristicas :

Asigne un tema a una sola página o lista de páginas. (Establecer una página como ruta de Drupal) Permitir utilizar el carácter '*' como comodín en las rutas de Drupal. Permitir organizar los temas. (Si hay varias páginas definidas, se utilizará el primer tema de la lista) Permitir habilitar / deshabilitar un tema. Novato Drupal amigable.

como podrá usar: Secciones que tienen la mayoría de las mismas características que el Tema de página, pero agrega una selección basada en roles y un área de "fragmento de php" para elegir el tema.

pero si desea usar temas diferentes a los predeterminados del sitio en la creación, edición y visualización de contenido, puede usar el Tema de contenido que le permite usar diferentes temas que los predeterminados del sitio en la creación, edición y visualización de contenido.

onlink
fuente