web-dev-qa-db-ja.com

プログラムでブロックを無効化/非表示/設定解除するにはどうすればよいですか?

特定の地域でのみコンテンツが表示されるページがあります。設定されている州以外の別の州からこのページにアクセスした場合、hook_node_view。しかし、このページのコンテンツ領域でブロックが有効になっています。ブロックの内容を無効にする方法はありますか?私は試した hook__block_viewおよびhook__block_view_alterが機能しませんでした。誰かが私を助けてくれますか?

4
Jons

あなたは試すことができます hook_block_list_alter 特定のブロックを非表示にします。

レンダリングする前にブロックを操作します。

このフックを使用すると、ブロックリストのブロックを追加、削除、または変更できます。ブロックリストには、レンダリングされたブロックではなく、ブロック定義が含まれています。モジュールがブロックリストを操作する機会を得た後に、ブロックがレンダリングされます。

5
StijnTilleman

この質問はかなり古いですが、未回答なので、記録のために返答します。

Drupalを標準のインストールプロファイルでインストールすると、一部のブロック(検索、ログイン、ナビゲーションなど)が自動的に有効になります。

したがって、 profiles/standard/standard.install を確認すると、ブロックがdbクエリで有効になっており、テーマに関連していることがわかります。

したがって、ブロックを無効にすることは単なる更新クエリです。

db_update('block')
  ->fields([
    'status' => 0,
  ])
  ->condition('theme', 'your_theme')
  ->condition('module', 'the_module_providing_the_block')
  ->condition('delta', 'the_block_delta')
  ->execute()
;

その後、キャッシュをクリアする必要があるかもしれません。

4
Manu

この場合の忍者ソリューションは hook_page_alter になります。また、 hook_block_view_alter は有効なフックであるため、機能させることができない理由はわかりません。

ブロックがビューからのものである場合、追加の設定やコーディングをせずに、いくつかのトリッキーな引数を設定してブロックを非表示にすることができます。

また、ブロックごとの可視性設定をphpコードとして設定できます。

2
AyeshK