Bagaimana cara saya menempatkan blok secara terprogram?

10

Dari UI Anda dapat menambahkan blok di suatu wilayah dengan cara itu:

  1. Pergi ke Admin -> Struktur -> Tata letak blok (/ admin / struktur / blok).
  2. Klik tombol "Blok tempat" di sebelah nama wilayah.

Saya ingin melakukan hal yang sama tetapi secara terprogram. Bagaimana cara saya menambahkan blok yang ada ke suatu daerah dan menyimpannya? Blok ini kemudian harus ditampilkan di wilayah itu dan tersedia di halaman Tata letak blok .

pengguna3554770
sumber
Setelah membuat blok, Anda dapat mengatur ulang posisi blok dari: site_name / admin / structure / block
Crazyrubixfan
Saya menganggap Anda salah mengetik "tetapkan blok ke suatu wilayah".
cilefen
@IcecreamJelly apa yang saya coba lakukan adalah melakukan ini secara terprogram. cilefen, ya itu yang saya maksud% -)
jmzea
@ShawnConn terima kasih, itu mirip, tetapi tidak persis sama. Saya telah menemukan jawabannya di tempat lain.
jmzea

Jawaban:

9

Untuk menyediakan blok plugin, Anda dapat membuat array pengaturan dan mengirimkannya \Drupal\block\Entity\Block::create()untuk membuat objek Block dan menyimpan instance.

Misalnya jika Anda ingin menambahkan blok Devel Execute PHP ke tema Tujuh:

$values = array(
  // A unique ID for the block instance.
  'id' => 'devel_execute_php_1',
  // The plugin block id as defined in the class.
  'plugin' => 'devel_execute_php',
  // The machine name of the theme region.
  'region' => 'content',
  'settings' => array(
    'label' => 'Execute PHP',
  ),
  // The machine name of the theme.  
  'theme' => 'seven',
  'visibility' => array(),
  'weight' => 100,
);
$block = \Drupal\block\Entity\Block::create($values);
$block->save();
Shawn Conn
sumber
Hai, saya butuh bantuan. Saya telah membuat blok khusus menggunakan UI dan ingin menempatkan di wilayah footer secara terprogram untuk tujuan pengujian. Saya tidak tahu bagaimana cara mendapatkan plugin dari blok khusus yang dibuat oleh UI .. terima kasih
Mudassar Ali
Tanyakan ini sebagai pertanyaan lain. Komentar bukan untuk mengajukan pertanyaan.
Shawn Conn
sudah ada di sana. drupal.stackexchange.com/questions/207042/...
Mudassar Ali
Apa id di sini? apakah sama dengan nama blok?
Crazyrubixfan
@RubberDuckIsKing Saya yakin Anda dapat memberi nama idapa pun yang Anda inginkan asalkan unik. Misalnya, Anda mungkin ingin memulainya dengan nama modulnya.
Parag
7

Anda dapat menggunakan modul tweak ranting :

Modul Twig Tweak menyediakan ekstensi Twig dengan beberapa fungsi dan filter bermanfaat yang dapat meningkatkan pengalaman pengembang.

Dan kemudian pada wilayah templat ranting Anda:

{{ drupal_block('block_id') }}
rpayanm
sumber
Masalah dengan solusi ini adalah bahwa ranting tweak masih mengharuskan Anda untuk menempatkan blok lalu menonaktifkannya.
Lexicant
6

Setiap instance dari blok (yang "block jenis", konfigurasi dan penempatan) adalah entitas config: \Drupal\block\Entity\Block. Jadi yang harus Anda lakukan adalah membuat instance baru dari entitas ini dengan detail yang benar dan Anda selesai.

Ini bisa dilakukan tetapi sangat rumit, Anda perlu memahami sistem plugin, memblokir sistem plugin, dan banyak lagi.

Anda dapat melihatnya \Drupal\block\BlockForm::submitFormuntuk merasakan ini atau \Drupal\simpletest\BlockCreationTrait::placeBlock. Anda mungkin ingin memikirkan jika ini adalah sesuatu yang benar-benar Anda butuhkan, visibilitas blok cukup rumit.

googletorp
sumber
4
Selain mungkin dari kondisi visibilitas, saya tidak berpikir itu rumit. \ Drupal \ simpletest \ BlockCreationTrait :: placeBlock () mungkin merupakan contoh yang lebih baik untuk dilihat, Anda juga dapat mengimpor beberapa file konfigurasi yang diekspor.
Berdir
@Berdir Terima kasih atas tautan ke sifat pengujian, menambahkannya. Karena Drupal 8 masih sangat muda, banyak orang tidak tahu banyak tentang sistem plugin dan dokumentasinya dapat menggunakan lebih banyak case use dll, yang dapat membuat banyak devs kesulitan bekerja dengannya.
googletorp
Felix Eve memiliki jawaban terbaik. Ini bukan kompleks gila.
kratos
@ kratos Jawaban yang diberikan Felix sebenarnya tidak menyelesaikan pertanyaan tentang bagaimana cara menempatkan blok "secara terprogram", tetapi sebaliknya menggunakan file konfigurasi. Konfigurasi hanya dapat diimpor melalui drush, antarmuka sinkronisasi konfigurasi atau pemasangan modul. Jika itu perlu terjadi, selama runtime, fx posting save dari jenis node frontpage bagian dll, akan sia-sia untuk menggunakan strategi ini :)
googletorp
4

Saya baru belajar D8 tetapi sepertinya saya telah menemukan cara yang lebih mudah untuk menempatkan blok secara terprogram (Tampaknya cukup menakutkan setelah membaca jawaban googletorp!)

Ketika saya mengaktifkan modul khusus saya yang mendefinisikan blok saya ingin blok itu secara otomatis ditempatkan di wilayah yang benar. Langkah-langkah yang saya gunakan untuk mencapai ini adalah:

  1. Aktifkan modul dan tempatkan blok menggunakan UI di /admin/structure/block
  2. Buka halaman ekspor konfigurasi Item Tunggal di admin/config/development/configuration/single/export
  3. Pilih blok jenis konfigurasi dan untuk nama konfigurasi pilih blok yang baru saja Anda tempatkan menggunakan UI dan kemudian salin kode yang dihasilkan.
  4. Dalam modul Anda buat folder /config/install/
  5. Di bawah textarea kode yang dihasilkan itu memberi tahu Anda nama file yang perlu Anda gunakan. Buat file ini di /config/installdirektori dan salin kode di sana.
  6. Sekarang ketika Anda menghapus modul Anda dan kemudian mengaktifkannya kembali, blok itu akan secara otomatis ditempatkan.
Felix Eve
sumber
tidakkah Anda harus menghapus UUID agar ini berfungsi untuk pengembang atau lingkungan lain?
powpow12
Yap - menghapus UUID akan menjadi ide yang bagus.
Felix Eve
Anda juga dapat menggunakan konsol Drupal, yang menangani mengotomatisasi beberapa tugas ini: hechoendrupal.gitbooks.io/drupal-console/content/en/commands/…
Beau
2

Contoh di atas cukup dekat tetapi masih belum benar. Idenya adalah bahwa Anda harus membuat id Anda sendiri dari contoh blok (dalam kasus saya devel_execute_php_1112 (mungkin karena saya mencoba membuatnya bekerja 1112 kali, itu akan tetap menjadi misteri)) dan kemudian id blok yang sebenarnya (salah satu yang dideklarasikan untuk blok khusus dalam anotasi) dan tema. Kemudian atur saja wilayah dan Anda baik untuk pergi. Membuat instance blok di bawah wilayah yang diinginkan.

$blockEntityManager = \Drupal::service('entity.manager')->getStorage('block');
$block = $blockEntityManager->create(
  array(
      'id'=> 'devel_execute_php_1112',
      'plugin' => 'devel_execute_php',
      'theme' => 'seven'
  )
);
$block->setRegion('content');
$block->save();

sunting1: Saya benar-benar memeriksa kemudian komentar di atas - dan itu benar. Tidak jelas bahwa id adalah sesuatu yang harus Anda buat. Sebagai penukaran untuk komentar lumpuh saya, saya akan memposting solusi tentang cara membuat contoh blok entitas blok kustom:

$blockEntityManager = \Drupal::service('entity.manager')->getStorage('block');
$block = $blockEntityManager->create(
  array(
      'id'=> 'ggggggggsssssss',
      'plugin' => 'block_content:79d53b4e-9e60-4f97-befc-101da919bb7a',
      'theme' => 'visitb_he_theme'
  )
);
$block->setRegion('content');

pada dasarnya sama tetapi untuk plugin Anda menulis block_content: uuid_of_custom_block_entity_instance

Nikolay Borisov
sumber