Tôi đã tạo một khối theo lập trình nhưng tôi không biết làm thế nào tôi có thể gán quyền truy cập theo chương trình. Làm thế nào tôi có thể đạt được nó?
Tôi đã tạo một khối theo lập trình nhưng tôi không biết làm thế nào tôi có thể gán quyền truy cập theo chương trình. Làm thế nào tôi có thể đạt được nó?
Câu trả lời:
Đặt mảng "vai trò" trong mảng được trả về từ hook_block_info()
không hoạt động vì:
Các vai trò được phép nhìn thấy một khối và được đặt trong giao diện người dùng, được lưu từ block_admin_configure_submit () trong bảng "block_role"
$query = db_insert('block_role')->fields(array('rid', 'module', 'delta'));
foreach (array_filter($form_state['values']['roles']) as $rid) {
$query->values(array(
'rid' => $rid,
'module' => $form_state['values']['module'],
'delta' => $form_state['values']['delta'],
));
}
$query->execute();
Mã quyết định khối nào sẽ được hiển thị cho người dùng hiện đang đăng nhập được chứa trong block_block_list_alter () , đây là một triển khai của hook_block_list_alter () và chỉ sử dụng nội dung của bảng đó
$result = db_query('SELECT module, delta, rid FROM {block_role}');
foreach ($result as $record) {
$block_roles[$record->module][$record->delta][] = $record->rid;
}
foreach ($blocks as $key => $block) {
if (!isset($block->theme) || !isset($block->status) || $block->theme != $theme_key || $block->status != 1) {
// This block was added by a contrib module, leave it in the list.
continue;
}
// If a block has no roles associated, it is displayed for every role.
// For blocks with roles associated, if none of the user's roles matches
// the settings from this block, remove it from the block list.
if (isset($block_roles[$block->module][$block->delta]) && !array_intersect($block_roles[$block->module][$block->delta], array_keys($user->roles))) {
// No match.
unset($blocks[$key]);
continue;
}
// …
}
Không có chức năng Drupal nào khác kiểm tra thuộc tính vai trò trong dữ liệu được trả về hook_block_info()
, cũng như nội dung của bảng "block_role" được hợp nhất với nội dung được trả về từ các hook_block_info()
triển khai.
Bạn có thể xác minh người dùng có vai trò bắt buộc để xem khối hook_block_view()
, nhưng tại thời điểm đó, Drupal đã kết xuất khối; điều đó có nghĩa là người dùng vẫn sẽ thấy tiêu đề khối, nếu một cái đã được đặt.
Những gì bạn có thể làm là triển khai hook_block_list_alter()
để xóa thông tin về khối đó khi người dùng không có vai trò bắt buộc.
Để tránh nhầm lẫn cho người dùng quản lý các khối, tôi cũng sẽ thay đổi biểu mẫu được sử dụng để chỉnh sửa một khối và vô hiệu hóa trường biểu mẫu được sử dụng để đặt vai trò nào có thể thấy khối đó, vì mô-đun triển khai nó sẽ sử dụng danh sách riêng của nó về vai trò; mã tối thiểu ít nhất sẽ hiển thị một thông báo về các cài đặt vai trò không có bất kỳ ảnh hưởng nào, nhưng tôi cũng sẽ vô hiệu hóa các thành phần biểu mẫu cho các cài đặt vai trò.
Vì mô-đun Khối đã hiển thị các trường biểu mẫu để chọn vai trò nào nhìn thấy một khối, bạn cũng có thể chỉ cần đặt mặc định cho khối của mình và để người dùng quản trị viên thay đổi nếu cần.
Khi kiểm tra các vai trò mà người dùng có so với kiểm tra các quyền mà người dùng có, quyền cuối cùng được ưu tiên, đặc biệt khi phương án thay thế sẽ mã hóa cứng một danh sách các vai trò trong mô-đun.
Như được hiển thị từ mô-đun Khối, sử dụng quyền không phải là sự thay thế duy nhất: Một mô-đun có thể có cài đặt để quyết định vai trò nào được phép xem một cái gì đó.
Rõ ràng, không phải lúc nào cũng có giá trị để thiết lập vai trò nào được phép làm điều gì đó. Tôi cũng tưởng tượng người dùng quản trị viên có ý nghĩa gì nếu 10 mô-đun sẽ có cài đặt riêng cho vai trò nào được phép làm gì đó, thay vì sử dụng quyền và cho phép người dùng quản trị viên sử dụng một trang để đặt chúng.
Trong hook_block_info của bạn, bạn có thể thử một cái gì đó như:
$blocks['myblock'] = array(
...
'roles' => array(
'administrator' => '3',
'authenticated user' => '2',
)
Giả sử rằng bạn đang tự tạo các khối bằng hook_block_info () thì bạn có thể thực hiện user_access () trong hàm hook_block_view () của mình. Kiểm tra các tài liệu api vì họ có một ví dụ về điều này.
Không thể có trong hook_block_info (), nhưng bạn có thể sử dụng truy vấn này để đạt được điều này. Thay đổi MODULE_NAME, BLOCK_DELTA và RID tương ứng
$query = db_insert('block_role')
->fields(array(
'module' => 'MODULE_NAME',
'delta' => 'BLOCK_DELTA',
'rid' => 2, // Authenticated User
))
->execute();
Trong hook_block_view, bạn có thể sử dụng global $user
để lấy thông tin về người dùng, sau đó dựa trên vai trò của người sử dụng bạn có thể gán khác nhau block['subject']
và block['content']
thậm chí không chỉ định bất kỳ chủ đề và nội dung cho block nếu nó sẽ là vô hình cho vai trò đó. đây là một ví dụ :
function ModuleNAME_block_view($delta = '') {
switch ($delta) {
case 'Your_BLOCK' :
Global $user;
if($user->uid != '0') {
$block['subject'] = 'SUBJECT';
$block['content'] = 'SOME CONTENT OR A FUNCTION FOR BLOCK';
}
break;
}
return $block;
}
sử dụng mã này người dùng được xác thực (không phải khách) sẽ hiển thị khối cho người dùng được xác thực.