Istnieją dwa rodzaje bloków, a metoda renderowania tych dwóch jest nieco inna:
Bloki treści
Bloki treści to bloki tworzone w interfejsie. Przypominają one konfigurowalne struktury danych węzłów z polami itp. Jeśli chcesz renderować jedną z nich, możesz zrobić to, co normalnie zrobiłbyś z jednostkami, załadować je i renderować za pomocą kreatora widoków:
$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;
Bloki wtyczek
Bloki mogą być również wtyczkami zdefiniowanymi w różnych modułach. Przykładem może być blok nawigacyjny. Jeśli chcesz je wyrenderować, musisz użyć menedżera wtyczek blokowych.
$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;
Konfiguruj encje
Wspólne dla tych dwóch typów są bloki. Po wstawieniu ich do regionu utworzysz element konfiguracji, który ma wszystkie ustawienia bloku. W niektórych przypadkach bardziej użyteczna będzie obsługa encji konfiguracyjnych. Ponieważ ten sam blok może być umieszczony w wielu regionach z inną konfiguracją i może być trudniejszy przy użyciu jednostek konfiguracji bloku. Fajną rzeczą jest to, że możesz chcieć renderować blok z określoną konfiguracją, złą rzeczą jest to, że identyfikatory konfiguracji mogą się zmieniać przez bałagan w interfejsie, więc kod może nie działać po umożliwieniu użytkownikom korzystania z interfejsu bloku.
$block = \Drupal\block\Entity\Block::load('config.id');
$render = \Drupal::entityTypeManager()
->getViewBuilder('block')
->view($block);
return $render;