Jak utworzyć motyw niestandardowego bloku

26

I utworzeniu bloku przy użyciu hook_block_infoi hook_block_themei tym podobne. Ale jak to zrobić?

Mam pracę, aby zwrócić tablicę z kluczami 'subject'i 'content'. Ale stworzyłem znaczniki bezpośrednio na hook_block_view()haku i nie tego chcę.

W dokumentacji jest powiedziane, że zawartość powinna zwracać się jako tablica do renderowania, a nie jako znaczniki. Ale czym jest ta tablica do renderowania ? Mówią, że powinny to być dane zamiast znaczników, ale w przykładach widzę tylko, że jest to po prostu opakowanie na znaczniki, więc nic tam nie zyskało.

Chcę mieć temat block--MYMODULE--DELTA.tpl.phpw moim motywie, ale jak go nazwać i jak przekazać dane do bloku?

Junzen
źródło
blog szczegółowy: goo.gl/kD3TZu
Suresh Kamrushi
@SureshKamrushi - OP prosi o motyw blok. Połączony artykuł dotyczy dodawania nowego regionu do motywu. O to nie prosił OP.
leymannx

Odpowiedzi:

27

Sposób, w jaki to robię, jest następujący ...

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

A następnie w podfolderze w module o nazwie themepowinien znajdować się plik o takiej nazwie my-template.tpl.php:

<?php 

$items = $variables['items'];

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

A jeśli chcesz, możesz zastąpić „domyślną” implementację modułu, którą właśnie utworzyłeś my-module.tpl.phpw swoim motywie, tak jak chcesz block--MYMODULE--DELTA.tpl.php.

nedwardss
źródło
Ale jeśli nadpisuję kompozycję plikiem tpl.php w moim motywie, hook_block_view nie wykona się, a moje zmienne nie zostaną przekazane do pliku temmplate.
Junzen
@yunzen - Może być konieczne opróżnienie pamięci podręcznej, spróbuj przejść do admin/config/development/performancei kliknąć clear cacheprzycisk. Możesz także wyczyścić pamięć podręczną za pomocą drush, tj.drush cc all
Cyclonecode
6

Wypróbuj moduł Theme Developer . Po włączeniu możesz zaznaczyć pole wyboru w lewym dolnym rogu strony Drupal. Następnie możesz kliknąć blok i uzyskać przydatne informacje dotyczące tematów. Możesz zobaczyć na przykład możliwe nazwy plików .tpl.php dla swojego bloku.

Wybierz jedno z tych imion. Pierwszy jest najbardziej konkretny. Będzie to tylko jeden blok tematyczny. Utwórz plik o tej nazwie w folderze motywu, jeśli jeszcze go nie ma. Możesz umieścić go w podfolderze, jeśli chcesz się uporządkować.

Skopiuj zawartość pliku block.tpl.php do swojego pliku i zacznij zmieniać rzeczy tak, jak chcesz.

Zapisz plik, wyczyść pamięć podręczną i ponownie załaduj stronę.

jiv-e
źródło
5

Istnieje już wiele odpowiedzi na to pytanie, ale starałem się zapewnić bardzo uproszczone podejście. Mam nadzieję, że zidentyfikujemy dla devs strukturę tablicy oczekiwaną przez Drupala podczas zwracania zawartości bloku.

Aby to zrobić, podzieliłem pytanie na osobne przykłady kodu jako takie,

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

Zobacz pełne wyjaśnienie tutaj drupal 7, tworząc niestandardowe bloki tematyczne

Nicolas
źródło
3

To jest stary post, ale znalazłem lepsze rozwiązanie do zastępowania szablonów bloków z niestandardowego modułu dla Drupal 7.

Dodaj to do niestandardowego modułu:

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

Następnie potrzebujesz następującego kodu:

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

Wszystko, co musisz zrobić, to utworzyć templates/block--my-custom-module.tpl.phpw folderze modułu.

Napisałem samouczek na temat tego samouczka Drupal - jak przesłonić szablony bloków z niestandardowego modułu

iStryker
źródło