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


14

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 vào CMS> Cấu trúc> Khối và kéo các khối vào vùng tiêu đề.

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


Theo câu hỏi của bạn về cách đặt lập trình các khối này trong tiêu đề, tôi đề nghị xem lại mô-đun Ví dụ http://drupal.org/project/examples và cụ thể bạn có thể xem lại và kích hoạt Ví dụ Khối mô-đun để kiểm tra khối của bạn theo cách lập trình . Tôi đoán rằng block_example_block_info()và giá trị 'khu vực' có thể hữu ích để kiểm tra.
cigotete

John, bạn đã đưa ra một câu trả lời cho điều này?
tái hiện

Câu trả lời:


4

Để 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ởi tham chiếu): mảng chứa các đị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 hook_block_info()cài đặt, 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

3

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. Ví dụ Drupal 7 để thêm một 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.


2

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.


Điều này không cho phép các mô-đun của bên thứ ba thay đổi khối đang được đầu ra, vì các mô-đun có thể triển khai hook_block_view_alter không được gọi với mã bạn đã hiển thị.
kiamlaluno

Tin drupal_add_region_content()là một ngõ cụt vì nó dành cho các trang cài đặt / nâng cấp.
doublejosh

2

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


0

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.


-1

Đây không phải là hình thức tốt nhất, nhưng bạn có thể tự đặt nội dung vào mảng trang như thế này ...

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

Mặc dù bạn nên sử dụng Ngữ cảnh hoặc chỉ các khối cốt lõi. Tạo các plugin mới không tệ như nó có vẻ. Chỉ cần đặt tên tệp chính xác, thiết lập một kích hoạt và kiểm tra. Ví dụ .


Trong thực tế, ngày thứ hai tôi nghĩ rằng tôi gần như hối tiếc khi đăng giải pháp này. Đừng làm điều này.
doublejosh 10/03/2015

-1

bạn cũng có thể điều chỉnh các khối trong chủ đề của mình như:

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

Điều này không trả lời câu hỏi làm thế nào để kết xuất các khối hoặc làm thế nào để xác định chúng trong đánh dấu.
Christian
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.