it-swarm.dev

사용자 프로필의 MENU_LOCAL_TASK를 프로필에만 표시하는 방법은 무엇입니까?

저는 이와 같은 로직을 사용하여 각 사용자의 프로필 페이지에 탭을 배치하여 사용자가 웹 애플리케이션 사용에서 분석을 볼 수 있도록합니다.

  // maps a url to a sub-page of user's profile, url to user's Analytics-Management form
  $items['user/%user/ClientCompanyName'] = array(
    'title'            => 'ClientCompanyName',
    'description'      => 'Manage your ClientCompanyName services.',
    'page callback'    => 'drupal_get_form',
    'page arguments'   => array('_ClientCompanyName_mgmt_form'),
    'access callback'  => 'user_access',
    'access arguments' => array( 'access ClientCompanyName services' ), 
    'type' => MENU_LOCAL_TASK,
  );

이것은 각 사용자에게 잘 작동하지만 한 사용자가 다른 사용자의 프로필로 이동하여 해당 링크를 눌러 다른 사용자의 개인 분석 데이터에 액세스 할 수 없도록하고 싶습니다.

현재 사용자가 다른 사용자의 분석 관리 페이지를 방문하려고하면 액세스 거부 페이지가 표시됩니다.

그러나 나는 그들에게 그 페이지에 대한 링크조차 주어지지 않기를 바랍니다. 내 자신의 '액세스 콜백'을 작성하려고했지만 의도 한 URL의 '% user'부분을 전달하는 방법을 알아낼 수 없으므로 로그인 한 사용자에 대해 테스트 할 수 있습니다.

URL에 '%'기호를 사용한 다음 '페이지 인수'를 사용하여 URL에서 해당 인수를 참조하는 방법을 좋아합니다. '접근 인수'로 비슷한 일을 할 수 있습니까?

기본적으로 사용자 프로필의 '수정'탭 동작과 동일한 작업을 수행하려고합니다. 사용자가 자신의 프로필 페이지에있는 경우에만 '수정'탭이 프로필에 나타납니다. 내 웹 애플리케이션 분석 페이지에 대해 동일한 효과를 얻으려면 어떻게합니까?

(내 분석 페이지를 프로필 편집 양식의 MENU_LOCAL_TASK로 만들 수 있다고 생각합니다 ...하지만 조건부가 단순히 user_access () 권한 테스트가 아닌 조건부 MENU_LOCAL_TASK를 만드는 방법을 알고 싶습니다.)

3
Blake Senftner

User_access 대신 고유 한 액세스 콜백 함수를 정의한 다음 사용자 개체를 여기에 전달합니다.

그래서 'access callback' => 'yourmodule_analytics_access''access arguments' => array(1).

그 함수에서 사용자 ID를 비교하십시오 and 권한을 확인하십시오.

function yourmodule_analytics_access($account) {
  global $user;
  return $user->uid == $account->uid && user_access('access ClientCompanyName services');
} 
6
Berdir

다음과 같은 사용자 지정 액세스 콜백을 사용하게되었습니다.

// this makes the analytics user profile tab's MENU_LOCAL_TAB conditional:
function _cex_mgmt_access($accessAllowed) {
  global $user;
  if (arg(1) != $user->uid)
    return false;
  return user_access($accessAllowed);
}

MENU_LOCAL_TASK 정의의 'access callback' 매개 변수가 '_cex_mgmt_access'가 아닌 'user_access'로 설정되어 있습니다.

이 방법에 대해 약간 불확실합니다. 사용자가 프로필 페이지로 이동할 때마다 처리 될 MENU_LOCAL_TASK 정의를 처리하는 메뉴 모듈의 논리에 따라 다릅니다. 해당 정보가 캐시되지 않습니까 (캐싱이 켜져있는 경우)?

1
Blake Senftner