¿Cómo mostrar los bloques para mostrar en cierta página en Drupal?

10

Considere un módulo desiertos:

  • Página 1:- deserts/*
  • página 2:- deserts/*/*
  • página 3:- deserts/*/*/*

Un contenido dinámico ...

Tengo tres bloques, a saber, a, byc:

  • El bloque a debe mostrarse solo en la página1
  • El bloque b debe mostrarse solo en la página2
  • El bloque a debería mostrarse solo en la página3

¿Cómo debería hacer esa restricción?

Ajmal
fuente
Drupal 6 o 7? 6 facilita la definición del código PHP para la visibilidad del bloque.
Mołot
Es drupal7 molot
Ajmal
2
@Ajmal Sería útil si pudieras comentar las respuestas dadas y explicar por qué no han ayudado. La gente asumirá (naturalmente) que la respuesta con más votos es la correcta, y no continuará brindando una alternativa, si no ha explicado por qué esa respuesta no funciona para usted.
Clive
Tengo la página que desert/*/*/ desert/*/editmi bloque debería mostrar para todos los que desert/*/*no lo son. desert/*/edit En tal caso, no funciona para mí ..
Ajmal
1
Tal vez solo soy yo, pero esto parece confuso. *significa comodín. Por lo que pide una solución en la que aparece el bloque para desert/*/*implica que debe presentarse para desert/*/edito, para el caso, desert/*/whatever.
cdmo

Respuestas:

18

Usa el módulo de contexto . Aunque generalmente no soy fanático de este módulo, este es uno de los casos en los que resulta útil.

Agregar una condición para una ruta. Entonces, si quiero un bloque en la página 1, pero no en la página 2 o 3, escribiría las rutas así, una para cada bloque:

Caso 1 - Bloque A

desiertos / *
~ desiertos / * / *
~ desiertos / * / * / *

Caso 2 - Bloque B

~ desiertos / *
desiertos / * / *
~ desiertos / * / * / *

Caso 3- Bloque C

~ desiertos / *
~ desiertos / * / *
desiertos / * / * / *

El ~ significa excluir en este caso. Después de eso, agregue el bloque a la región que desea que se muestre. También puede agregar de nuevo en rutas específicas que de otro modo podrían excluirse, y viceversa.

kyletaylored
fuente
Es válido para este caso. Pero queremos arreglar esto para todos los escenarios posibles, esa es la solución original, hay un caso en el que no funciona bien. He explicado ese caso arriba. así que por favor amablemente
refiérelo
Actualicé mi respuesta, así que espero que esto lo explique mejor. Harías una regla para cada bloque.
kyletaylored
4

Puede usar la opción de visibilidad "Páginas en las que este código PHP devuelve VERDADERO (solo experto)". Pero poner código PHP en la base de datos es, en mi humilde opinión, una mala práctica. En su lugar, considerar el uso de algo así como la visibilidad de bloque extendido módulo o aplicación de hook_block_list_alter()tales como

function MODULE_block_list_alter(&$blocks) {
  global $theme_key;
  foreach ($blocks as $key => $block) {
    if (!isset($block->theme) || !isset($block->status) || $block->theme != $theme_key || $block->status != 1) {
      // This block was added by a contrib module, leave it in the list.
      continue;
    }
    switch ("{$block->module}_{$block->delta}") {
      case "moduleA_deltaA":
        if (arg(0) != 'deserts' || !arg(1) || arg(2)) {
          unset($blocks[$key]);
        }
        break;
      case "moduleB_deltaB":
        if (arg(0) != 'deserts' || !arg(1) || !arg(2) || arg(3)) {
          unset($blocks[$key]);
        }
        break;
      case "moduleC_deltaC":
        if (arg(0) != 'deserts' || !arg(1) || !arg(2) || !arg(3)) {
          unset($blocks[$key]);
        }
        break;
    }
  }
}

Nota: Probablemente haya una forma más inteligente de implementar su regla de visibilidad.

Pierre Buyle
fuente
0

Debería poder hacer que esto funcione utilizando el módulo de visibilidad del bloque Reglas . Aquí hay una cita de su página de proyecto:

El módulo de visibilidad del bloque de Reglas permite que los componentes de Reglas se usen para controlar la visibilidad del bloque. Esto proporciona a los administradores y desarrolladores de Drupal una flexibilidad extrema para controlar cuándo deben mostrarse los bloques en sus sitios web, además de las opciones de visibilidad predeterminadas proporcionadas por Drupal.

La idea general es que si puede hacerlo con Reglas, puede usarlo para controlar la visibilidad del bloque, por lo que las posibilidades son ilimitadas:

  • ¿Necesita mostrar un bloqueo solo para usuarios registrados hace más de un mes?

  • ¿Quizás tiene un bloqueo que debe mostrarse solo entre las 8 am y las 5 pm los días de semana?

  • ¿Qué pasa con mostrar u ocultar un bloque en función de las condiciones climáticas actuales?

Todo esto se puede hacer mediante el uso de la visibilidad del bloque de reglas.

Con eso, y según el " si puede hacerlo con las Reglas, puede usarlo para controlar la visibilidad del bloque " anterior, ha reducido su pregunta a hacer que las Reglas intercepten las diversas URL correspondientes a su página1, página2 y página3.

Pierre.Vriens
fuente