it-swarm.com.de

Blockieren Sie programmgesteuert in Drupal 8 gibt 0 zurück

Ich erstelle einen Block bei /admin/structure/block/block-content und ich möchte es programmgesteuert in unseren benutzerdefinierten Vorlagendateien rendern. Was ich getan habe ist

function hook_preprocess_page(&$vars) {

    $block = \Drupal\block_content\Entity\BlockContent::load(2);
    $vars['contact-us-info-block']= \Drupal::entityTypeManager()->getViewBuilder('block_content')->view($block);
    //kint( ($vars['contact-us-info-block']));
    //kint( drupal_render($vars['contact-us-info-block']));
}

und in der Seitenvorlagendatei versuche ich

<p>{{ contact-us-info-block }} </p>

aber ich sehe nur eine "0" in der Ausgabe.

wenn ich benutze

$vars['contact-us-info-block'] = drupal_render($vars['contact-us-info-block']);

alles ist Ok aber ich finde heraus, dass drupal_render in Drupal 8) veraltet ist. Wo liegt das Problem und wie kann ich einen Block in der Seitenvorlage programmgesteuert rendern?

3
Yusef

Für die Anzeige nur Ihres Blocks in Ihren Vorlagen mit Vorverarbeitung ist der beste Weg

$block = Block::load('my_block_id');
$variables['My_region'] = \Drupal::entityManager()
      ->getViewBuilder('block')
      ->view($block);

Und in Ihrer page.html.twig oder node.html.twig oder xxx.html.twig verwenden Sie Ihre Variable My_region wie folgt:

{% if page.My_region %}
    {{ page.My_region }}
{% endif %}

Und in einem zerlegbaren Array (benutzerdefiniertes Modul), beispielsweise in einem in content () benutzerdefinierten Controller:

public function content() {
    $block = Block::load('my_block_id');
    $block_content = \Drupal::entityManager()
      ->getViewBuilder('block')
      ->view($block);

          return array(
            '#type' => 'container',
            '#attributes' => array(
            'class' => array("Myclass"),
          ),
           "element-content" => $block_content,
           '#weight' => 0,
  );
}

drupal_render ist nicht nützlichl drupal nimmt das Rendern bereits in D8 an und dies ist veraltet ( https://api.drupal.org/api/drupal/core!includes!common.inc)/function/drupal_render/8 )

es ist ein bisschen schwer, es ist besser, das Maximum-Area-System zu verwenden und fügt keinen Lastblock aus dem Vorprozess hinzu. Bei Verwendung eines Controllers in Ihren Modulen scheint dies eine berechtigte Verwendung zu sein.

1
Sanjay

Siehe Thema: https://drupaldeveloper.in/codelet/drupal8-set-block-region-programmatisch

Sie fügen Block korrekt hinzu und zeigen ihn korrekt an, haben jedoch einige Fehler in Ihrem Code.

Der erste Fehler beim Laden des Blocks:

$block = \Drupal\block_content\Entity\BlockContent::load(2);

Haben Sie einen Block mit der ID "2"? Soweit ich weiß, haben Sie einen Block mit der ID "block_content" und müssen diesen Block laden.

Danach müssen Sie den Variablen einen Block hinzufügen, aber Sie haben einen Fehler in der Methode getViewBuilder () gemacht. Sie müssen 'block' und nicht 'block_content' setzen.

Außerdem müssen Sie drupal_render nicht verwenden. Der endgültige richtige Code muss also der nächste sein:

function hook_preprocess_page(&$vars) {

    $block = \Drupal\block_content\Entity\BlockContent::load('block_content');
    $vars['contact-us-info-block']= \Drupal::entityTypeManager()->getViewBuilder('block')->view($block);
}
1
Vadim Sudarikov