Saya menggunakan hook_node_access()
untuk menolak akses pengguna ke beberapa node berdasarkan kriteria khusus. Namun, saya tidak ingin konten ini muncul dalam tampilan yang mencantumkannya jika pengguna tidak lulus kriteria. Apakah ada cara untuk memiliki pandangan menghargai hook_node_access()
implementasi?
14
hook_node_access()
, ada hal yang harus dilakukan: untuk mengubah kode modul Views.hook_node_access()
implementasi tidak dihormati. Karena "sesuai desain," melaporkan penyelesaian tidak masalah.Jawaban:
Saya punya pertanyaan yang sama beberapa waktu lalu di sini .
hook_node_access
tidak diakui olehviews
ataumenus
. Seharusnya hanya digunakan sebagai garis pertahanan terakhir.Cara yang lebih baik untuk mengontrol akses node adalah melalui
hook_node_access_records
danhook_node_grants
seperti yang dijelaskan di sini dan di sini .sumber
hook_node_access () hanya dipanggil ketika mencoba untuk melihat node penuh. Yang perlu Anda lakukan adalah mengimplementasikan hook_node_access_records () dan hook_node_grants () .
sumber
Tampilan menggunakan SQL menentukan node untuk ditampilkan. Sayangnya, untuk alasan kinerja, tidak mungkin layak bagi Drupal untuk melakukan node_load pada semua kandidat potensial dan kemudian memanggil hook_node_access pada masing-masing dari mereka semua. Bayangkan sebuah tampilan yang menunjukkan ribuan node (terutama ketika menggunakan pager). Jika logika tidak dilakukan dalam SQL maka pager akan memiliki fungsionalitas yang sangat tidak biasa sehingga memaksa Drupal Anda melakukannya seperti yang disebutkan menggunakan catatan akses dalam database Anda.
Membuat access_records adalah pekerjaan yang cukup banyak tetapi akan membuatnya bekerja dengan SQL. Jadi saya sarankan menggunakan modul node_access yang ada untuk menyelesaikan fungsionalitas Anda sedapat mungkin karena mungkin akan diimplementasikan menggunakan catatan akses dan dengan demikian akan bekerja dengan tampilan.
Omong-omong catatan akses disimpan dalam tabel node_access tabel seperti yang terlihat di bawah ini: Melalui komentar untuk setiap kolom Anda bisa mendapatkan pemahaman tentang tujuan mereka. Pikirkan ranah sebagai sistem yang digunakan untuk akses node dan gid sebagai grup dalam ranah. Grup itu dapat memiliki melihat, memperbarui, dan menghapus izin. Secara umum setiap modul node_access mendefinisikan satu atau lebih ranah (terkadang beberapa modul node_access juga dapat bekerja secara paralel). Seorang pengguna memiliki satu atau lebih gid di setiap bidang.
Di Drupal, semua kueri yang memiliki tag "node_access" secara otomatis akan menambahkan beberapa logika khusus. Lihat dokumentasi untuk mempelajari lebih lanjut tentang pemberian tag. Logika khusus ini bergabung dengan tabel "node_access" untuk setiap bidang dan menambahkan kondisi di mana "gid" sama dengan salah satu gids yang diterapkan pada pengguna, pengguna memiliki izin yang sesuai.
Seluruh sistem ini memungkinkan semua permintaan untuk menangani dengan benar node_access, bahkan menghitung permintaan, dll. Ini sangat kuat tetapi memiliki kurva belajar yang lebih tinggi yang hanya dengan hook_node_access sederhana. Kapan pun memungkinkan, menggunakan modul node_access yang ada dapat menghemat seluruh sakit kepala ini.
sumber