Tôi đang sử dụng mô-đun Content Access với Drupal 7. khi tôi hạn chế quyền truy cập nút từ một vai trò cụ thể, nó cũng ẩn liên kết trong menu.
Có cách nào để hiển thị các liên kết hạn chế trong menu chính?
Tôi đang sử dụng mô-đun Content Access với Drupal 7. khi tôi hạn chế quyền truy cập nút từ một vai trò cụ thể, nó cũng ẩn liên kết trong menu.
Có cách nào để hiển thị các liên kết hạn chế trong menu chính?
Câu trả lời:
Mục đích chính của hệ thống nội dung truy cập là kiểm soát những gì mọi người dùng có thể nhìn thấy và tránh mọi vấn đề bảo mật có thể xảy ra. Đây là hành vi mong muốn và hầu như mọi mô-đun hoặc ApI chung đều sử dụng nó, vì vậy bạn sẽ không tìm thấy giải pháp mặc định cho việc này.
Tôi đã ở trong tình huống tương tự và giải pháp duy nhất tôi tìm thấy là tạo một mô-đun tùy chỉnh và, trong trường hợp của tôi, truy vấn trực tiếp vào bảng menu để có được tất cả các yếu tố tôi muốn và tự kiểm tra các quyền để hiển thị một liên kết hoặc đơn giản là tiêu đề của nội dung khi người dùng không có quyền xem nội dung đó.
Tôi đã làm điều này thông qua mô-đun tùy chỉnh:
function mymodule_form_menu_edit_item_alter(&$form, &$form_state, $form_id) {
if ($form_state['build_info']['args'][0] == 'edit') {
$item = $form_state['build_info']['args'][1];
$form['ignore_access_roles'] = array(
'#type' => 'checkboxes',
'#multiple' => TRUE,
'#title' => t("Ignore access"),
'#options' => user_roles(),
'#description' => t("If a user with one of the selected roles has no access to the menu item's path, the menu item is <strong>not</strong> hidden."),
'#default_value' => empty($item['options']['ignore_access_roles']) ? array() : $item['options']['ignore_access_roles'],
);
$form['#validate'][] = 'mymodule_form_menu_edit_item_validate';
}
}
function mymodule_form_menu_edit_item_validate(&$form, &$form_state) {
if (isset($form_state['values']['ignore_access_roles'])) {
$form_state['values']['options']['ignore_access_roles'] = $form_state['values']['ignore_access_roles'];
$form_state['values']['options']['alter'] = TRUE;
}
}
function mymodule_translated_menu_link_alter(&$link, $map) {
if (!empty($link['options']['ignore_access_roles']) && empty($link['access'])) {
global $user;
// Get role ids for which the ignore access option applies.
$rids = array_values($link['options']['ignore_access_roles']);
$matching_rids = array_intersect(array_keys($user->roles), $rids);
if (!empty($matching_rids)) {
// User has one of the specified roles: override menu link access.
$link['access'] = TRUE;
// Localize. This must be done because it is only done for links with
// access TRUE in _menu_link_translate.
_menu_item_localize($link, $map, TRUE);
}
}
}
Tôi khá chắc chắn rằng bạn sẽ phải viết một mô-đun tùy chỉnh để đối phó với điều này. Đây là ý tưởng của tôi: thư giãn các hạn chế Truy cập Nội dung, tức là cho phép người dùng xem nội dung của bạn. Sau đó, mô-đun tùy chỉnh của bạn phải triển khai hook_node_load () và xuất ra phản hồi 403 HTTP khi tải các nút mà người dùng của bạn không nên thấy. Ngoài ra hook_ allow () nên được triển khai, do đó bạn sẽ có thể định cấu hình quyền truy cập dễ dàng tại trang quyền.
Dưới đây là một ví dụ nhanh về việc ẩn toàn bộ nút và lọc theo loại nội dung và quyền:
function mymodule_permission() {
return array('access reserved content');
}
function mymodule_node_load($nodes, $types) {
if (in_array('my_reserved_content_type', $types)) {
if (!user_access('access reserved content')) {
drupal_access_denied();
}
}
}
Hoặc bạn có thể ẩn một số trường nút, thay vì trả về 403. Nhưng điều này không được khuyến khích theo tài liệu API cho hook_node_load ()
Bạn có thể sử dụng mô-đun "Luôn hiển thị".
Câu trả lời chi tiết hơn cho câu hỏi của bạn ở đây /drupal//a/52149/7313
admin/structure/menu/manage/main-menu/add
?