it-swarm-es.com

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

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

Quiero que se muestre un tema diferente cada vez que se vea una página en esta sección (por ejemplo, http://example.org/event2011/about , http://example.org/event2011/node/12 ). ¿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 yo mismo a nivel de código .

38
Samyak Bhuta

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 hook_custom_theme() de la 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/12 , 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á muy relacionada con un tema en particular, ya que solo pueden ser anuladas por módulos que se dirigen específicamente a esas páginas en hook_menu_alter(). Los módulos que implementan una funcionalidad de cambio de tema más genérica (por ejemplo, un módulo que permite que el tema se establezca dinámicamente en función del rol del usuario actual) deben usar hook_custom_theme() en su lugar.

33
kiamlaluno

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.

22
tim.plunkett

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

Además, también hay un ejemplo del uso de la hook_custom_theme() más tradicional

<?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

8
electblake

Usar ThemeKey es simple y es el módulo más popular y potente hasta ahora (con soporte para 8.x) para cambiar de tema reglas que permiten la selección automática de un tema según la ruta actual, los términos de la taxonomía, el idioma, el tipo de nodo y muchas, 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 interesaría path:node_alias, así que 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)

Echa un vistazo a video tutorial de Mustardseed (7.x).

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

Consulte también otras preguntas SE relacionadas con themekey .


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

6
kenorb

Simplemente puede usar Contexto 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;)

6
Amitav Roy

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

Hay situaciones en las que es posible que no desee utilizar arg () . De hecho, la documentación de la API Drupal) realmente 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, usando arg(0) devolverá node como primer Componente URL, a diferencia del alias.

print_r(arg(0));

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

En cambio, si necesita trabajar con un alias, hay varias formas 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';
  }
}
5
rjb

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 tu módulo

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

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

3
drupalfever

Puede usar el módulo Tema de la 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. (Establezca una página como una ruta Drupal)
  • Permitir utilizar el carácter '*' como comodín en las rutas 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.
1
IT Pro Manager

Puede usar 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. (Establezca una página como Drupal ruta) Permitir usar el carácter '*' como comodín en Drupal rutas. Permitir organizar temas. (Si las páginas son varios definidos, se utilizará el primer tema de la lista) Permitir habilitar/deshabilitar un tema. Drupal novato 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 Tema de contenido que le permite usar diferentes temas que los predeterminados del sitio en la creación, edición y contenido de contenido viendo páginas.

0
onlink