Einfache Möglichkeit, Blöcke programmgesteuert zu erstellen? [geschlossen]

26

Drupal lernen. Ich weiß jetzt, dass ich Block über das Backend erstellen kann, aber ich würde sie lieber programmgesteuert vorerstellen, wenn es möglich ist. Tatsächlich bin ich mir ziemlich sicher, dass es möglich ist. Aber wie geht das am einfachsten?

jayarjo
quelle
Detail-Blog: goo.gl/kD3TZu
Suresh Kamrushi

Antworten:

34

Für Drupal 7:

Verwenden Sie Hook_block_info- und Hook_block_view- Hooks in Ihrem benutzerdefinierten Modul . hook_block_info definiert den Block. Es wird in admin > structure > blocks angezeigt . * hook_block_view * zeigt den Inhalt an. Unten finden Sie Beispiele aus der Drupal-API.

Beispiel für hook_block_info, in dem zwei Blöcke definiert sind (mit dem Titel "Syndicate" und "Recent content"):

    <?php
function hook_block_info() {
  // This example comes from node.module.
  $blocks['syndicate'] = array(
    'info' => t('Syndicate'), 
    'cache' => DRUPAL_NO_CACHE,
  );

  $blocks['recent'] = array(
    'info' => t('Recent content'),
    // DRUPAL_CACHE_PER_ROLE will be assumed.
  );

  return $blocks;
}
?>

Beispiel für hook_block_view:

<?php
function hook_block_view($delta = '') {
  // This example is adapted from node.module.
  $block = array();

  switch ($delta) {
    case 'syndicate':
      $block['subject'] = t('Syndicate');
      $block['content'] = array(
        '#theme' => 'feed_icon', 
        '#url' => 'rss.xml', 
        '#title' => t('Syndicate'),
      );
      break;

    case 'recent':
      if (user_access('access content')) {
        $block['subject'] = t('Recent content');
        if ($nodes = node_get_recent(variable_get('node_recent_block_count', 10))) {
          $block['content'] = array(
            '#theme' => 'node_recent_block', 
            '#nodes' => $nodes,
          );
        }
        else {
          $block['content'] = t('No content available.');
        }
      }
      break;
  }
  return $block;
}
?>

Eine vollständige Liste der Hooks finden Sie auf der Seite Blocks API auf Drupal.org. Drupal 6 ist etwas anders. Es gibt keinen hook_block_view-Hook. Verwenden Sie stattdessen hook_block , um Blöcke zu deklarieren.

NAHE DUNKELHEIT
quelle
6

Für Drupal 6 lautet die kurze Antwort, dass Sie ein benutzerdefiniertes Modul erstellen, das hook_block implementiert .

Für Drupal 7 verwenden Sie die Block-API .

Wenn dies Ihr erster Ausflug in die Modulentwicklung ist, kann ich Pro Drupal Development oder Pro Drupal 7 Development nur empfehlen . Es ist so ziemlich alles drin, was Sie wissen müssen.

mpdonadio
quelle
Es scheint, dass hook_block nur in einem separaten Modul verwendet werden kann: | Ich verstehe immer noch nicht, warum diese Komplexität ... Ist es üblich, Module für alles in Drupal zu haben?
Jayarjo
2
Ja, Module sind ein Schlüsselkonzept von Drupal. In den meisten Fällen ist Drupal selbst eine Reihe von Modulen und alles wird über Modul-Hooks erledigt.
mpdonadio
3

Vielleicht suchen Sie nach dem, wonach ich gesucht habe und haben es hier gefunden:

/modules/block/block.module:
block_custom_block_save ($ edit, $ delta).

Wenn Sie sich diese Funktion ansehen, werden Sie feststellen, dass Sie das db_update einfach selbst durchführen können.

db_update('block_custom')
->fields(array(
  'body' => $edit['body']['value'],
  'info' => $edit['info'],
  'format' => $edit['body']['format'],
))
->condition('bid', $delta)
->execute();
Dan Shumaker
quelle
2

Schauen Sie sich block_add_block_form_submitin Drupal 7 in an modules/block/block.admin.inc.

Dies ist das reguläre Formular zum Erstellen von Blöcken. Es scheint nur die Datensätze direkt einzufügen, anstatt eine andere Funktion aufzurufen. Beachten Sie, dass jeder Datensatz in der Blocktabelle mit einem einzelnen Thema verknüpft ist (Sie können nur das aktive verwenden, aber es ist sicherer, Datensätze für alle Themen einzufügen).

Die block_custom- Tabelle enthält den Inhalt.

richardg
quelle
1

Mit dem Modul Features Extra können Sie Blöcke exportieren.

Alternativ können Sie Datensätze auch direkt in der Blocktabelle erstellen.

INSERT INTO blocks (
  module, delta, theme, status, weight, region, custom,
  throttle, visibility, pages, title, cache)
VALUES (
  'views','blog-block_1','mytheme',1,10,'sidebar_first',0,0,1,'blog\r\nblog/*','',-1)
Dylan Tack
quelle
1
Zusätzliches Modul oder direkte SQL-Abfrage ... Ich denke, es sollte etwas saubereres geben.
Jayarjo