模块是否可以知道何时在仪表板上输出其一个块并更改该块的内容?

drupal.stackexchange https://drupal.stackexchange.com/questions/514

  •  16-10-2019
  •  | 
  •  

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

dashboard_is_visible() 是返回的功能 TRUE 当仪表板可见时, dashboard_rigions() 是返回包含仪表板中包含区域列表的数组的功能。

这些是允许模块知道其块何时在仪表板中渲染的功能。唯一的问题是模块知道其块与哪个区域相关联,因为块对象未传递给 hook_block_view()。 Drupal 7使用新钩子, hook_block_view_alter()hook_block_view_module_delta_alter(), ,其第二个参数是块对象。可以在仪表板上呈现的块呈现的事实,以更改这些钩子之一。

假设 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参数,然后如果它匹配预期的模式,即 /仪表板,则可以更改块的内容。该解决方案仅在您自己编码的情况下才真正起作用。

更新:尽管我不熟悉Drupal 7s仪表板模块,但此方法仍将起作用。我唯一建议的是输出页面变量,看看仪表板模块是否设置了任何内容。

许可以下: CC-BY-SA归因
scroll top