it-swarm.com.de

So gestalten Sie einen benutzerdefinierten Block

Ich habe einen Block mit hook_block_info Und hook_block_theme Und dergleichen erstellt. Aber wie kann ich es thematisieren?

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

In den Dokumenten heißt es, dass Inhalte vorzugsweise als renderbares Array und nicht als Markup zurückgegeben werden sollten. Aber was ist das renderbares Array? Sie sagen, es sollten Daten anstelle von 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 in der Lage sein, ein block--MYMODULE--DELTA.tpl.php In meinem Thema zu haben, aber wie rufe ich es auf und wie kann ich die Daten an den Block übergeben?

26
yunzen

Ich mache das wie folgt ...

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 sich in einem Unterordner in Ihrem Modul mit dem Namen theme eine Datei mit dem Namen my-template.tpl.php Befinden, die Folgendes enthalten könnte:

<?php 

$items = $variables['items'];

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

Und wenn Sie möchten, können Sie die "Standard" -Modulimplementierung, die Sie gerade für my-module.tpl.php In Ihrem Thema erstellt haben, tatsächlich überschreiben, wie Sie es in block--MYMODULE--DELTA.tpl.php Wünschen.

27
nedwardss

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

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 einen Unterordner legen, wenn Sie sich organisieren möchten.

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

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

6
jiv-e

Es gibt bereits eine Reihe von Antworten auf diese Frage, aber ich habe versucht, einen sehr vereinfachten Ansatz zu finden. Wir hoffen, dass wir die Array-Struktur identifizieren können, die von Drupal) erwartet wird, wenn Sie Ihren Blockinhalt zurückgeben.

Zu diesem Zweck habe ich die Frage in separate Codebeispiele 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

5
Nicolas

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

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

Sie müssen lediglich templates/block--my-custom-module.tpl.php Im Ordner Ihres Moduls erstellen.

Ich habe ein Tutorial dazu geschrieben Drupal-Tutorial - Überschreiben von Blockvorlagen aus einem benutzerdefinierten Modul

3
iStryker