Cách tạo chủ đề cho một khối tùy chỉnh


26

Tôi đã tạo một khối bằng cách sử dụng hook_block_infohook_block_themetương tự. Nhưng làm thế nào tôi có thể chủ đề nó?

Tôi có nó làm việc để trả về một mảng với các phím 'subject''content'. Nhưng tôi đã tạo ra đánh dấu trực tiếp trong hook_block_view()hook và đó không phải là điều tôi muốn.

Trong các tài liệu, người ta nói rằng nội dung tốt nhất nên được trả về dưới dạng mảng có thể kết xuất và không phải là đánh dấu. Nhưng mảng kết xuất này là gì? Họ nói rằng đó phải là dữ liệu thay vì đánh dấu, nhưng tất cả những gì tôi thấy trong các ví dụ là nó chỉ được sử dụng như một trình bao bọc cho đánh dấu, vì vậy không có gì đạt được ở đó.

Tôi muốn có thể có một block--MYMODULE--DELTA.tpl.phpchủ đề của mình nhưng làm cách nào để gọi nó và làm cách nào tôi có thể truyền dữ liệu vào khối?



@SureshKamrushi - OP yêu cầu theo chủ đề một khối. Bài viết được liên kết là về việc thêm một khu vực mới vào một chủ đề. Đó không phải là những gì OP yêu cầu.
leymannx

Câu trả lời:


27

Cách tôi làm như sau ...

function MYMODULE_block_info() {

  $blocks = [];

  $blocks['my_block_machine_name'] = [
    'info'  => t('My Block Title'),
    // @see https://api.drupal.org/api/drupal/includes!common.inc/group/block_caching/7.x
    // You can use different caching options.
    'cache' => DRUPAL_NO_CACHE,
  ];

  return $blocks;
}

function MYMODULE_block_view($delta = '') {

  $block = [];

  switch ($delta) {
    case 'my_block_machine_name':
      // Good idea to check user permissions here.
      if (user_access('access content')) {
        $block['subject'] = t('My Block Title');
        $block['content'] = MY_BLOCK_CONTENT_CALLBACK();
      }
      break;
  }

  return $block;
}

function MY_BLOCK_CONTENT_CALLBACK()() {

  $items = [];

  // This is the simplest kind of renderable array.
  $items['VAR_ONE'] = ['#markup' => 'VAR_ONE_OUTPUT'];

  // Here I added a prefix and a suffix.
  $items['VAR_TWO'] = [
    '#prefix' => '<div class="foo-bar">',
    '#markup' => 'VAR_TWO_OUTPUT',
    '#suffix' => '</div>',
  ];

  // This is where the $items get sent to your my-template.tpl.php template
  // that got registered below.
  return theme('my_cool_block', ['items' => $items]);
}

function MYMODULE_theme() {

  // Here you are registering your template for the block output above.
  $module_path = drupal_get_path('module', 'MYMODULE');

  // Drupal will now look up your modules /theme folder first to grab the
  // template.
  $base = [
    'path' => "$module_path/theme",
  ];

  return [
    'my_cool_block' => $base + [
        // Leave off .tpl.php.
        'template'  => 'my-template',
        // Define variables you want to pass to the template.
        // Here I just pass items, but you can pass any other data as well.
        'variables' => [
          'items' => NULL,
        ],
      ],
  ];
}

Và sau đó, trong một thư mục con trong mô-đun của bạn được gọi theme, nên có một tệp được gọi my-template.tpl.phpcó thể có cái này trong đó:

<?php 

$items = $variables['items'];

print render($items['VAR_ONE']); 
print render($items['VAR_TWO']); 

Và nếu bạn muốn, bạn thực sự có thể ghi đè lên triển khai mô-đun "mặc định" mà bạn vừa thực hiện my-module.tpl.phptrong chủ đề của mình như bạn muốn block--MYMODULE--DELTA.tpl.php.


Nhưng nếu tôi ghi đè chủ đề bằng tệp tpl.php trong chủ đề của mình, hook_block_view sẽ không thực thi và các biến của tôi không được cung cấp cho tệp temmplate.
yunzen

@yunzen - Bạn có thể cần làm trống bộ nhớ cache của mình, hãy thử truy cập admin/config/development/performancevà nhấp vào clear cachenút. Bạn cũng có thể xóa bộ nhớ cache sử dụng drush tứcdrush cc all
Cyclonecode

6

Hãy thử mô-đun Nhà phát triển chủ đề . Khi bạn đã bật nó, bạn có thể chọn một hộp kiểm ở góc dưới bên trái của trang Drupal của bạn. Sau đó, bạn có thể nhấp vào khối của mình và nhận thông tin hữu ích khi xem xét theo chủ đề. Bạn có thể thấy tên tập tin .tpl.php có thể cho khối của bạn chẳng hạn.

Chọn một trong những tên đó. Đầu tiên là một trong những cụ thể nhất. Nó sẽ chỉ chủ đề một khối. Tạo một tệp có tên đó trong thư mục chủ đề của bạn nếu nó chưa có ở đó. Bạn có thể đặt nó trong thư mục con nếu bạn muốn tổ chức.

Sao chép nội dung của block.tpl.php trong tệp của bạn và bắt đầu thay đổi mọi thứ theo cách bạn muốn.

Lưu tệp của bạn, xóa bộ nhớ cache và tải lại trang.


5

Đã có một số câu trả lời cho câu hỏi này nhưng tôi đã cố gắng cung cấp một cách tiếp cận rất đơn giản. Hy vọng việc xác định để phát triển cấu trúc mảng được Drupal mong đợi khi trả về nội dung khối của bạn.

Để làm điều này, tôi đã chia câu hỏi thành các ví dụ mã riêng biệt như vậy,

/**
 * Implements hook_theme().
 */
function examplemodule_theme() {
  return array(
    'examplemodule_output' => array(
      'variables' => array(
        'title' => NULL,
        'content' => NULL,
        'popular_content' => NULL,
       ),
      'template' => 'templates/examplemodule-sweet--block',
    ),
  );
}

Xin vui lòng xem một lời giải thích đầy đủ ở đây drupal 7 tạo các khối tùy chỉnh theo chủ đề


3

Đây là một bài viết cũ, nhưng tôi đã tìm thấy một giải pháp tốt hơn để ghi đè các mẫu khối từ một mô-đun tùy chỉnh cho Drupal 7.

Thêm phần này vào mô-đun tùy chỉnh của bạn:

/**
 * Implements hook_theme().
 */
function MYMODULE_theme($existing, $type, $theme, $path) {

  // Custom template for that overrides the default block.tpl.php.
  $themes['block__my_custom_module'] = [
    'template'      => 'block--my_custom_module',
    'original hook' => 'block',
    'path'          => drupal_get_path('module', 'my_custom_module') . '/templates',
  ];

  return $themes;
}

Sau đó, bạn cần mã theo sau:

/**
 * Implements hook_block_info().
 */
function MYMODULE_block_info() {

  $blocks = [];

  $blocks['my_custom_module'] = [
    'info'  => t('My Custom Module Block'),
    'cache' => DRUPAL_CACHE_PER_ROLE,
  ];

  return $blocks;
}

/**
 * Implements hook_block_view().
 */
function MYMODULE_block_view($delta = '') {

  $block = [];

  switch ($delta) {
    case 'my_custom_module':
      $block['content'] = _my_custom_module_helper_function();
      break;
  }

  return $block;
}

/**
 * Helper function to generate HTML.
 *
 * @return string
 *   generated HTML
 */
function _my_custom_module_helper_function() {

  $output = '';

  // ...

  return $output;
}

Tất cả bạn phải làm là tạo templates/block--my-custom-module.tpl.phptrong thư mục mô-đun của bạn.

Tôi đã viết một hướng dẫn về Hướng dẫn Drupal này - Cách ghi đè một Khối mẫu từ Mô-đun tùy chỉnh

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.