如果显示的帐户是用户的帐户或来自另一个帐户,我需要一个插件检查功能。我正在使用此功能:
global $user; $account;
$account = user_load(array('uid' => arg(1)));
if ( $user->uid == $account->uid ) {
}
我在模块中执行此操作但不起作用。当我转到我的个人资料时,我从未看到该功能的输出。
为什么?
此代码的原始上下文:
function tpzclassified_menu() {
global $user;
$account = user_load(array('uid' => 1));
$account = user_load(array('uid' => 1));
if ($user->uid == $account1->uid) {
$items['user/%user/classifieds'] = array(
'title' => 'Meine Kleinanzeigen',
'type' => MENU_LOCAL_TASK,
'page callback' => 'tpzclassified_user_page',
'page arguments' => array(1),
'access callback' => 'user_view_access',
'access arguments' => array(1),
'weight' => 4,
);
}
return $items;
}
答案 0 :(得分:2)
如果显示的帐户是用户的帐户或来自其他帐户的帐户,我需要一个插件检查功能。
报告的代码所做的是验证登录用户是否是Drupal超级用户(也称为用户#1)。如果这是您真正需要的,则无需调用user_load()
来加载该用户帐户的用户对象。您使用以下代码就足够了:
global $user;
if ($user->uid == 1) {
$items['user/%user/classifieds'] = array(
'title' => 'Meine Kleinanzeigen',
'type' => MENU_LOCAL_TASK,
'page callback' => 'tpzclassified_user_page',
'page arguments' => array(1),
'access callback' => 'user_view_access',
'access arguments' => array(1),
'weight' => 4,
);
}
return $items;
在Drupal中,没有两个用户具有相同的用户ID,1是Drupal超级用户的用户ID(其用户ID为1时也称为用户#1)。
这个解决方案的问题是,从Drupal 6开始,菜单回调被缓存;有条件地添加菜单回调没有任何效果,因为只有在安装新模块或更新模块(并且调用update.php)时才清除菜单缓存。强制Drupal清除菜单缓存的唯一方法是使用以下代码:
if (!variable_get('menu_rebuild_needed', FALSE)) {
variable_set('menu_rebuild_needed', TRUE);
}
如果要检查当前登录用户是否正在访问自己的帐户,可以使用以下代码:
function tpzclassified_menu() {
$items['user/%user/classifieds'] = array(
'title' => 'Meine Kleinanzeigen',
'type' => MENU_LOCAL_TASK,
'page callback' => 'tpzclassified_user_page',
'page arguments' => array(1),
'access callback' => 'user_view_access',
'access arguments' => array(1),
'weight' => 4,
);
return $items;
}
没有理由使用自定义功能,因为user_view_access()
已经检查当前用户是否正在查看自己的帐户。
function user_view_access($account) {
return $account && $account->uid &&
(
// Always let users view their own profile.
($GLOBALS['user']->uid == $account->uid) ||
// Administrators can view all accounts.
user_access('administer users') ||
// The user is not blocked and logged in at least once.
($account->access && $account->status && user_access('access user profiles'))
);
}
答案 1 :(得分:1)
根据您的评论,问题出在您放置此代码的位置:hook_menu()
仅在重建菜单时调用:这就是您没有看到任何事情发生的原因。
您不能有条件地将菜单系统添加到菜单系统中:您必须注册一个菜单项,然后使用菜单项access callback
来确定该菜单是否会显示给特定用户。 access callback
与page callback
的工作方式类似,但必须返回TRUE
或FALSE
。你可能会做这样的事情:
function tpzclassified_menu() {
$items['user/%user/classifieds'] = array(
'title' => 'Meine Kleinanzeigen',
'type' => MENU_LOCAL_TASK,
'page callback' => 'tpzclassified_user_page',
'page arguments' => array(1),
'access callback' => 'tpzclassified_user_access',
'access arguments' => array(1),
'weight' => 4,
);
return $items;
}
function tpzclassified_user_access($account) {
global $user;
if ($user->uid == $account->uid) {
return user_view_access($account);
}
}