web-dev-qa-db-ja.com

ワイルドカードを使用してサブページを除外して、リストされたページのみにブロックを表示するにはどうすればよいですか?

ブロック設定の「リストされたページのみ」を使用して表示しているブロックがあります。ワイルドカードアスタリスクを使用して、about-us/に続くページにブロックを表示しています。例:about-us/*

問題は、about-us/の直後のページのみを表示することです。たとえば、about-us/faqはブロックを表示しますが、about-us/faq/contentはブロックを表示しません。

about-us/*/を試しましたが、効果がありませんでした。

助言がありますか?

6
Sam

方法1. PHP filter

あなたの質問はここで部分的に答えられていると思います:

drupalのブロックにページ制限を追加する方法

あなただけがこのコードを使うかもしれません:

<?php
$arg = explode('/', drupal_get_path_alias());
if ($arg[0] == 'about-us' && $arg[1] && $arg[2] == NULL) {
  return TRUE;
}
else {
  return FALSE;
}
?>

方法2:コンテキストモジュール

または、より堅牢な可視性オプションを提供する Context モジュールを試すこともできます。たとえば、パスを含めるだけでなく、パスの前にチルダ「〜」を付けてexcludeできます。

私はこれでうまくいくと思います:

about-us/*
~about-us/*/*

編集:2番目のメソッドを追加しました。

編集:arg()の代わりにメソッド1で$ _GET ['q']を使用(Thx、@leymannx!)

6
othermachines

Drupal 8-これを実現する単純なモジュール: https://www.drupal.org/project/block_exclude_pages

除外するパスを「!」で追加するだけです接頭辞付き。

例:

!/ path/this

2
Jaime C.

ブロック表示設定をabout-us/*に表示するように設定し、次のフックをモジュールに追加します。

<?php
/**
 * Implements hook_block_list_alter().
 */
function my_module_block_list_alter(&$blocks) {
  $alias = explode('/', drupal_get_path_alias());
  if ($alias[0] == 'about-us' && isset($alias[1]) && isset($alias[2])) {
    // unset the bid (block id)
    unset($blocks[55]);
  }
}
?>

編集:固定条件-arg()はエイリアスを返しません。

1
superdrupal

PHP filter module in Block settings> Pagesを使用:チェック

このPHPコードがTRUEを返すページ(エキスパートのみ))

これを貼り付けます:

<?php
return preg_match('/^about-us(\/[a-z]*)?(\/)?$/',
drupal_get_path_alias($_GET['q']));
?>
1
ar7max

Drupal 8では、 Block Visibility Groups モジュールを使用して、1つまたは多くのブロックの複数の条件を非常に簡単に組み合わせることができます。この場合、ページを追加できます[path]/*条件と負の[path]/*/* 状態。

1
HaleFx

この質問に答える別の方法があります... PHPフィルターを有効にする必要がない (可能な限り回避するようにしてください)... Rules block visibility モジュールを使用するだけです。プロジェクトページの引用は次のとおりです。

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

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

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

たぶん、平日の午前8時から午後5時までしか表示されないブロックがあるでしょうか。

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

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

これで、上記の「ルールで実行できる場合は、それを使用してブロックの可視性を制御できます」のように、質問を減らして ルール "現在のページのパスを確認"(ブロックが次のパスを持つページにのみ表示されるように- で始まる "_about-us/_"。ただし、 "_about-us/*/*_"のようなパスを持つページでは使用できません。

このモジュールの使用方法の説明については、「 sers/1などのビューブロックが管理者に表示されないようにする方法 」に対する私の回答を参照してください。これには、ルールコンポーネント(ルールエクスポート形式)が含まれています。これをこのバリエーションで置き換えて、特定の質問に一致させる必要があります)。

_{ "rules_block_visibility_show_on_selected_profile_pages" : {
    "LABEL" : "Show block on selected profile pages",
    "PLUGIN" : "rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "rules" ],
    "USES VARIABLES" : {
      "module" : { "label" : "Module", "type" : "text" },
      "delta" : { "label" : "Delta", "type" : "text" },
      "result" : { "label" : "Result", "type" : "boolean", "parameter" : false }
    },
    "IF" : [
      { "AND" : [
          { "text_matches" : {
              "text" : [ "site:current-page:path" ],
              "match" : "about-us\/",
              "operation" : "starts"
            }
          },
          { "NOT text_matches" : {
              "text" : [ "site:current-page:path" ],
              "match" : "about-us(\/[a-z]*)?(\/)?$/",
              "operation" : "regex"
            }
          }
        ]
      }
    ],
    "DO" : [ { "data_set" : { "data" : [ "result" ], "value" : "1" } } ],
    "PROVIDES VARIABLES" : [ "result" ]
  }
}
_

:上記のルールコンポーネントの2番目のルール条件(正規表現を含む)は、ケースに完全に適合するためにさらに調整が必要になる場合があります。つまり「about-us(\/[a-z]*)?(\/)?$/」の部分(ただし、質問の内容にかなり近いと思います)。

0
Pierre.Vriens