Як тематизувати спеціальний блок


26

Я створив блок , використовуючи hook_block_infoі hook_block_themeтощо. Але як я можу тематизувати це?

У мене це працює, щоб повернути масив з ключами 'subject'і 'content'. Але я створив розмітку прямо в hook_block_view()гачку, і це не те, що я хочу.

У документах сказано, що контент бажано повертати як масив, що передається, а не як розмітку. Але що це за видатний масив ? Кажуть, це повинні бути дані замість розмітки, але все, що я бачу в прикладах, це те, що він просто використовується як обгортка для розмітки, тому нічого там не отримується.

Я хочу мати block--MYMODULE--DELTA.tpl.phpтему в своїй темі, але як я її називаю і як я можу передавати дані до блоку?


докладний блог: goo.gl/kD3TZu
Суреш Камруші

@SureshKamrushi - ОП просить тематизувати блок. Пов'язана стаття стосується додавання нового регіону до теми. Що не те, про що просив ОП.
leymannx

Відповіді:


27

Я це роблю так:

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,
        ],
      ],
  ];
}

І тоді в підпапці у вашому модулі, що називається theme, повинен бути файл, my-template.tpl.phpякий називається, який може мати це в ньому:

<?php 

$items = $variables['items'];

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

І якби ви цього хотіли, ви могли фактично замінити реалізацію модуля "за замовчуванням", який ви тільки що зробили для my-module.tpl.phpсвоєї теми, як хочете block--MYMODULE--DELTA.tpl.php.


Але якщо я перевантажую тему файлом tpl.php у своїй темі, прив'язка_block_view не виконується, і мої змінні не надаються файлу шаблону.
юнзен

@yunzen - Можливо, вам доведеться спорожнити кеш, спробуйте перейти admin/config/development/performanceта натиснути clear cacheкнопку. Ви також можете очистити кеш-пам'ять за допомогою drush, тобтоdrush cc all
Cyclonecode

6

Спробуйте модуль розробника теми . Увімкнувши це, ви можете встановити прапорець у нижньому лівому куті сторінки Drupal. Після цього ви можете натиснути на ваш блок і отримати корисну інформацію, враховуючи тематизацію. Наприклад, ви можете побачити можливі назви файлів .tpl.php для свого блоку.

Виберіть одне з цих імен. Перший - найбільш специфічний. Це буде лише тема одного блоку. Створіть файл із цим іменем у папці тем, якщо його ще немає. Ви можете помістити його в папку, якщо хочете організуватися.

Скопіюйте вміст block.tpl.php у свій файл і починайте змінювати речі таким, яким ви хочете.

Збережіть файл, очистіть кеші та перезавантажте сторінку.


5

На це питання вже є низка відповідей, але я намагався запропонувати дуже спрощений підхід. Сподіваємось ідентифікувати розробку структури масиву, очікуваного Drupal при поверненні блокового вмісту.

Для цього я розбив це питання на окремі приклади коду як такого,

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

Будь ласка, дивіться повне пояснення тут drupal 7, створюючи тематизовані користувацькі блоки


3

Це стара публікація, але я знайшов краще рішення для перекриття шаблонів блоків із спеціального модуля для Drupal 7.

Додайте це до власного модуля:

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

Тоді вам потрібен наступний код:

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

Все, що вам потрібно зробити, - це створити templates/block--my-custom-module.tpl.phpвсередині папки свого модуля.

Я написав підручник щодо цього Друпальського підручника - Як перекрити блокові шаблони зі спеціального модуля

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.