Di Drupal 6, saya bisa mengontrol visibilitas blok menggunakan kode PHP dalam konfigurasi UI blok seperti:
<?php return MYMODULE_abc() || MYMODULE_def() ; ?>
Fungsi-fungsi ini mencari node saat ini, taksonomi, dll untuk memutuskan apakah akan menampilkan blok. Opsi PHP ini hilang dalam Drupal 8, tetapi ada $visibility
bidang di BlockBase
. Bisakah saya menggunakan ini untuk secara terprogram mengatur visibilitas saat runtime?
Jawaban:
Cuplikan kode yang berfungsi bagaimana cara menggunakan
hook_block_access()
. Di sini saya mengambil kondisi dari bidang node saat ini:Terima kasih @Insasse untuk berbagi permata berikut di komentar. Untuk blok khusus yang dibuat secara program Anda dapat mengontrol visibilitas langsung dari dalam kelas blok melalui
blockAccess()
:Sumber: Cara Membuat Program secara Blok di Drupal 8
sumber
Kurangnya filter php di Drupal 8, ini tidak akan lagi dimungkinkan dari UI.
Satu-satunya pilihan adalah menggunakan api blok.
hook_block_access adalah canidate terbaik Anda. Dari sana Anda dapat memeriksa
$operation
dan mengembalikan AccessResult berdasarkan kondisi Anda.Sama seperti di UI hanya kali ini menempatkan php ke dalam modul.
sumber
Berikut ini solusi Drupal 8: Blokir Halaman yang Dikecualikan .
sumber
Untuk 8.2.x Anda perlu membuat Plugin Kondisi dan mengimplementasikan ContextProviderInterface .
Lihat contoh dari DO tetapi entah bagaimana sudah ketinggalan zaman (karena BlockEvent dan BlockSubscriberBase dihapus mendukung layanan repositori konteks).
Lebih baik juga menggunakan konsol Drupal untuk menghasilkan plugin:
sumber
untuk memperluas kemungkinan visibilitas blok Anda dapat mencoba tambalan ini:
https://www.drupal.org/project/drupal/issues/923934#comment-12401360
itu memperkenalkan operator konjungsi AND / OR untuk kondisi visibilitas sehingga Anda dapat mengatakan oh saya ingin blok ini terlihat jika itu dari my_content_type ATAU pengguna memiliki peran admin ATAU url dimulai dengan / path / ke / * dll. juga kondisinya dapat dinegasi sehingga Anda dapat mengatur banyak kondisi di mana Anda tidak ingin blok Anda terlihat
juga jika Anda menggunakan modul Drupal Commerce, Anda dapat mencoba yang di atas dengan menginstal https://www.drupal.org/project/commerce_quick_purchase modul. Perhatikan bahwa saat dipasang, modul ini mengekspos fungsi ini untuk semua blok pada sistem walaupun Anda tidak t gunakan blok yang disediakan oleh modul, lihat lebih lanjut
https://github.com/drugan/commerce_quick_purchase#block-visibility
selain itu Anda dapat membuat plugin kondisi Anda sendiri lihat contoh dari modul
https://cgit.drupalcode.org/commerce_quick_purchase/tree/src/Plugin/Condition
sumber