Итак ... После того, как покопался в недрах Друпала - и много потянул за волосы ... Я нашел почти приличное решение.
По сути, с помощью этой функции я могу извлечь переведенную версию блока:
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 () в: includes / blocks / block.inc имеет некоторую проблему.
Похоже, что $ theme_key не установлен надежно, если не вызывается block_list () из функции theme () (в include / 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>";}
в modules / blocks / block.inc :: block_list () в строке 429. Мне все еще нужно найти лучший способ сделать это.
- 10 для всех, у кого есть предложения о том, как можно установить $ theme_key перед вызовом block_list:)