Es gibt zwei Arten von Blöcken, und die Methode zum Rendern der beiden ist etwas unterschiedlich:
Inhaltsblöcke
Inhaltsblöcke sind Blöcke, die Sie in der Benutzeroberfläche erstellen. Sie ähneln Datenstrukturen, die mit Knoten konfiguriert werden können, mit Feldern usw. Wenn Sie eine dieser Strukturen rendern möchten, können Sie das tun, was Sie normalerweise mit Entitäten tun würden. Laden Sie sie und rendern Sie sie mit dem View Builder:
$bid = ??? // Get the block id through config, SQL or some other means
$block = \Drupal\block_content\Entity\BlockContent::load($bid);
$render = \Drupal::entityTypeManager()->
getViewBuilder('block_content')->view($block);
return $render;
Plugin-Blöcke
Blöcke können auch Plugins sein, die in verschiedenen Modulen definiert sind. Ein Beispiel könnte der Paniermehlblock sein. Wenn Sie diese rendern möchten, müssen Sie den Block-Plugin-Manager verwenden.
$block_manager = \Drupal::service('plugin.manager.block');
// You can hard code configuration or you load from settings.
$config = [];
$plugin_block = $block_manager->createInstance('system_breadcrumb_block', $config);
// Some blocks might implement access check.
$access_result = $plugin_block->access(\Drupal::currentUser());
// Return empty render array if user doesn't have access.
// $access_result can be boolean or an AccessResult class
if (is_object($access_result) && $access_result->isForbidden() || is_bool($access_result) && !$access_result) {
// You might need to add some cache tags/contexts.
return [];
}
$render = $plugin_block->build();
// In some cases, you need to add the cache tags/context depending on
// the block implemention. As it's possible to add the cache tags and
// contexts in the render method and in ::getCacheTags and
// ::getCacheContexts methods.
return $render;
Entitäten konfigurieren
Gemeinsam für die beiden Typen sind Blöcke. Wenn Sie sie in eine Region einfügen, erstellen Sie eine Konfigurationsentität, die alle Einstellungen für den Block enthält. In einigen Fällen ist es sinnvoller, mit Konfigurationsentitäten umzugehen. Da derselbe Block in mehreren Regionen mit und mit unterschiedlicher Konfiguration platziert werden kann, kann die Verwendung der Blockkonfigurationsentitäten schwieriger werden. Das Schöne ist, dass Sie möglicherweise einen Block mit einer bestimmten Konfiguration rendern möchten. Das Schlechte ist, dass sich die Konfigurations-IDs ändern können, wenn Sie an der Schnittstelle herumspielen, sodass der Code möglicherweise nicht funktioniert, nachdem Benutzer die Blockschnittstelle verwenden dürfen.
$block = \Drupal\block\Entity\Block::load('config.id');
$render = \Drupal::entityTypeManager()
->getViewBuilder('block')
->view($block);
return $render;
Für die Anzeige nur Ihres Blocks in Ihren Vorlagen mit Vorverarbeitung ist der beste Weg
Und in Ihrem
page.html.twig
odernode.html.twig
oderxxx.html.twig
verwenden Sie Ihre Variable My_region wie folgt:Und im darstellbaren Array (benutzerdefiniertes Modul) durch Beispiel in einen in content () benutzerdefinierten Controller:
Verwenden
ist nicht sinnvoll, da Drupal das Rendern in D8 bereits voraussetzt und dies veraltet ist . Sie solltendrupal_render
\Drupal::service('renderer')->renderRoot()
stattdessen verwenden.Es ist etwas schwer, es ist besser, das Maximum-Area-System zu verwenden und keinen Ladeblock aus dem Vorprozess hinzuzufügen. Im Falle der Verwendung eines Controllers in Ihren Modulen scheint dies eine berechtigte Verwendung zu sein.
quelle
element-content
Eigenschaften in einem Render-Array finden. Wissen Sie, wo es dokumentiert ist?\Drupal\block\Entity\Block::load
aber nicht die ganze Zeit einen Block zurück. Es wird nur dann etwas zurückgegeben, wenn der von mir geladene Block in der Ansicht im Blocklayout platziert ist . Wenn es nicht platziert ist, gibt es null zurück.\Drupal::entityTypeManager()->getViewBuilder('block')->view($block);
Zusätzlich zur obersten Antwort ... Wenn Sie einen Block aus einer Ansicht rendern möchten, müssen Sie die Dinge möglicherweise etwas anders machen.
(Anzeigename zB -> Block_1)
Da wir es an twig übergeben, müssen wir nicht rendern (mit dem Render-Service).
Sie können es also einfach als Variable an twig übergeben (in diesem Beispiel die Rückgabe eines Controllers):
In Ihrem Modul benötigen Sie ein hook_theme () für Ihre Variable:
Und zum Schluss in Ihrer Zweigvorlage:
quelle
Ich musste den HTML-Code eines benutzerdefinierten Blocks abrufen und mit folgendem Befehl abrufen:
quelle
__toString()
.quelle
drupal_render
oder den Render-Service vermeiden .drupal_render
Es ist ziemlich schlecht, ein Array mit dem gerenderten Inhalt wiederherzustellen. Sie sollten$block_content
stattdessen zurückkehren. Das Render-Array kann vor dem eigentlichen Rendern geändert werden, und Sie sollten Drupal das Rendern so weit wie möglich selbst ausführen lassen.Grundsätzlich gibt es zwei Arten von Renderings.
Wenn im Layout eine Instanz des Blocks vorhanden ist. Der Block kann mit Preprocess as im Zweig gerendert werden
$ block = Block :: load ('BLOCK_ID'); $ variables ['social_links'] = \ Drupal :: entityTypeManager () -> getViewBuilder ('block') -> view ($ block);
Es gibt keine Instanz oder Konfigurationen für den Block. Dann müssen wir im Präprozessor die Instanz erstellen, den Block erstellen und dann rendern
$ block_manager = \ Drupal :: service ('plugin.manager.block'); $ config = []; $ plugin_block = $ block_manager-> createInstance ('farmjournal_social_sharing', $ config); $ render = $ plugin_block-> build (); $ variables ['farmjournal_social_sharing'] = render ($ render);
quelle
Scheint, dass dies für Plugin-Blöcke funktioniert.
quelle
Sie erhalten eine Blockausgabe:
Und dann können Sie die Ausgabe auf verschiedene Arten zurückgeben:
oder:
quelle
\Drupal::service ('renderer')->render ($block_content)
drupal_render ($block_content)
Dies kann wie folgt geschehen: Letzteres ist in Drupal 8 veraltet.drupal_render
oder den Render-Service vermeiden .drupal_render
Es ist ziemlich schlecht, ein Array mit dem gerenderten Inhalt wiederherzustellen. Sie sollten$block_content
stattdessen zurückkehren. Das Render-Array kann vor dem eigentlichen Rendern geändert werden, und Sie sollten Drupal das Rendern so weit wie möglich selbst ausführen lassen. Was Sie zurückgeben, muss erneut gerendert werden, wodurch das eigentliche Rendern sinnlos wirdBasierend auf meinen Recherchen könnten Sie den Code aus So rendern Sie einen Block programmgesteuert in Drupal 8 . Sie könnten sich auch ändern
in etwas so einfaches wie:
um es zum Beispiel an die Rückgabevariable einer Seite anzuhängen.
quelle
drupal_render
oder den Render-Service vermeiden .drupal_render
Es ist ziemlich schlecht, ein Array mit dem gerenderten Inhalt wiederherzustellen. Sie sollten$block_content
stattdessen zurückkehren. Das Render-Array kann vor dem eigentlichen Rendern geändert werden, und Sie sollten Drupal das Rendern so weit wie möglich selbst ausführen lassen.