it-swarm.com.de

Wie füge ich einen Block in einen Knoten oder eine Vorlage in Drupal 7 ein?

In Drupal 6 war es einfach, einen Block mit folgendem Code in eine Vorlage einzufügen:

$block = module_invoke('views', 'block', 'view', 'block_name');
print $block['content'];

Die Verwendung der gleichen Anweisungen in Drupal 7 scheint jedoch nicht zu funktionieren. Ich habe mich umgesehen und finde die neue Methode nicht.

Verfügt Drupal 7 über eine Routine, mit der ein Block programmgesteuert in eine Vorlage oder einen Knoten eingefügt werden kann?

35
Randy Burgess

Mit der Antwort von wrburgess erhalten Sie möglicherweise eine Fehlermeldung, wenn Ihr Server eine neuere Version von PHP verwendet.

Strict warning: Only variables should be passed by reference in include()...

Dies ist, was ich getan habe, um den Fehler nicht zu verursachen.

  <?php
    $blockObject = block_load('views', 'block_name');
    $block = _block_get_renderable_array(_block_render_blocks(array($blockObject)));
    $output = drupal_render($block);
    print $output;
  ?>
19
canintex

D7:

<?php
  $block = module_invoke('module_name', 'block_view', 'block_delta');
  print render($block['content']);
?>

'module_name' = Der Computername des Moduls (d. h. der Ordnername des Moduls). Dies gilt auch für Kernmodule, so dass beispielsweise 'search', 'user' und 'comment' hier funktionieren würden.

'block_delta' = Der Maschinenname des Blocks. Sie können dies ermitteln, indem Sie die Blockverwaltungsseite besuchen und den Block bearbeiten. Die URL zum Bearbeiten eines Webformularblocks würde beispielsweise so aussehen:

Drupal 7: admin/structure/block/manage/webform/client-block-11/configure

In diesem Beispiel ist 'webform' der Name des Moduls, 'client-block-11' ist das Delta des Blocks.

Benutzerdefinierte Blöcke haben den Modulnamen 'block' und eine Nummer für ein Delta, die Sie auch durch Bearbeiten des Blocks finden können.

Weitere Informationen: http://drupal.org/node/26502

85
kloewer

Dies scheint die Lösung für das Einfügen von Blöcken in Vorlagen für Drupal 7 zu sein, scheint jedoch etwas unpraktisch zu sein, und ich habe keine Ahnung, was die Leistung beeinflusst:

$block = block_load('views', 'block_name');      
$output = drupal_render(_block_get_renderable_array(_block_render_blocks(array($block))));        
print $output;

Wenn jemand ein besseres Verfahren hat, fügen Sie bitte hinzu.

27
Randy Burgess

Diese Arbeit für mich:

98 ist die ID des Blocks

$block =block_load('block',98);
$output = drupal_render(_block_get_renderable_array(_block_render_blocks(array($block))));
print $output;
11
CaDyMaN

Ich habe das gerade in Drupal 7 getestet und es funktioniert:

$bloqueServicios = module_invoke('views', 'block_view', 'servicios-blo_home');
print render($bloqueServicios);

Viel Glück!

7
DanyAlejandro

Die Funktion module_invoke() funktioniert. Ich habe jedoch festgestellt, dass das Rendern eines Blocks auf diese Weise anscheinend keine benutzerdefinierte Vorlage für diesen Block verwendet. Je nach Ihren Bedürfnissen kann dies in Ordnung sein.

Wie bereits in anderen Antworten kommentiert, funktioniert dies auch und verwendet auch benutzerdefinierte Vorlagen:

$raw_block = block_load('your-module', 'delta');
$rendered_block = drupal_render(_block_get_renderable_array(_block_render_blocks(array($raw_block))));
print $rendered_block;

Wenn Sie eine benutzerdefinierte block--your-module--delta.tpl.php-Vorlagendatei haben, wird sie zum Formatieren des Blocks verwendet.

Quelle: http://api.drupal.org/api/drupal/includes!module.inc/function/module_invoke/7

5
cafonso

Aus irgendeinem Grund funktioniert render() nicht für mich, aber das funktioniert: 

<?php
    $block = module_invoke('block', 'block_view', '1');
    echo $block['content'];
?>
5
user1253382

Um die Antwort von Wrburgess zu verbessern, können Sie es in einer Zeile tun ... 

<?php print drupal_render(_block_get_renderable_array(_block_render_blocks(array(block_load('module_name', 'block_delta'))))); ?>

So verwende ich beispielsweise Blocknummer 6 ...

<?php print drupal_render(_block_get_renderable_array(_block_render_blocks(array(block_load('block', '6'))))); ?>
3

Bei meiner Suche nach einem Block in eine Vorlage bin ich auf diesen Beitrag gestoßen. 

Wenn Sie einen benutzerdefinierten Block hinzufügen möchten (den Sie über die Blockschnittstelle hinzugefügt haben), müssen Sie (anstelle von block_load(); in drupal 7) verwenden.

$block = block_get_custom_block($bid);
$content = $block['body'];
3
michaelmol

Dies funktionierte für meine Drupal 7, URL: admin/structure/block/manage/ addthis / addthis_block /configure HINWEIS: Delta und Modulname sind in der URL selbst enthalten

$addblock = module_invoke('addthis','block_view','addthis_block');
print render($addblock['content']);

Weitere Informationen finden Sie unter http://technarco.com/drupal/insert-block-node-or-template-drupal-7

3
Umesh Patil
 $block = module_invoke('menu_block', 'block_view', '6');
 echo render ($block['content']);

Dies funktioniert für mich zum Drucken von Menüblöcken.

1
MilanG

Es gibt ein Modul namens insert_block für diejenigen, die den Block "Drupal way" einfügen wollen (nichts programmieren, sondern nur das Modul aktivieren). Hier 's wie man es einrichtet.

HINWEIS: Ich weiß, dass es sich bei dieser Frage um das "programmgesteuerte Einfügen eines Blocks in eine Vorlage oder einen Knoten" handelt, aber Google schickt Leute hierher, auch wenn sie nach einer nicht für Programmierer geeigneten Lösung wie mir suchen.

1
Jasom Dotnet

Schauen Sie sich an, wie Drupal dies in _block_render_blocks macht. Das Ergebnis dieser Funktion wird an drupal_render übergeben.

0
Oswald

module_invoke Funktioniert gut für den Renderblock in der Vorlagendatei, aber es werden keine mehrsprachigen Websites verwendet.

0
Sohan Jangid

Vor kurzem war ich mit dem gleichen Problem konfrontiert und bin auf eine Nice-Lösung gestoßen, die die Lösung in Drupal als Drupal-Methode beschreibt.

Sie können Bereiche in jeder Vorlage drucken, sie sind jedoch nicht direkt in der Vorlage node.tpl.php verfügbar. Um sie verfügbar zu machen, erstellen Sie eine neue Variable zur Verwendung in Ihrer Vorlage node.tpl.php, die den gesamten Regionsinhalt enthält.

Das Erstellen neuer Vorlagenvariablen erfolgt mithilfe einer Vorverarbeitungsfunktion. Erstellen Sie in der Datei template.php Ihres Themas eine Funktion, die folgendermaßen aussieht:

function mytheme_preprocess_node(&$variables) {
  // Get a list of all the regions for this theme
  foreach (system_region_list($GLOBALS['theme']) as $region_key => $region_name) {

    // Get the content for each region and add it to the $region variable
    if ($blocks = block_get_blocks_by_region($region_key)) {
      $variables['region'][$region_key] = $blocks;
    }
    else {
      $variables['region'][$region_key] = array();
    }
  }
}

Anschließend können Sie in der Vorlage node.tpl.php Ihres Themas jeden Bereich rendern, indem Sie folgende Schritte ausführen:

<?php print render($region['sidebar_first']); ?>

Dabei ist sidebar_first der Name der Region, die Sie rendern möchten.

Lesen Sie den vollständigen Artikel hier: https://drupal.stackexchange.com/questions/20054/can-regions-be-printed-within-a-node-template

0
Prabhat Ranjan