it-swarm.com.de

Rendern Sie einen benutzerdefinierten Block programmgesteuert

Wie rendere ich einen benutzerdefinierten Blocktyp (block_content) programmgesteuert mit einer bestimmten Anzeigeansicht?

2
kxo

Fügen Sie in hook_preprocess_page() den folgenden Code hinzu.

$block_entity = Drupal\block_content\Entity\BlockContent::load(BLOCK_ID);// BLOCK_ID
$block_view = \Drupal::entityTypeManager()->getViewBuilder('block_content')->view($block_entity, 'DISPLAY_VIEW_NAME');
if ($block_view) {
    $variables['page']['my_block'] = $block_view;
}

Drucken Sie in Ihrer Vorlage Twig) den Block mit dem folgenden Code.

{% if page.my_block %}
  {{ page.my_block }}
{% endif %}
4
kxo

Wenn Ihr Block benutzerdefiniert ist, hat dies für mich funktioniert:

$customblock = \Drupal::service('plugin.manager.block')->createInstance('{id of block here}', []);

Dann könnten Sie es wie folgt aus Ihrem Vorprozess drucken:

if(isset($customblock) && !empty($customblock)) {
  $variables['logo'] = $customblock->build();
}

Wenn Sie Ihren Block erstellt haben, hätten Sie die ID hier festgelegt:

/**
  * Provides a 'Logo' Block.
  *
  * @Block(
  *   id = "logo",
  *   admin_label = @Translation("Logo"),
  *   category = @Translation("Header"),
  * )
  */

Diese Methode verhindert jedoch, dass Kontextlinks angezeigt werden. Um dies zu umgehen, können Sie Folgendes tun:

$Block = \Drupal\block\Entity\Block::load($id);
if(isset($Block) && !empty($Block)) {
  $Block =  \Drupal::entityTypeManager()->getViewBuilder('block')->view($Block);
}

Bitte beachten Sie: Der Block muss in einem Bereich auf der Blocklayout-Seite platziert werden (kann jedoch auf Deaktiviert gesetzt werden) und die $ id entspricht der Instanz dieses Blocks, NICHT dem, was Sie in der .php-Datei definiert haben. Dies kann durch Bewegen des Mauszeigers über eine der Blockverknüpfungen im Blocklayout ermittelt werden.

2

Wenn Sie den Block als Ansicht erstellt haben, können Sie views_embed_view in Ihrer Funktion template_preprocess_page verwenden.

$variables['my_block'] = views_embed_view('view_machine_name', 'block_machine_name');

Unter in der Ansicht und blockieren Sie Computernamen. Der unter admin/structure/views sichtbare Ansichtsname und der Name des Blockcomputers in den erweiterten Einstellungen des jeweiligen Blocks (standardmäßig 'block_1').

0
bluestraggler