Jak wyświetlić bloki do wyświetlenia na określonej stronie w Drupal?

10

Rozważ moduł pustynie:

  • Strona 1:- deserts/*
  • Strona 2:- deserts/*/*
  • strona3: - deserts/*/*/*

Dynamiczna treść ...

Mam trzy bloki, a mianowicie a, b i c:

  • Blok a powinien być wyświetlany tylko na stronie 1
  • Blok b powinien być wyświetlany tylko na stronie 2
  • Blok a powinien być wyświetlany tylko na stronie 3

Jak należy to ograniczenie?

Ajmal
źródło
Drupal 6 czy 7? 6 ułatwia zdefiniowanie kodu PHP dla widoczności bloku.
Mołot
To jest drupal7 molot
Ajmal
2
@Ajmal Przydałby się komentarz do podanych odpowiedzi i wyjaśnienie, dlaczego nie pomogły. Ludzie (naturalnie) założą, że głosowana odpowiedź jest prawidłowa, i nie podadzą alternatywy, jeśli nie wyjaśniłeś, dlaczego ta odpowiedź nie działa dla ciebie.
Clive
Mam stronę desert/*/*/ desert/*/editmój blok powinien wyświetlać dla wszystkich desert/*/*nie dla desert/*/edit W takim przypadku to nie działa dla mnie ..
Ajmal
1
Może to tylko ja, ale wydaje się to mylące. *oznacza symbol wieloznaczny. Więc z prośbą o rozwiązanie, w którym pojawia się blok dla desert/*/*Oznacza to, że powinien pojawić się na desert/*/editlub, jeśli o to chodzi, desert/*/whatever.
cdmo

Odpowiedzi:

18

Użyj modułu kontekstowego . Chociaż ogólnie nie jestem fanem tego modułu, jest to jeden z przypadków, w których jest on przydatny.

Dodaj warunek dla ścieżki. Więc jeśli chcę blok na stronie 1, ale nie na stronie 2 lub 3, zapisałbym ścieżki w ten sposób, po jednej dla każdego bloku:

Przypadek 1 - blok A

pustynie / *
~ pustynie / * / *
~ pustynie / * / * / *

Przypadek 2 - blok B

~ pustynie / *
pustynie / * / *
~ pustynie / * / * / *

Przypadek 3 - blok C

~ pustynie / *
~ pustynie / * / *
pustynie / * / * / *

W tym przypadku ~ oznacza wykluczenie. Następnie dodaj blok do regionu, w którym ma się pojawiać. Możesz także dodać z powrotem w określonych ścieżkach, które w innym przypadku mogłyby zostać wykluczone, i na odwrót.

kyletaylored
źródło
Przydaje się w tym przypadku. Ale chcemy to naprawić we wszystkich możliwych scenariuszach, to jest oryginalne rozwiązanie, jest przypadek, w którym nie działa dobrze. Wyjaśniłem tę sprawę powyżej. więc proszę, proszę odnieść się do tego
Ajmal,
Zaktualizowałem swoją odpowiedź, więc mam nadzieję, że lepiej to wyjaśni. Zrobiłbyś jedną regułę dla każdego bloku.
kyletaylored
4

Możesz użyć opcji widoczności „Strony, na których ten kod PHP zwraca PRAWDA (tylko dla ekspertów)”. Ale umieszczanie kodu PHP w bazie danych jest, IMHO, złą praktyką. Zamiast tego zastanów się nad użyciem modułu rozszerzonego widoczności bloku lub implementacji hook_block_list_alter()takiego jak

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

Uwaga: prawdopodobnie istnieje mądrzejszy sposób na wdrożenie reguły widoczności.

Pierre Buyle
źródło
0

Powinieneś być w stanie uruchomić to za pomocą modułu widoczności bloku reguł . Oto cytat ze strony projektu:

Moduł widoczności bloku reguł umożliwia stosowanie komponentów reguł do kontrolowania widoczności bloku. Zapewnia to administratorom i programistom Drupala wyjątkową elastyczność w kontrolowaniu, kiedy bloki powinny być wyświetlane na ich stronach internetowych, oprócz domyślnych opcji widoczności zapewnianych przez Drupal.

Ogólna idea jest taka, że ​​jeśli możesz to zrobić za pomocą Reguł, możesz użyć go do kontrolowania widoczności bloku, więc możliwości są nieograniczone:

  • Chcesz pokazać blok tylko użytkownikom zarejestrowanym ponad miesiąc temu?

  • Być może masz blok, który musi być pokazywany tylko między 8:00 a 17:00 w dni powszednie?

  • Co powiesz na wyświetlanie lub ukrywanie bloku na podstawie aktualnych warunków pogodowych?

Wszystko to można zrobić za pomocą widoczności bloku Reguły.

Dzięki temu i zgodnie z powyższym „ jeśli możesz to zrobić za pomocą Reguł, możesz użyć go do kontrolowania widoczności bloku ”, ograniczyłeś swoje pytanie do tego, aby Reguły przechwytywały różne adresy URL odpowiadające Twojej stronie 1, stronie 2 i stronie 3.

Pierre.Vriens
źródło