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

Я создал блок с hook_block_info и hook_block_theme и т. п.

Но как я его тему?

У меня есть работа и возврат массива с темами "и" содержанием ". но я создаю разметку непосредственно в крюке MYMODULE_block_view (), и это не то, что я хочу.

На странице drupal указано, что контент должен быть предпочтительнее renderable array, а не как разметка.

Но что это за «рендерируемый массив»? Я читал об этом.
Они говорят, что это должны быть данные вместо разметки, но все, что я вижу в примерах, это то, что оно просто используется в качестве обертки для разметки, поэтому ничего не получилось.

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


изменить

Итак, вот мой вывод

Если у вас есть модуль с именем my_module

У меня есть следующий код в my_module.module

define('MY_MODULE_BLOCK1', 'my-module-block1');

/**
 * Implements hook_block_info().
 */
function my_module_block_info() {
    $blocks[MY_MODULE_BLOCK1] = array(
        'info' => t('My Module - Block1'),
        'cache' => DRUPAL_CACHE_PER_PAGE,
    )

    return $blocks;
}

/**
 * Implements hook_block_view().
 */
function my_module_block_view($delta)  {
    switch ($delta) {
    case MY_MODULE_BLOCK1:
        return _my_module_block1();
        break;
    default:
        return array('subject'=>'','content'=>'');
    }
}

/**
 * Implements hook_theme().
 */
function my_module_theme() {
    $module_path = drupal_get_path('module', 'my_module');
    $base = array(
        'path' => "{$module_path}/theme",
    );
    $ret = array(
        MY_MODULE_BLOCK1 => $base + array(
            // I could define here anything I want
            // It would be called from inside the subpath theme in the module path
            // as file abc.tpl.php
            'template' => 'abc',
            // To override I need file 
            // 'block--<MODULE_NAME>--<DELTA>.tpl.php'
            // somewhere in my theme's folder
            // (with '-' for '_' in <MODULE_NAME> and <DELTA>)
            // <DELTA> comes from array keys in hook_block_info
            // in this case
            // block--my-module--my-module-block1.tpl.php

            'variables' => array(),
        ),
    );
    return $ret;    
}


/** 
 * Helper function to call theme
 */
 function _my_module_block1() {
    $block = array(
        'subject' => '',
        'content' => theme(MY_MODULE_BLOCK1, array()),
    );
    return $block; 
 }
24 голоса | спросил yunzen 5 PM000000120000005731 2012, 12:29:57

4 ответа


23

То, как я это делаю, выглядит следующим образом:

Все содержимое в CAPITALS (кроме DRUPAL_NO_CACHE) можно назвать любым, что вы хотите:

function MYMODULEBLOCK_block_info() {
  $blocks['MYMODULE_BLOCK_NAME'] = array(
    'info' => t('MYMODULE BLOCK TITLE'), 
    'cache' => DRUPAL_NO_CACHE, //there are a number of caching options for this
  );

  return $blocks;
}

function MYMODULEBLOCK_block_view($delta = ''){
  switch($delta){
    case 'MYMODULE_BLOCK_NAME':
      if(user_access('access content')){ //good idea to check user perms here
         $block['subject'] = t('MYBLOCK_TITLE');
         $block['content'] = MYMODULE_BLOCK_FUNCTION_ITEMS();
         return $block;
      }
      break;
  }
}

function MYMODULE_BLOCK_FUNCTION_ITEMS(){
  $items = array();
  $items['VAR_ONE'] = array('#markup' => 'VAR_ONE_OUTPUT'); //this is the simplest kind of render array
  $items['VAR_TWO'] = array(
                        '#prefix' => '<div>',
                        '#markup' => 'VAR_TWO_OUTPUT',
                            '#suffix' => '</div>',
                          );
// this is where the $items get sent to your default MYMODULE_BLOCK.tpl.php that gets 
// registered below
      return theme('MYMODULE_BLOCK_FUNCTION_ITEMS', array('items' => $items)); 
    }

//here you are registering your default tpl for the above block 
function MYMODULE_theme() {   
  $module_path = drupal_get_path('module', 'MYMODULE');
  $base = array(
    'path' => "$module_path/theme",   
  );
  return array(
    'MYMODULE_BLOCK_FUNCTION_ITEMS' => $base + array(
      'template' => 'MYMODULE_BLOCK',  //leave off .tpl.php
      'variables' => array('items' => NULL,),
    ),   
  ); 
}

А затем в подпапку в вашем модуле под названием theme /должен быть файл с именем MYMODULE_BLOCK.tpl.php, который может иметь это в нем:

<?php 

$items = $variables['items'];

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

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

ответил nedwardss 8 AM00000080000001531 2012, 08:22:15
6

Попробуйте Разработчик темы . Когда вы включили его, вы можете установить флажок в нижнем левом углу страницы Drupal. После этого вы можете щелкнуть по блоку и получить полезную информацию с учетом тематики. Вы можете увидеть возможные .tpl.php имена файлов для вашего блока, например.

Выберите одно из этих имен. Первая - самая конкретная. Это будет только тема одного блока. Создайте файл с этим именем в папке темы, если он еще не существует. Вы можете поместить его в подпапку, если хотите организовать.

Скопируйте содержимое block.tpl.php в свой файл и начните изменять вещи так, как вы хочу, чтобы они были.

Сохраните файл, очистите кеши и перезагрузите страницу.

ответил jiv-e 6 AM00000020000005831 2012, 02:04:58
6

Уже есть ряд ответов на этот вопрос, но я попытался обеспечить очень упрощенный подход. Надеемся, что идентифицируем конструкцию массива, ожидаемую 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, создающий настраиваемые пользовательские блоки

ответил Nicolas 30 J000000Tuesday13 2013, 09:13:16
4

Это старый пост, но я нашел лучшее решение для Drupal 7.

Добавьте это в свой настраиваемый модуль:

/**
* Implements hook_theme().
*/
function my_custom_module_theme($existing, $type, $theme, $path) {
  // Custom template for that overrides the default block.tpl.php.
  $themes['block__my_custom_module'] = array(
    'template' =--> 'block--my_custom_module',
    'original hook' => 'block',
    'path' => drupal_get_path('module', 'my_custom_module') . '/templates',
  );
  return $themes;
}

Затем вам понадобится следующий код

/**
 * Implements hook_block_info().
 */
function my_custom_module_block_info() {
  $blocks = array();
  $blocks['my_custom_module'] = array(
    'info' => t('My Custom Module Block'),
    'cache' => DRUPAL_CACHE_PER_ROLE,
  );
  return $blocks;
}

/**
 * Implements hook_block_view().
 */
function my_custom_module_block_view($delta = '') {
  $block = array();
  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 27 +03002015-10-27T22:35:41+03:00312015bEurope/MoscowTue, 27 Oct 2015 22:35:41 +0300 2015, 22:35:41

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132