Drupalの特定のページに表示するブロックを表示する方法は?


10

モジュール砂漠について考えてみましょう:

  • ページ1:- deserts/*
  • ページ2:- deserts/*/*
  • page3:- deserts/*/*/*

ダイナミックなコンテンツ...

私は3つのブロック、すなわちa、b、cを持っています:

  • ブロックaはページ1にのみ表示されます
  • ブロックbはpage2にのみ表示されます
  • ブロックaはpage3にのみ表示されます

その制限はどのようにすべきですか?


Drupal 6または7?6は、ブロックの可視性のためのPHPコードの定義を容易にします。
Mołot

drupal7 molot
Ajmal

2
@Ajmal与えられた回答にコメントして、なぜ役に立たなかったのかを説明できると便利です。その答えがうまくいかない理由を説明しなかった場合、人々は(当然のことながら)投票の多い回答が正しいものであると想定し、代替案を提供することはしません。
クライヴ

私は、ページ持っている desert/*/*/ desert/*/edit私のブロックはすべてのために表示する必要がある desert/*/*ためではない desert/*/edit ような場合には、それは私のために動作していません...
Ajmal

1
多分それは私だけかもしれませんが、これは混乱するようです。 *ワイルドカードを意味します。したがって、ブロックが表示される解決策を求めることは、ブロックが表示されるか、さらにdesert/*/*言えば、が表示されることを意味します。desert/*/editdesert/*/whatever
cdmo

回答:


18

コンテキストモジュールを使用します。私は一般的にこのモジュールのファンではありませんが、これは便利なケースの1つです。

パスの条件を追加します。したがって、ページ1にブロックが必要で、ページ2または3が必要でない場合は、各ブロックに1つずつ、次のようにパスを記述します。

ケース1-ブロックA

砂漠/ *
〜砂漠/ * / *
〜砂漠/ * / * / *

ケース2-ブロックB

〜砂漠/ *
砂漠/ * / *
〜砂漠/ * / * / *

ケース3-ブロックC

〜砂漠/ *
〜砂漠/ * / *
砂漠/ * / * / *

〜は、この場合除外することを意味します。その後、表示したいリージョンにブロックを追加します。また、除外される可能性のある特定のパスを追加することもできます。その逆も可能です。


このケースに適しています。ただし、考えられるすべてのシナリオでこれを修正する必要があります。つまり、元のソリューションです。うまくいかない場合があります。上記のケースについて説明しました。したがって、親切にそれを参照してください
Ajmal

私は私の答えを更新しましたので、うまくいけばこれはそれをよりよく説明するでしょう。ブロックごとに1つのルールを作成します。
kyletaylored 2013

4

「このPHPコードがTRUE(エキスパートのみ)を返すページ」表示オプションを使用できます。しかし、PHPコードをデータベースに配置することは、私見では悪い習慣です。代わりに、拡張ブロックの可視性モジュール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

Rulesブロックの可視性モジュールを使用してこれを機能させることができるはずです。ここにそのプロジェクトページからの引用があります:

ルールブロックの可視性モジュールを使用すると、ルールコンポーネントを使用してブロックの可視性を制御できます。これにより、Drupalの管理者および開発者は、Drupalが提供するデフォルトの可視性オプションに加えて、Webサイトにブロックを表示するタイミングを柔軟に制御できます。

一般的な考え方は、それをルールで実行できる場合、それを使用してブロックの可視性を制御できるため、可能性は無限です。

  • 1か月以上前に登録されたユーザーに対してのみブロックを表示する必要がありますか?

  • おそらく、平日の午前8時から午後5時の間にのみ表示する必要があるブロックがあるでしょうか。

  • 現在の気象条件に基づいてブロックを表示または非表示にするのはどうですか?

これらすべては、Rulesブロックの可視性を使用して実行できます。

これにより、上記の「ルールで実行できる場合は、ブロックの表示を制御するために使用できます」に従って、ページ1、ページ2、およびページ3に対応するさまざまなURL をルールがインターセプトするように質問を減らしました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.