ser/% user/view에 대한 액세스를 피하기 위해 관리자 만 프로필을 볼 수 있습니다. 처음에는 권한없이 user_view_access 권한을 변경하려고 시도했습니다.
Hook hook_menu_alter를 사용하려고했습니다.
53 function mymenu_menu_alter(&$items) {
54 $items['user'] = array(
55 'access callback' => 'user_access',
56 'access arguments' => array('access administration pages'),
57 'type' => MENU_NORMAL_ITEM,
58 );
59 $items['user/%user_uid_optional'] = array(
60 'access callback' => 'user_access',
61 'access arguments' => array('access administration pages'),
62 'type' => MENU_NORMAL_ITEM,
63 );
64 $items['user/%user/view'] = array(
65 'access callback' => 'user_edit_access',
66 'access arguments' => array('access administration pages'),
67 'type' => MENU_NORMAL_ITEM,
68 );
작동하지 않습니다. 힌트가 있습니까?
보고 한 코드에는 네 가지 문제가 있습니다.
array('access administration pages')
로 설정하는 것은 잘못되었습니다.array(1)
, user_edit_access()
로 설정하더라도 사용자는 자신의 사용자 프로필을 볼 수 있습니다. 사용자에게 자신의 사용자 프로필을 표시하지 않으려면 해당 기능이 액세스 콜백으로 사용할 기능이 아닙니다.function mymenu_menu_alter(&$items) {
$items['user/%user/view']['access callback'] = FALSE;
}
function mymenu_user_view_access($account) {
return $account && $account->uid && user_access('administer users');
}
이 트릭을 위해 chain_menu_access 모듈을 사용했습니다. 아래 코드.
/**
* Implements hook_menu_alter().
*/
function mymodule_menu_alter(&$items) {
chain_menu_access_chain($items, 'user/%user', '_mymodule_check_permission');
}
function _mymodule_check_permission() {
global $user;
$own_profile = $user->uid == arg(1);
$has_access = user_access('administer users');
return (!$has_access && !$own_profile) ? FALSE : TRUE;
}
이것은 조금 늦어 지지만 다른 사람이 같은 문제가있는 경우를 대비하여 여기에 남겨 두겠습니다. :)
경로 액세스 가 있습니다 :
많은 Drupal 모듈은 어느 정도의 액세스 제어 권한을 제공하지만 사용자가 가질 수있는 모든 요구 사항을 다룰 수는 없습니다. Path_access는 경로 별명에 따라 페이지를 제한하는 수단을 제공합니다. 와일드 카드를 사용하여 사이트의 전체 섹션에서 특정 사용자 역할 그룹.
그러나 가장 좋은 옵션과 현재 마스터 .make 파일의 최상위에있는 모듈은 토끼 구멍 -노드, 사용자 및 분류 용어에 대한 사용자 지정 리디렉션을 지원합니다.
Rabbit Hole은 엔터티를 자체 페이지에서 볼 때 발생하는 상황을 제어하는 기능을 추가하는 모듈입니다.
회전 목마에 표시되는 이미지 콘텐츠 유형과 같이 자체 페이지에 표시해서는 안되는 콘텐츠 유형이있을 수 있습니다. Rabbit Hole은 node/xxx를 통해 자체 페이지에서이 노드에 액세스 할 수 없도록합니다.
마지막으로 내가 원하는 것을 달성했습니다.
function mymenu_menu_alter(&$items) {
$items['user/%user_uid_optional'] = array(
'page callback' => '_mymenu_profile_view',
'page arguments' => array(1),
'type' => MENU_LOCAL_TASK,
);
}
function _mymenu_profile_view($account) {
global $user;
if (user_access('administer users')) {
include_once(drupal_get_path('module', 'user').'/user.pages.inc');
return user_view($account);
} else {
return drupal_not_found();
}
}
제안 해 주셔서 감사합니다!
사용자가 자신의 프로필을 편집 할 수는 있지만 볼 수는 없도록하려면 다음을 수행하십시오.
이미 패널 모듈을 사용하는 경우 선택 규칙에서 사용자에게 일반적인 패널을 보는 데 필요한 권한이없는 경우 (예 : User : Permission => 로그인 한 사용자에게 "사용자보기"가있는 경우) 사용자보기 재정의에서 두 번째 변형을 만들 수 있습니다. 프로필 "). HTTP 응답 코드를 선택하고 user/%user:uid/edit
로 301 리디렉션을 선택하십시오.
그런 다음 CSS로보기 버튼을 숨기거나 위에서 언급 한 코드를 구현할 수 있습니다.
function mymodule_menu_alter(&$items) {
$items['user/%user/view']['access callback'] = '_mymodule_user_view_access';
$items['user/%user/view']['access arguments'] = array(1);
}
function _mymodule_user_view_access($account) {
return $account && $account->uid && user_access('administer users');
}
또는 여러 방법을 사용하여 탭을 제거하십시오. 나는 다음이 Drupal 7)에서 작동해야하지만 아마도 올바른 방법이 아니거나 부작용이 있다고 가정합니다.
function mymodule_menu_local_tasks_alter(&$data) {
foreach ($data['tabs'][0]['output'] as $key => $value) {
if ($value['#link']['path'] == "user/%/view") {
unset($data['tabs'][0]['output'][$key]);
}
}
}