Как отобразить блоки для отображения на определенной странице в Drupal?

10

Рассмотрим модуль пустынь:

  • Страница 1:- deserts/*
  • страница 2:- deserts/*/*
  • page3: - deserts/*/*/*

Динамический контент ...

У меня есть три блока, а именно а, б и в:

  • Блок А должен отображаться только на странице 1
  • Блок b должен отображаться только на странице 2
  • Блок А должен отображаться только на странице 3

Как сделать это ограничение?

Ajmal
источник
Друпал 6 или 7? 6 облегчает определение кода PHP для видимости блока.
Молот
Это drupal7 molot
Аджмал
2
@Ajmal Было бы полезно, если бы вы могли прокомментировать приведенные ответы и объяснить, почему они не помогли. Люди (естественно) будут считать, что ответ с высоким рейтингом является правильным, и не будут предлагать альтернативу, если вы не объяснили, почему этот ответ не работает для вас.
Клайв
У меня есть страница, которую desert/*/*/ desert/*/editмой блок должен отображать для всех desert/*/*не для desert/*/edit В таком случае это не работает для меня ..
Ajmal
1
Может быть, это только я, но это кажется странным. *означает подстановочный знак. Поэтому просим решения , где появляется блок для desert/*/*предполагает , что он должен показать на desert/*/editили, по этому вопросу, desert/*/whatever.
cdmo

Ответы:

18

Используйте контекстный модуль. Хотя я вообще не фанат этого модуля, это один из случаев, когда он пригодится.

Добавьте условие для пути. Поэтому, если я хочу блок на странице 1, но не на странице 2 или 3, я бы написал пути примерно так, по одному для каждого блока:

Случай 1 - Блок А

пустыни/*
~ Пустыни / * / *
~ Пустыни / * / * / *

Случай 2 - Блок Б

~ Пустыни / *
пустыни/*/*
~ Пустыни / * / * / *

Дело 3 - Блок С

~ Пустыни / *
~ Пустыни / * / *
пустыни/*/*/*

~ Означает исключить в этом случае. После этого добавьте блок в регион, который вы хотели бы видеть. Вы также можете добавить обратно в конкретные пути, которые в противном случае могли бы быть исключены, и наоборот.

kyletaylored
источник
Это хорошо для этого случая. Но мы хотим исправить это для всех возможных сценариев, то есть это оригинальное решение, есть случай, когда оно не работает. Я объяснил этот случай выше. поэтому, пожалуйста, ссылайтесь на это
Ajmal
Я обновил свой ответ, так что, надеюсь, это объяснит это лучше. Вы бы сделали одно правило для каждого блока.
kyletaylored
4

Вы можете использовать опцию видимости «Страницы, на которых этот PHP-код возвращает TRUE (только для экспертов)». Но помещать PHP-код в базу данных, IMHO, плохая практика. Вместо этого рассмотрите возможность использования чего-то вроде модуля расширенной видимости блока или реализации hook_block_list_alter()такого

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;
    }
  }
}

Примечание. Вероятно, существует более разумный способ реализации правила видимости.

Пьер Буйль
источник
0

Вы должны быть в состоянии заставить это работать, используя модуль видимости блока Правил . Вот цитата со страницы проекта:

Модуль видимости блока правил позволяет использовать компоненты правил для контроля видимости блока. Это обеспечивает администраторам и разработчикам Drupal исключительную гибкость в управлении тем, когда блоки должны отображаться на их сайтах, в дополнение к параметрам видимости по умолчанию, предоставляемым Drupal.

Общая идея заключается в том, что если вы можете сделать это с помощью правил, вы можете использовать его для управления видимостью блока, поэтому возможности безграничны:

  • Нужно показывать блок только пользователям, зарегистрированным более месяца назад?

  • Возможно, у вас есть блок, который должен показываться только с 8 утра до 5 вечера по будням?

  • Как насчет отображения или скрытия блока в зависимости от текущих погодных условий?

Все это можно сделать с помощью блока правил видимости.

Благодаря этому, а также согласно « если вы можете сделать это с помощью Правил, вы можете использовать его для управления видимостью блоков » выше, вы сократили свой вопрос до того, чтобы Правила перехватывали различные URL-адреса, соответствующие вашим page1, page2 и page3.

Pierre.Vriens
источник