Como exibir os blocos a serem exibidos em determinada página no Drupal?

10

Considere um módulo desertos:

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

Um conteúdo dinâmico ...

Eu tenho três blocos, a saber, a, bec:

  • O bloco a deve ser exibido apenas na página1
  • O bloco b deve ser exibido apenas na página2
  • O bloco a deve ser exibido apenas na página3

Como deve fazer essa restrição?

Ajmal
fonte
Drupal 6 ou 7? 6 facilita a definição do código PHP para a visibilidade do bloco.
Mołot 30/08
É de drupal7 Molot
Ajmal
2
@Ajmal Seria útil se você pudesse comentar as respostas dadas e explicar por que elas não ajudaram. As pessoas assumem (naturalmente) que a resposta mais votada é a correta e não fornecem uma alternativa, se você não explicou por que essa resposta não funciona para você.
Clive
Eu tenho a página de desert/*/*/ desert/*/editmeu bloco deve exibir para todo o desert/*/*não para desert/*/edit Nesse caso ele não funciona para mim ..
Ajmal
1
Talvez seja só eu, mas isso parece confuso. *significa curinga. Então, pedindo uma solução onde o bloco aparece para desert/*/*implica que ele deve mostrar-se para desert/*/editou, para essa matéria, desert/*/whatever.
Cdmo # 6/13

Respostas:

18

Use o módulo de contexto . Embora eu geralmente não seja fã deste módulo, este é um dos casos em que é útil.

Adicione uma condição para um caminho. Portanto, se eu quiser um bloco na página 1, mas não na página 2 ou 3, eu escreveria os caminhos assim, um para cada bloco:

Caso 1 - Bloco A

desertos / *
~ desertos / * / *
~ desertos / * / * / *

Caso 2 - Bloco B

~ desertos / *
desertos / * / *
~ desertos / * / * / *

Caso 3- Bloco C

~ desertos / *
~ desertos / * / *
desertos / * / * / *

O ~ significa excluir neste caso. Depois disso, adicione o bloco à região que você deseja que apareça. Você também pode adicionar novamente em caminhos específicos que, de outra forma, poderiam ser excluídos e vice-versa.

kyletaylored
fonte
Isso vale para este caso. Mas queremos corrigir isso para todos os cenários possíveis, que é a solução original, há um caso em que não é válido. Eu expliquei esse caso acima. portanto, consulte gentilmente que
Ajmal
Eu atualizei minha resposta, por isso espero que isso explique melhor. Você faria uma regra para cada bloco.
usar o seguinte código
4

Você pode usar a opção de visibilidade "Páginas nas quais esse código PHP retorna VERDADEIRO (somente especialista)". Mas colocar código PHP no banco de dados é, IMHO, uma má prática. Em vez disso, considere usar algo como o bloco de visibilidade estendida módulo ou implementação de hook_block_list_alter()tais 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: Provavelmente existe uma maneira mais inteligente de implementar sua regra de visibilidade.

Pierre Buyle
fonte
0

Você deve conseguir que isso funcione usando o módulo de visibilidade do bloco Rules . Aqui está uma citação de sua página do projeto:

O módulo de visibilidade do bloco Rules permite que os componentes Rules sejam usados ​​para controlar a visibilidade do bloco. Isso fornece aos administradores e desenvolvedores do Drupal extrema flexibilidade no controle de quando os blocos devem ser exibidos em seus sites, além das opções de visibilidade padrão fornecidas pelo Drupal.

A ideia geral é que, se você puder fazer isso com as Regras, poderá usá-lo para controlar a visibilidade do bloco, para que as possibilidades sejam ilimitadas:

  • Precisa mostrar um bloco apenas para usuários registrados há mais de um mês?

  • Talvez você tenha um bloco que deve ser exibido apenas entre 8h e 17h nos dias úteis.

  • Que tal exibir ou ocultar um bloco com base nas condições climáticas atuais?

Tudo isso pode ser feito usando a visibilidade do bloco Regras.

Com isso, e de acordo com o " se você pode fazer isso com as Regras, você pode usá-lo para controlar a visibilidade do bloco " acima, você reduziu sua pergunta para fazer com que as Regras interceptem os vários URLs correspondentes à sua página1, página2 e página3.

Pierre.Vriens
fonte