커스텀 블록을 테마로하는 방법


26

hook_block_infoand hook_block_theme등을 사용하여 블록을 만들었습니다 . 하지만 어떻게 주제를 정할 수 있습니까?

'subject'와 배열을 반환하도록 노력 하고 'content'있습니다. 그러나 나는 hook_block_view()훅 에서 직접 마크 업을 만들었고 그것은 내가 원하는 것이 아닙니다.

문서에서 콘텐츠는 마크 업이 아닌 렌더링 가능한 배열 로 반환되는 것이 좋습니다 . 그러나이 렌더링 가능한 배열 은 무엇 입니까? 그들은 마크 업 대신 데이터 여야한다고 말하지만, 예제에서 볼 수있는 것은 마크 업을위한 래퍼로만 사용되므로 얻을 수있는 것이 아무것도 없다는 것입니다.

나는이 할 수 있도록하려면 block--MYMODULE--DELTA.tpl.php내 테마하지만 어떻게 그것을 호출 할 어떻게 내가 블록에 데이터를 전달할 수 있습니다?


세부 블로그 : goo.gl/kD3TZu
Suresh Kamrushi

@SureshKamrushi – OP는 블록 테마를 요구합니다. 링크 된 기사는 테마에 새 영역을 추가하는 것에 관한 것입니다. OP가 요청한 것이 아닙니다.
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 파일로 테마를 무시하면 hook_block_view가 실행되지 않고 변수가 temmplate 파일에 제공되지 않습니다.
yunzen

@yunzen-캐시를 비우고 버튼을 admin/config/development/performance클릭하십시오 clear cache. drush iedrush 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 Tutorial-사용자 정의 모듈에서 블록 템플릿을 재정의하는 방법에 대한 자습서를 작성했습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.