所以..在Drupal的肠子周围挖后 - 和多发拉..我想出了一个几乎体面的解决办法。
基本上,使用此功能,我可以提取块的翻译版本:
function render_i18n_block($block_id, $region = "hidden"){
if ($list = block_list($region)) {
foreach ($list as $key => $block) {
// $key == <i>module</i>_<i>delta</i>
$key_str = "block_".$block_id;
if ($key_str == $key){
return theme('block', $block);
}
}
}
}
然后,在我的节点,我简单的调用:
<?php echo render_i18n_block(<block_id>,<region>); ?>
可能存在一些问题,其中你的块可能不会显示在一个区域中(因此你不能将一个区域传递给block_list)。对于这种情况,我只是创建了一个名为“隐藏”的区域,该区域不会在我的模板中的任何位置渲染,但可用于调用block_list。
最后(这是我仍然需要找到一个很好的解决方案的一部分),我发现block_list()中:包括/块/ block.inc有一点问题的。
看来$ theme_key不能可靠地设置,除非block_list()被从theme()函数(在includes/themes.inc中)调用..这会导致SQL返回一个空的结果集。 SQL看起来像这样:
$result = db_query(db_rewrite_sql("SELECT DISTINCT b.* FROM {blocks} b LEFT JOIN {blocks_roles} r ON b.module = r.module AND b.delta = r.delta WHERE b.theme = '%s' AND b.status = 1 AND (r.rid IN (". db_placeholders($rids) .") OR r.rid IS NULL) ORDER BY b.region, b.weight, b.module", 'b', 'bid'), array_merge(array($theme_key), $rids));
正如你所看到的,如果theme_key没有设置,那么它将只返回一个空的结果。 现在我只需添加这绕过:
if (!isset($theme_key)){$theme_key="<my_theme_name>";}
模块/块/ block.inc :: block_list()围绕线429
..我还需要制定出一个更好的方式来做到这一点。
- 10与建议任何人对我怎么能确保$ theme_key呼吁block_list :)
另外:没有人知道,如果语言可以传递给module_invote。例如为:$块= module_invoke( '块', '块', '观看',22个,成 'en') – toast38coza 2010-11-02 22:44:37