Ada dua jenis blok, dan metode untuk merender keduanya agak berbeda:
Blok Konten
Blok konten adalah blok yang Anda buat di antarmuka. Mereka seperti struktur data yang dapat dikonfigurasi node, dengan bidang, dll. Jika Anda ingin merender salah satunya, Anda dapat melakukan apa yang biasanya Anda lakukan dengan entitas, memuatnya dan merendernya dengan pembuat tampilan:
$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;
Blok plugin
Blok juga bisa berupa plugin, didefinisikan dalam berbagai modul. Contohnya bisa menjadi blok remah roti. Jika Anda ingin merendernya, Anda harus menggunakan blok plugin manager.
$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;
Entitas konfigurasi
Dibagi untuk dua jenis adalah blok, adalah bahwa begitu Anda memasukkannya ke suatu wilayah, Anda akan membuat entitas konfigurasi yang memiliki semua pengaturan untuk blok. Dalam beberapa kasus akan lebih berguna menangani entitas konfigurasi. Karena blok yang sama dapat ditempatkan di beberapa wilayah dengan dan dengan konfigurasi yang berbeda, itu bisa menjadi lebih rumit menggunakan entitas konfigurasi blok. Yang menyenangkan adalah Anda mungkin ingin membuat blok dengan konfigurasi tertentu, yang buruk adalah bahwa konfigurasi bisa berubah dengan mengacaukan antarmuka, sehingga kode mungkin berakhir tidak berfungsi setelah membiarkan pengguna menggunakan antarmuka blok.
$block = \Drupal\block\Entity\Block::load('config.id');
$render = \Drupal::entityTypeManager()
->getViewBuilder('block')
->view($block);
return $render;
Untuk menampilkan hanya blok Anda di template Anda dengan preprocess, cara terbaik adalah
Dan di Anda
page.html.twig
ataunode.html.twig
atauxxx.html.twig
gunakan variabel My_region Anda seperti ini:Dan dalam array yang dapat di render (modul khusus) dengan contoh menjadi kustom kontroler dalam konten ():
Menggunakan
tidak berguna karena Drupal sudah menganggap render di D8 dan ini sudah usang . Anda harus menggunakannyadrupal_render
\Drupal::service('renderer')->renderRoot()
sebagai gantinya.Agak berat, lebih baik menggunakan sistem area maksimum dan tidak menambahkan blok beban dari preproses. Dalam hal menggunakan pengontrol di modul Anda, ini sepertinya penggunaan yang dibenarkan.
sumber
element-content
properti dalam array render. Apakah Anda tahu di mana itu didokumentasikan?\Drupal\block\Entity\Block::load
tidak mengembalikan blok sepanjang waktu. Ini hanya mengembalikan sesuatu jika blok I memuat ditempatkan dalam tampilan di tata letak blok . Jika tidak ditempatkan, ia mengembalikan null.\Drupal::entityTypeManager()->getViewBuilder('block')->view($block);
Selain jawaban teratas ... Jika Anda ingin membuat blok dari tampilan, Anda mungkin harus melakukan hal-hal yang sedikit berbeda.
(nama tampilan misalnya -> blok_1)
Karena kita akan meneruskannya ke ranting, kita tidak perlu me-render (menggunakan layanan render).
Jadi Anda bisa meneruskannya sebagai variabel ke ranting (untuk contoh ini, ini adalah kembalinya Controller):
dalam modul Anda, Anda memerlukan hook_theme () untuk variabel Anda:
Dan akhirnya di template ranting Anda:
sumber
Saya perlu mendapatkan HTML blok khusus dan menggunakannya:
sumber
__toString()
.sumber
drupal_render
atau layanan render.drupal_render
dihapus tetapi mempertahankan render array dengan konten yang diberikan cukup buruk, Anda harus kembali$block_content
, render array dapat diubah sebelum render yang sebenarnya dan Anda harus membiarkan Drupal melakukan rendering sebanyak mungkin, atau melakukannya sendiri.Pada dasarnya, ada dua jenis render.
Ketika ada contoh yang ada dari blok dalam tata letak. blok dapat dirender dalam ranting menggunakan preprocess sebagai
$ block = Blok :: load ('BLOCK_ID'); $ variabel ['social_links'] = \ Drupal :: entityTypeManager () -> getViewBuilder ('block') -> view ($ block);
Tidak ada instance atau konfigurasi untuk blok. Kemudian di preprocessor, kita perlu membuat instance, membangun blok dan kemudian merendernya
$ block_manager = \ Drupal :: service ('plugin.manager.block'); $ config = []; $ plugin_block = $ block_manager-> createInstance ('farmjournal_social_sharing', $ config); $ render = $ plugin_block-> build (); $ variabel ['farmjournal_social_sharing'] = render ($ render);
sumber
Sepertinya ini berfungsi untuk blok plugin ..
sumber
Anda mendapatkan blok keluaran:
Dan kemudian Anda dapat mengembalikan output dengan berbagai cara:
atau:
sumber
\Drupal::service ('renderer')->render ($block_content)
dapat dilakukan karenadrupal_render ($block_content)
Namun yang terakhir ini ditinggalkan dalam Drupal 8.drupal_render
atau layanan render.drupal_render
dihapus tetapi mempertahankan render array dengan konten yang diberikan cukup buruk, Anda harus kembali$block_content
, render array dapat diubah sebelum render yang sebenarnya dan Anda harus membiarkan Drupal melakukan rendering sebanyak mungkin, atau melakukannya sendiri. Apa yang Anda kembalikan harus dirender lagi, yang menjadikan rendering yang sebenarnya tidak bergunaBerdasarkan penelitian saya, Anda dapat mendasarkan kode dari Cara membuat blok secara program di drupal 8 . Anda juga bisa berubah
menjadi sesuatu yang sederhana seperti:
untuk melampirkannya misalnya ke variabel pengembalian halaman.
sumber
drupal_render
atau layanan render.drupal_render
dihapus tetapi mempertahankan render array dengan konten yang diberikan cukup buruk, Anda harus kembali$block_content
, render array dapat diubah sebelum render yang sebenarnya dan Anda harus membiarkan Drupal melakukan rendering sebanyak mungkin, atau melakukannya sendiri.