Как создать тему для пользовательского блока

26

Я создал блок , используя hook_block_infoи hook_block_themeи тому подобное. Но как я могу это тема?

У меня это работает, чтобы вернуть массив с ключами 'subject'и 'content'. Но я создал разметку прямо в hook_block_view()крючке, и это не то, что я хочу.

В документации сказано, что контент должен возвращаться как рендеринг, а не как разметка. Но что это за визуализируемый массив ? Говорят, что это должны быть данные, а не разметка, но все, что я вижу в примерах, это то, что они просто используются в качестве оболочки для разметки, поэтому ничего не получилось.

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

yunzen
источник
подробный блог: 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.

nedwardss
источник
Но если я переопределю тему с файлом tpl.php в моей теме, hook_block_view не будет выполняться, и мои переменные не будут переданы в файл temmplate.
юнзен
@yunzen - Вам может понадобиться очистить кэш, попробуйте перейти admin/config/development/performanceи нажать clear cacheкнопку. Вы также можете очистить кэш, используя drush, т.е.drush cc all
Cyclonecode
6

Попробуйте модуль Theme Developer . Когда вы включите его, вы можете поставить галочку в левом нижнем углу страницы 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внутри папки вашего модуля.

Я написал учебник об этом учебнике по Drupal - Как переопределить шаблоны блоков из пользовательского модуля

iStryker
источник