繁体   English   中英

在Drupal 7中,如何获取页面上使用的所有块的列表?

[英]In Drupal 7, how do I get a list of all blocks being used on the page?

我正在构建一个模块,以块的形式管理广告单元,所有这些都需要彼此了解并传递信息。

因此,我需要找到一个简单的钩子或其他函数来获取将在页面上使用的每个块的列表,因此我可以确定知道页面上的整个广告单元列表。

我已经尝试过hook_block_list_alter()但是这似乎返回了我的Drupal安装中存在的块的整个列表,没有指定实际上将在这个页面上呈现哪些块。

所以,现在我该怎么办?

我认为它与订单hook_block_list_alter() ,但我不完全确定。 无论哪种方式,以下代码将为您提供当前页面上下文中所有块的列表。 一定不要把它放在一个hook_block_list_alter()函数中,否则你会得到一个由无限嵌套引起的异常。

global $theme;
$all_regions = system_region_list($theme);
$blocks = array();
foreach (array_keys($all_regions) as $region) {
  $blocks += block_list($region);
}

如果您只需要特定区域中的块,则可以放弃上面的大部分代码,并且只需:

$blocks = block_list('region_name');

调用block_list('content')时遇到了同样的问题。 看一下这个函数的代码,我发现它调用了另外两个函数, _block_load_blocks()_block_render_blocks() 问题似乎发生在_block_render_blocks()因为显示文本未添加到内容对象中。 这与通过该函数的其他块对象不同。

为了解决这个问题,我没有调用block_list() ,而是直接调用了_block_load_blocks() 这将返回按区域分组的块数组,绕过_block_render_blocks()调用。 现在我们可以检查内容区域中的块而不会使内容文本消失。 Huzzar!

在实施广告服务器(DFP)时,我有类似的要求。 我的解决方案是将数组定义为全局变量,并在每个广告单元块中包含php代码,以向数组添加新元素。

然后,一旦页面上的所有块都被执行,您只需访问全局变量即可查看调用了哪些广告块。 因为构建被调用块列表的代码是每个块的一部分,所以块是在区域,面板还是其他任何地方显示都无关紧要。

在我的例子中,我想使用这些信息将脚本添加到<head>部分,该部分仅引用正在放置的块中的添加单元。 我的完整解决方案如下:

1)实现hook init以创建一个全局变量,用于存储有关正在显示哪些块的信息(您需要创建一个包含此代码的自定义模块):

YOURMODULE_custom_init() {
  $GLOBALS['dfp-ads'] = array();
}

2)启用核心php模块

3)在每个广告块的末尾添加php代码,为在步骤1中创建的数组添加一行

<?php
   $GLOBALS['dfp-ads']['AD_OR_BLOCK_NAME_GOES_HERE']="AD SPECIFIC SCRIPT GOES HERE";
?>

4)在我的template.php文件中实现THEME_preprocess_html以访问全局变量,构建脚本,并通过调用drupal_add_html_head将脚本添加到<head>部分

function YOURTHEME_preprocess_html(&$vars) {
   $inline_script = LOGIC TO ACCESS $GLOBALS['dfp-ads'] AND BUILD SCRIPT GOES HERE;
   $element = array(
      '#type' => 'markup',
      '#markup' => $inline_script,
   );

   drupal_add_html_head($element, 'google-dfp');
}

从您的描述中可以看出,您不需要广告块列表来为head部分构建javascript,而是希望使用这些信息来修改块本身的内容。

在那种情况下insteaad的THEME_preprocess_html,您可以尝试hook_page_alter(&page)该挂钩的api页面指出单个“块可能被区域内的模块/ delta对引用:”

// The login block in the first sidebar region.
$page['sidebar_first']['user_login']['#block'];

希望有人帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM