답변:
다른 모듈에 의해 정의 된 블록이 배치되는 영역을 변경하기 위해 다음 인수를 수신하는 hook_block_info_alter ()를 구현할 수 있습니다 .
$blocks
(참조에 의해 전달됨) : 블록 정의를 포함하는 배열, 모듈별로 키 및 델타$theme
: 블록이 정의되는 테마$code_blocks
: hook_block_info()
구현 에서 정의 된 블록 ( 값이 데이터베이스에서 얻은 값으로 대체되기 전)hook_page_build ()의 모든 페이지 영역에 렌더링 가능한 배열을 추가하는 것이 합법적입니다. 바닥 글 영역에 미니 패널을 추가하는 Drupal 7 예제.
<?php
/**
* Implements hook_page_build().
*/
function MODULE_page_build(&$page) {
$block = module_invoke('panels_mini', 'block_view', 'blah');
$blocks['blah'] = array('#markup' => $block['content']);
$region = 'footer';
if (isset($page[$region])) {
$page[$region] = array_merge($page[$region], $blocks);
}
else {
$page[$region] = $blocks;
}
}
이것은 컨텍스트 모듈을 사용하는 것과 동일한 기술입니다.
참고 :이 기능을 사용하기 위해 block.module 활성화가 필요하지 않습니다.
D6에서는 본질적으로
$block = module_invoke("the_module_name", "block", "view", the_block_delta);
drupal_set_content("the_region_name", theme("block", $block));
D7에서는
$block = module_invoke("the_module_name", "block_view", the_block_delta);
drupal_add_region_content("the_region_name", theme("block", $block));
하지만 여전히 D7의 속도에 도달하고 있습니다.
drupal_add_region_content()
는 설치 / 업그레이드 페이지를위한 막 다른 골목입니다.
사용자 정의 블록을 추가하는 경우 hook_block_info를 사용하여 상태 옵션을 1로 설정하고 region 옵션을 블록을 배치 할 영역으로 설정하십시오.
예:
MODULE_block_info() {
$blocks = array();
$blocks['my_block'] = array(
'info' => t('My Block Name'),
'status' => 1,
'region' => 'THE_REGION_I_WANT',
);
return $blocks;
}
이미 존재하는 블록을 변경하려면 대신 hook_block_info_alter ()를 사용하고 동일한 옵션을 업데이트하면 아래와 같습니다.
예:
MODULE_hook_block_info_alter(&$blocks, $theme, $code_blocks) {
$blocks['my_block']['status'] = 1;
$blocks['my_block']['region'] = 'THE_REGION_I_WANT';
}
자세한 내용은 https://api.drupal.org/api/drupal/modules%21block%21block.api.php/function/hook_block_info/7을 참조 하십시오.
이 코드는 @jonhattan을 기반으로하지만 블록 컨테이너 HTML 또는 컨텍스트 링크를 렌더링하지는 않습니다. 또한 한 곳에서 모든 블록과 영역을 지정하는 간단한 방법을 제공했습니다.
<?php
/**
* Implements hook_page_build().
*/
function MODULE_page_build(&$page) {
global $theme;
// A list of blocks you wish to display, keyed by region.
// These are in the format of: 'module_name' => 'delta'.
$blocks_to_render = array(
'header' => array(
'block' => 1,
),
);
// Add the blocks to each region.
foreach ($blocks_to_render as $region => $block_list) {
$block_objects = array();
foreach ($block_list as $module_name => $delta) {
$block = block_load($module_name, $delta);
// Alter some of the defaults to match the current context.
$block->theme = $theme;
$block->region = $region;
$block->weight = 0;
$block_objects[] = $block;
}
$blocks_build = _block_get_renderable_array(_block_render_blocks($block_objects));
if (isset($page[$region])) {
$page[$region] = array_merge($page[$region], $blocks_build);
}
else {
$page[$region] = $blocks_build;
}
}
}
참고 : 그의 코드와 달리 block.module이 설치되어 있어야합니다.
이것은 가장 좋은 형태는 아니지만 다음 과 같이 페이지 배열에 수동으로 내용을 배치 할 수 있습니다.
function mymodule_page_alter(&$page) {
$my_content = _mymodule_render_mycontent();
$page['my_region']['my_special_insert']['content']['#markup'] = $my_content;
}
컨텍스트 또는 핵심 블록 을 사용해야합니다 . 새로운 플러그인을 만드는 것은 생각만큼 나쁘지 않습니다. 파일 이름을 올바르게 지정하고 트리거와 테스트를 설정하십시오. 예 .
다음과 같이 테마에서 블록을 조정할 수도 있습니다.
/**
* Implements hook_preprocess_page().
*/
function your_theme_preprocess_page(&$variables) {
if (drupal_is_front_page()) {
$variables['page']['region_one'] = $variables['page']['region_two'];
unset($variables['page']['region_two']);
}
}
block_example_block_info()
과 '지역'값이 테스트에 유용 할 수 있습니다.