Làm cách nào để thêm điều kiện truy cập vào mục menu?


17

Làm cách nào tôi có thể thêm các điều kiện mới lên trên các điều kiện hiện có để xác định xem một mục menu có hiển thị không? Những điều kiện này không nên giới hạn trong cài đặt quyền.

Như một trường hợp sử dụng ví dụ (không nhất thiết là lý do cho câu hỏi này): Giả sử tôi có một loại nội dung mà người dùng chỉ được phép tạo một nút. Tôi có một mục menu để thêm loại nội dung đó. Nhưng nếu người dùng đã tạo một nút thuộc loại nội dung đó, tôi muốn ẩn mục menu. Suy nghĩ đầu tiên của tôi là chạy một truy vấn để kiểm tra sự tồn tại của một nút được tạo bởi người dùng hiện tại thuộc loại nội dung cụ thể. Nếu một cái tồn tại, ẩn mục menu.

Tôi nghĩ rằng loại chức năng này nên đi vào hook_menu_alter()và thêm logic cần thiết ở đó. Nhưng tôi không chắc làm thế nào để làm điều đó mà không bỏ qua các kiểm tra hiện có, như kiểm tra xem người dùng có quyền tạo loại nội dung đó không. Tôi có phải đưa logic đó vào trong điều kiện của mình không? Hoặc tôi có thể thêm vào logic truy cập hiện có mà không ghi đè lên nó?


Chỉnh sửa: Một số người dường như tập trung vào trả lời "làm cách nào để giới hạn người dùng tạo một nút của loại nội dung". Đó không phải là câu hỏi ở đây. Câu hỏi là làm thế nào để tôi thêm các điều kiện truy cập tùy chỉnh vào một mục menu.

Câu trả lời:


11

Những gì bạn cần làm là thêm cuộc gọi lại của bạn thông qua hook_menu_alter (), và sau đó bên trong cuộc gọi lại của bạn, bạn chỉ cần thực hiện logic của mình sau đó trả lại dữ liệu qua cuộc gọi lại ban đầu.

Để chắc chắn rằng bạn không ghi đè bất kỳ thay đổi hook_menu_alter () nào khác, bạn nên chuyển cuộc gọi lại trước đó cho cuộc gọi lại của mình thông qua đối số truy cập.

Đây là tất cả lý thuyết, nhưng mã nên đi như thế này:

MYMODULE_menu_alter(&$items) {
  $items['menu']['access arguments'] = array_merge(array($items['menu']['access callback']), $item['menu']['access arguments']);
  $items['menu']['access callback'] = 'MYMODULE_access_callback';
}

MYMODULE_access_callback() {
  $args = func_get_args();

  // Do Stuff.
  if ($something == FALSE) {
    return FALSE;
  }

  $function = array_shift($args);
  return call_user_func_array($function, $args);
}

Vì vậy, nếu tôi chỉ định một chức năng gọi lại truy cập mới, điều đó có chắc chắn ghi đè lên cuộc gọi lại ban đầu không?
Chaulky

Có, bạn chỉ có thể có một cuộc gọi lại truy cập cho mỗi mục menu, do đó hãy chắc chắn rằng bạn quay lại cuộc gọi lại ban đầu. Tôi đã thấy một mô-đun làm một cái gì đó như thế này, một trong những mô-đun nặng quyền, không thể nhớ cái nào.
Giải mã

mảng_shift trên $ args đang làm gì?
Chaulky

Nó lấy ra đối số đầu tiên từ 'đối số truy cập', mà chúng ta đã tạo ra 'cuộc gọi lại truy cập' cũ. Vì vậy, nếu cuộc gọi lại cũ là 'MYMODULE2_access_callback', đó là điều mà mảng_shift đang quay trở lại. Nó cũng loại bỏ nó khỏi mảng để chúng ta chỉ truyền các đối số mà cuộc gọi lại đang mong đợi.
Giải mã

1

Đáp lại các ý kiến ​​trên, giải pháp trong D7 sẽ là sử dụng:

/**
 * Implements hook_node_access().
 */
function mymodule_node_access($node, $op, $account) {
  $type = is_string($node) ? $node : $node->type;

  if ($op == 'create' && $type == 'mynodetype' && db_query("SELECT 1 FROM {node} WHERE type = :type AND uid = :uid", array(':type' => $type, ':uid' => $account->uid))->fetchField()) {
    // If the user has already created a node of a specific type, they cannot
    // create any more.
    return NODE_ACCESS_DENY;
  }

  // Otherwise do not affect any node access.
  return NODE_ACCESS_IGNORE;
}

1
Điều này dường như không có gì để làm với các mục menu. Tôi chưa quá quen thuộc với D7, nhưng có vẻ như điều này đặc trưng cho việc tạo nút. Câu hỏi tập trung vào các mục menu nói chung.
Chaulky

Ồ tôi hiểu rồi ... đây là câu trả lời cho nhận xét của tôi hỏi thêm chi tiết về giải pháp D7 của bạn được đề xuất trong câu trả lời của bạn chỉ ra mô-đun Giới hạn Node. Vẫn còn một chút lạc đề, nhưng đánh giá cao.
Chaulky

Bởi vì khả năng hiển thị của các liên kết tạo mynodetype được điều khiển bởi hàm node_access (), sẽ gọi hook này trong Drupal 7.
Dave Reid

1

Bạn đang tìm kiếm mô-đun API Truy cập Menu Chuỗi .

API truy cập menu chuỗi cho phép mô-đun của bạn xâu chuỗi các chức năng gọi lại truy cập menu của chính nó vào các mục bộ định tuyến trình đơn của các mô-đun khác.

Có ít nhất một ví dụ trên Drupal Stack Exchange về cách sử dụng nó.


-1

Một tùy chọn sẽ là tạo một vai trò mới đã tạo quyền cho nội dung cho loại nội dung của bạn. Sau khi người dùng tạo một nút thuộc loại đó, hãy loại bỏ vai trò đó và họ sẽ không thể tạo thêm nữa.


-1

Có lẽ bạn nên thử mô-đun Node Giới hạn .

Từ trang dự án:

Mô-đun Node Giới hạn cho phép quản trị viên hạn chế số lượng nút của một loại cụ thể mà vai trò hoặc người dùng có thể tạo. Ví dụ: nếu một trang web có vai trò "Nhà quảng cáo" có thể tạo các nút "quảng cáo", thì quản trị viên giới hạn nút có thể giới hạn tất cả người dùng trong vai trò đó ở một số nút cụ thể. Ông cũng có thể hạn chế người dùng trên cơ sở mỗi người dùng.


Giới hạn ở một nút chỉ là trường hợp sử dụng ví dụ để thêm phương thức gọi lại truy cập tùy chỉnh. Ngoài ra, Node Giới hạn không xóa mục menu, nó chỉ ngăn người dùng thêm một nút khác của loại nội dung đó.
Chaulky

Điều đó đúng khi tôi xem lại mô tả mô-đun một lần nữa. Nếu điều này xảy ra trên Drupal 7 thì thực sự sẽ dễ dàng vì bạn có thể sử dụng hook_node_access ($ nút, 'tạo', $ tài khoản) sẽ ảnh hưởng đến khả năng hiển thị của chính liên kết loại nút tạo.
Dave Reid

Nó thật thú vị. Tôi có kế hoạch chuyển đến D7 sớm. bạn có phiền khi viết nó chi tiết hơn và đăng câu trả lời không?
Chaulky

Phiên bản D7 của câu trả lời được đăng.
Dave Reid
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.