Tôi đang triển khai một giải pháp trong Drupal 9, trong đó người dùng chỉ được phép xem các nút thuộc cùng một nhóm của họ. Nếu một nút không thuộc về bất kỳ nhóm nào, thì họ sẽ có thể nhìn thấy nút đó.
Tôi đã sử dụng hook_node_grants()
để chỉ định các khoản trợ cấp phù hợp cho người dùng hiện tại và hook_node_access_records()
để đặt cấp chế độ xem cho mỗi nút, như được đề xuất trong Làm cách nào để lọc chế độ xem theo kết quả của hook_node_access?
Khi truy cập một nút mà người dùng không được phép nhìn thấy, người dùng sẽ gặp lỗi 403, như kết quả mong đợi. Tuy nhiên, trên một chế độ xem, nút vẫn hiển thị.
Như một giải pháp thay thế, tôi có thể thực hiện hook_views_query_alter()
và thêm một điều kiện truy cập, nhưng tôi thích giải pháp chung hơn.
Đây là mã tôi đang sử dụng.
function mymodule_node_access_records(NodeInterface $node) {
if ($node->hasField('field_group') && !empty($term = $node->field_group->getValue())) {
$ hạn = đặt lại ($ hạn);
$grant[] = [
'vương quốc' => 'mymodule_realm',
'gid' => $term['target_id'],
'cấp_view' => 1,
'cấp_cập nhật' => 0,
'cấp_xóa' => 0,
'ưu tiên' => 0,
];
trả lại $grant;
}
}
function mymodule_node_grants(AccountInterface $account) {
$grant = [];
if ($group = checkGroupHelper($account)) {
$grants['mymodule_realm'] = $group;
}
trả lại $grant;
}