프로그래밍 방식으로 블록을 배치 하시겠습니까?


14

Drupal 7을 사용하고 있습니다. 현재 웹 사이트 헤더에 기본 메뉴 탐색 및 언어 전환기가 있습니다. CMS> Structure> Blocks로 이동하여 블록을 헤더 영역으로 드래그하여 배치했습니다.

이 블록을 프로그래밍 방식으로 헤더에 배치하는 방법은 무엇입니까?


헤더에 이러한 블록을 프로그래밍 방식으로 배치하는 방법에 대한 귀하의 질문에 따르면, 예제 모듈 http://drupal.org/project/examples를 검토 하고 특히 블록 방식을 검토하여 프로그래밍 방식으로 블록 작동을 테스트 할 수 있습니다 . 나는 추측 block_example_block_info()과 '지역'값이 테스트에 유용 할 수 있습니다.
cigotete

존, 이것에 대한 답을 생각해 보셨습니까?
relipse

답변:


4

다른 모듈에 의해 정의 된 블록이 배치되는 영역을 변경하기 위해 다음 인수를 수신하는 hook_block_info_alter ()를 구현할 수 있습니다 .

  • $blocks (참조에 의해 전달됨) : 블록 정의를 포함하는 배열, 모듈별로 키 및 델타
  • $theme: 블록이 정의되는 테마
  • $code_blocks: hook_block_info()구현 에서 정의 된 블록 ( 값이 데이터베이스에서 얻은 값으로 대체되기 전)

3

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 활성화가 필요하지 않습니다.


2

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의 속도에 도달하고 있습니다.


모듈이 표시된 코드로 호출되지 않는 hook_block_view_alter 를 구현할 수 있으므로 타사 모듈이 출력중인 블록을 변경하는 것을 허용하지 않습니다 .
kiamlaluno

Believe drupal_add_region_content()는 설치 / 업그레이드 페이지를위한 막 다른 골목입니다.
doublejosh

2

사용자 정의 블록을 추가하는 경우 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을 참조 하십시오.


0

이 코드는 @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이 설치되어 있어야합니다.


-1

이것은 가장 좋은 형태는 아니지만 다음 과 같이 페이지 배열에 수동으로 내용을 배치 할 있습니다.

function mymodule_page_alter(&$page) {
  $my_content = _mymodule_render_mycontent();
  $page['my_region']['my_special_insert']['content']['#markup'] = $my_content;
}

컨텍스트 또는 핵심 블록 을 사용해야합니다 . 새로운 플러그인을 만드는 것은 생각만큼 나쁘지 않습니다. 파일 이름을 올바르게 지정하고 트리거와 테스트를 설정하십시오. .


사실, 두 번째 생각에 나는이 솔루션을 게시하는 것을 거의 후회했습니다. 이러지 마
doublejosh

-1

다음과 같이 테마에서 블록을 조정할 수도 있습니다.

/**
 * 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']);
  }
}

블록을 렌더링하는 방법이나 마크 업에서 블록을 식별하는 방법에 대한 질문에는 대답하지 않습니다.
Christian
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.