我正在构建一个模块,以块的形式管理广告单元,所有这些都需要相互了解并传递信息。
因此,我需要找到一个简单的钩子或其他函数来获取将在页面上使用的每个块的列表,这样我就可以确保知道页面上的整个广告单元列表。
我已经尝试了 hook_block_list_alter() 但这似乎返回了我的 Drupal 安装中存在的整个块列表,没有指定实际将在此页面上呈现或不呈现哪些块。
那么,现在我该怎么办?
我正在构建一个模块,以块的形式管理广告单元,所有这些都需要相互了解并传递信息。
因此,我需要找到一个简单的钩子或其他函数来获取将在页面上使用的每个块的列表,这样我就可以确保知道页面上的整个广告单元列表。
我已经尝试了 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()
这将绕过调用返回按区域分组的块数组。现在我们可以在内容文本不消失的情况下检查内容区域中的块。哈扎尔!
在实施广告服务器 (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 以访问全局变量,构建脚本,并<head>
通过调用 drupal_add_html_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,而是希望使用这些信息来修改块本身的内容。
在那种情况下,代替 THEME_preprocess_html,您可以尝试hook_page_alter(&page) 该钩子的 api 页面声明各个“块可能被区域内的模块/增量对引用:”
// The login block in the first sidebar region.
$page['sidebar_first']['user_login']['#block'];
希望对某人有所帮助!