it-swarm-vi.com

Lập trình đặt khối?

Tôi đang sử dụng Drupal 7. Ngay bây giờ, tôi có trình điều hướng menu chính và trình chuyển đổi Ngôn ngữ tồn tại trong tiêu đề trang web của mình. Tôi đã đặt chúng ở đó bằng cách đi tới CMS> Cấu trúc> Khối và hten kéo các khối vào khu vực tiêu đề.

Làm thế nào để tôi lập trình đặt các khối này trong tiêu đề?

14
John

Để thay đổi vùng nơi các khối được xác định bởi các mô-đun khác được đặt, bạn có thể triển khai hook_block_info_alter () , nhận các đối số sau:

  • $blocks (Được truyền bằng tham chiếu): mảng chứa định nghĩa khối, được khóa bởi mô-đun và delta
  • $theme: Chủ đề mà các khối đang được xác định
  • $code_blocks: Các khối như được xác định từ các triển khai hook_block_info(), trước khi các giá trị của chúng bị ghi đè bởi các giá trị thu được từ cơ sở dữ liệu
4
kiamlaluno

Việc thêm một mảng có thể kết xuất vào bất kỳ vùng trang nào trong hook_page_build () là hợp pháp. Drupal 7 ví dụ để thêm minipanel vào vùng chân trang.

<?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;
  }
}

Đây là kỹ thuật rất giống nhau sử dụng mô-đun bối cảnh.

Lưu ý: bạn không cần kích hoạt block.module để làm việc này.

3
jonhattan

Nếu bạn đang thêm một khối tùy chỉnh, bạn sẽ thực hiện việc này bằng hook_block_info, đặt tùy chọn trạng thái thành 1 và tùy chọn vùng cho vùng bạn muốn đặt khối.

Thí dụ:

MODULE_block_info() {
  $blocks = array();
  $blocks['my_block'] = array(
    'info' => t('My Block Name'),
    'status' => 1,
    'region' => 'THE_REGION_I_WANT',
   );
   return $blocks;
}

Nếu bạn muốn thay đổi một khối đã tồn tại, bạn sẽ sử dụng hook_block_info_alter () thay vào đó, cập nhật các tùy chọn tương tự đã được hiển thị bên dưới.

Thí dụ:

MODULE_hook_block_info_alter(&$blocks, $theme, $code_blocks) {
  $blocks['my_block']['status'] = 1;
  $blocks['my_block']['region'] = 'THE_REGION_I_WANT';
}

Để biết thêm thông tin, hãy xem https://api.drupal.org/api/drupal/modules%21block%21block.api.php/feft/hook_block_info/7

2
Wesley J

Trong D6, về cơ bản nó sẽ là

$block = module_invoke("the_module_name", "block", "view", the_block_delta);
drupal_set_content("the_region_name", theme("block", $block));

Trong D7 tôi nghĩ rằng nó là

$block = module_invoke("the_module_name", "block_view", the_block_delta);
drupal_add_region_content("the_region_name", theme("block", $block));

nhưng tôi vẫn đang tăng tốc trên D7.

2
mpdonadio

Mã này dựa trên @ jonhattan, nhưng mã này không hiển thị HTML khối chứa hoặc các liên kết theo ngữ cảnh. Tôi cũng cung cấp một cách đơn giản để chỉ định tất cả các khối và khu vực ở một nơi.

<?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;
    }
  }
}

Lưu ý: Không giống như mã của anh ấy, bạn cần cài đặt block.module.

0
hargobind