So gestalten Sie einen benutzerdefinierten Block

26

Ich habe einen Block mit hook_block_infound hook_block_themeund dergleichen erstellt. Aber wie kann ich es thematisieren?

Ich habe es funktioniert, um ein Array mit den Schlüsseln 'subject'und zurückzugeben 'content'. Aber ich habe das Markup direkt im hook_block_view()Hook erstellt und das ist nicht das, was ich will.

In den Dokumenten heißt es, dass Inhalte vorzugsweise als renderbare Arrays und nicht als Markups zurückgegeben werden sollten . Aber was ist dieses darstellbare Array ? Sie sagen, es sollten Daten statt Markups sein, aber alles, was ich in den Beispielen sehe, ist, dass es nur als Wrapper für Markups verwendet wird, sodass dort nichts gewonnen wird.

Ich möchte ein block--MYMODULE--DELTA.tpl.phpThema in meinem Design haben, aber wie kann ich es aufrufen und wie kann ich die Daten an den Block übergeben?

Yunzen
quelle
Detail-Blog: goo.gl/kD3TZu
Suresh Kamrushi
@ SureshKamrushi - OP fragt nach dem Theming eines Blocks. In dem verlinkten Artikel geht es darum, einem Thema eine neue Region hinzuzufügen. Welches ist nicht das, wonach OP gefragt hat.
Leymannx

Antworten:

27

So mache ich das:

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

Und dann sollte in einem Unterordner in Ihrem Modul, der aufgerufen wird theme, eine Datei vorhanden sein, my-template.tpl.phpdie Folgendes enthalten könnte:

<?php 

$items = $variables['items'];

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

Und wenn my-module.tpl.phpSie möchten , können Sie die "Standard" -Modulimplementierung, die Sie gerade in Ihrem Thema vorgenommen haben, überschreiben, wie Sie es wünschen block--MYMODULE--DELTA.tpl.php.

nedwardss
quelle
Aber wenn ich das Theme mit einer tpl.php-Datei in meinem Theme überschreibe, wird die hook_block_view nicht ausgeführt und meine Variablen werden nicht an die temmplate-Datei übergeben.
Yunzen
@yunzen - Möglicherweise müssen Sie Ihren Cache leeren, gehen Sie zu admin/config/development/performanceund klicken Sie auf die clear cacheSchaltfläche. Sie können den Cache auch löschen, indem Sie drush iedrush cc all
Cyclonecode
6

Probieren Sie das Theme Developer- Modul aus. Wenn Sie es aktiviert haben, können Sie ein Kontrollkästchen in der unteren linken Ecke Ihrer Drupal-Seite aktivieren. Danach können Sie auf Ihren Block klicken und nützliche Informationen zum Thema erhalten. Sie können beispielsweise die möglichen .tpl.php-Dateinamen für Ihren Block anzeigen.

Wählen Sie einen dieser Namen. Der erste ist der spezifischste. Es wird nur ein Block thematisiert. Erstellen Sie eine Datei mit diesem Namen in Ihrem Themenordner, falls diese noch nicht vorhanden ist. Sie können es in einem Unterordner ablegen, wenn Sie sich organisieren möchten.

Kopieren Sie den Inhalt von block.tpl.php in Ihre Datei und ändern Sie die Einstellungen so, wie Sie es möchten.

Speichern Sie Ihre Datei, löschen Sie die Caches und laden Sie die Seite neu.

jiv-e
quelle
5

Es gibt bereits eine Reihe von Antworten auf diese Frage, aber ich habe versucht, einen sehr simplen Ansatz zu finden. Ich hoffe, Sie können die Array-Struktur identifizieren, die Drupal bei der Rückgabe Ihres Blockinhalts erwartet.

Dazu habe ich die Frage in separate Codebeispiele als solche unterteilt,

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

Eine vollständige Erklärung finden Sie hier. Drupal 7 erstellt benutzerdefinierte Themenblöcke

Nicolas
quelle
3

Dies ist ein alter Beitrag, aber ich habe eine bessere Lösung zum Überschreiben von Blockvorlagen aus einem benutzerdefinierten Modul für Drupal 7 gefunden.

Fügen Sie dies Ihrem benutzerdefinierten Modul hinzu:

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

Dann benötigen Sie den folgenden Code:

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

Alles, was Sie tun müssen, ist templates/block--my-custom-module.tpl.phpim Ordner Ihres Moduls zu erstellen .

Ich habe ein Tutorial über dieses Drupal-Tutorial geschrieben - So überschreiben Sie Blockvorlagen aus einem benutzerdefinierten Modul

iStryker
quelle