Làm thế nào để tôi lập trình gán quyền truy cập vào một khối?


10

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ó?


Bạn có thể mở rộng câu hỏi của bạn và hiển thị mã của bạn?
Triskelion

Trong chính mã khối, bạn có thể tra cứu người dùng (người dùng $ toàn cầu) và kiểm tra vai trò của họ bằng phương thức trong liên kết. bywombats.com/blog/ryan/10-25-2007/ Mạnh
user6614

Mô-đun Bảng có một số điều khiển truy cập tuyệt vời bằng cách sử dụng các vùng, không phải khối.
Louis

Câu trả lời:


10

Đặ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.

ảnh chụp màn hình

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.


Vâng, tôi rõ ràng sẽ phải đi với câu trả lời này là câu trả lời thích hợp nhất. Cảm ơn bạn đã giải thích chi tiết vì nó thực sự giúp hiểu cách thức các khối Drupal hoạt động đằng sau hậu trường.
user5013

1

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',
   )

Đây có vẻ là cách tốt nhất để thực hiện điều này bằng cách sử dụng phương pháp lập trình khi bạn xác định vai trò nào có quyền truy cập và sau đó để Drupal xác định xem người dùng có thể truy cập hay không. Tôi đã bỏ lỡ bất kỳ nhược điểm của phương pháp này?
user5013

Nếu bạn phải làm điều đó theo chương trình, có. Không có nhược điểm. Tuy nhiên, tôi cho rằng sẽ phải có một trường hợp sử dụng rất tốt chống lại việc đơn giản là đi tới / admin / architecture / block và gán vai trò cho khối.
Triskelion

Ca sử dụng sẽ được tự động thiết lập cho người dùng để họ không phải làm vậy. Nghiêm khắc một vấn đề tiện lợi. Sau khi được đặt, họ có thể thay đổi nó thành những gì họ muốn nếu nó không phù hợp với nhu cầu cụ thể của họ.
user5013

1
Điều này không hoạt động; xem câu trả lời của tôi cho lý do tại sao nó không.
kiamlaluno

0

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.


Có, tôi nên nghĩ về việc sử dụng user_access. Hoàn toàn trượt tâm trí của tôi - D'oh. Tôi nghĩ về việc sử dụng quyền truy cập vai trò nhưng có lẽ quyền truy cập có thể là một cách tốt hơn để đi.
user5013

0

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();

0

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']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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.