如何主题自定义块


26

我使用hook_block_infohook_block_theme等创建了一个块。但是我该如何主题呢?

我有它的工作来返回键'subject'和的数组'content'。但是我直接在hook_block_view()钩子中创建了标记,这不是我想要的。

在文档中说,内容最好应作为可渲染数组而不是标记返回。但是这个可渲染数组是什么?他们说应该是数据而不是标记,但是我在示例中看到的只是将其用作标记的包装,因此没有任何好处。

我希望block--MYMODULE--DELTA.tpl.php主题中可以包含a ,但是如何调用它以及如何将数据传递给块?



@SureshKamrushi – OP要求主题化一个块。链接的文章是关于向主题添加新区域的。这不是OP要求的。
leymannx

Answers:


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文件覆盖主题,则hook_block_view将不会执行,并且不会将我的变量提供给temmplate文件。
yunzen 2013年

@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在模块文件夹中创建。

我已经编写了有关此Drupal教程的教程-如何从自定义模块覆盖块模板

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.