モジュールは、そのブロックの 1 つがいつダッシュボードに出力されるかを認識し、そのブロックの内容を変更することは可能ですか?
質問
Drupal 7 には、適切な権限を持つユーザーがサードパーティのサイトから定義されたブロックをダッシュボードに追加できる新しいコア モジュール (dashboard.module) があり、現在のページにオーバーレイとして表示されます。
ブロックを実装するモジュールは、ブロックがいつダッシュボードにレンダリングされているかを知ることはできますか?
アイデアとしては、ブロックの内容を変更して、(たとえば) ブロックを小さくすることです。
解決 2
Dashboard.module のコードを見ると、次の関数が見つかりました。
/**
* Implements hook_block_list_alter().
*
* Skip rendering dashboard blocks when not on the dashboard page itself. This
* prevents expensive dashboard blocks from causing performance issues on pages
* where they will never be displayed.
*/
function dashboard_block_list_alter(&$blocks) {
if (!dashboard_is_visible()) {
foreach ($blocks as $key => $block) {
if (in_array($block->region, dashboard_regions())) {
unset($blocks[$key]);
}
}
}
}
ダッシュボード_is_visible() を返す関数です TRUE
ダッシュボードが表示されている場合、および ダッシュボード領域() は、ダッシュボードに含まれる領域のリストを含む配列を返す関数です。
これらは、モジュールがそのブロックがいつダッシュボードにレンダリングされているかを知ることを可能にする関数です。唯一の問題は、ブロック オブジェクトがモジュールに渡されないため、モジュールがそのブロックがどの領域に関連付けられているかを知ることです。 フック_ブロック_ビュー()。Drupal 7 は新しいフックを使用します。 フック_ブロック_ビュー_オルター() そして フック_ブロック_ビュー_MODULE_DELTA_alter(), 、その 2 番目のパラメータはブロック オブジェクトです。これらのフックの 1 つを実装すると、ブロックがダッシュボードでレンダリングされているかどうかに基づいてブロックを変更できます。
仮に mymodule
はモジュールの短縮名であり、 test_block
がデルタ値である場合、モジュールは次の関数を使用する必要があります。
/**
* Implements hook_block_view_MODULE_DELTA_alter().
*/
function mymodule_block_view_mymodule_test_block_alter(&$data, $block) {
if (dashboard_is_visible() && in_array($block->region, dashboard_regions())) {
// The block is rendered in the dashboard.
}
}
他のヒント
ブロックが表示されている URL 引数をチェックして、それが予期されるパターンと一致するかどうかを確認できます。/dashboard を使用すると、ブロックの内容を変更できます。この解決策は、ブロックを自分でコーディングした場合にのみ実際に機能します。
アップデート:この方法は引き続き機能しますが、私は drupal 7s ダッシュボード モジュールについて詳しくコメントできるほど詳しくありません。私が提案する唯一のことは、ページ変数を出力し、ダッシュボードモジュールによって設定されているかどうかを確認することです。