我正在使用内容配置文件模块。当用户在他们的查看个人资料页面上并按下编辑时,他们希望显示个人资料编辑页面,而不是现在的帐户设置。内容配置文件编辑页面的路径是“user /%/ edit / uprofile”。有谁知道如何将'user /%/ edit / uprofile'设置为'user /%/ edit'的默认选项卡?
答案 0 :(得分:6)
此示例适用于“内容配置文件”选项卡。只需将$type
更改为配置文件的内容类型的简称。这也展示了如何清理代码以供实际使用(我以前的例子真的非常详细):
function mymodule_menu_alter(&$items) {
// Specify the content profile type you'd like to work with
$type = 'profile';
// Make sure the user has a Content Profile to edit
if (!empty($items['user/%user_category/edit/' . $type])) {
// Pull out the menu items we want to modify.
$account = &$items['user/%user_category/edit/account'];
$edit = &$items['user/%user_category/edit'];
$profile = &$items['user/%user_category/edit/' . $type];
// Specify the Edit Account page as just a regular tab.
// You do not need to change this block: this will always be the same as long
// as you don't want Edit account to be the default tab.
$account = array(
'type' => MENU_LOCAL_TASK,
'page callback' => $edit['page callback'],
'page arguments' => $edit['page arguments'],
'access callback' => $edit['access callback'],
'access arguments' => $edit['access arguments'],
'module' => $edit['module'],
'file' => $edit['file'],
) + $account;
// Change the default action to take when hitting user/<UID>/edit to
// the content profile
$edit = array(
'page callback' => $profile['page callback'],
'page arguments' => $profile['page arguments'],
'access callback' => $profile['access callback'],
'access arguments' => $profile['access arguments'],
'file' => $profile['file'],
'file path' => $profile['file path'],
) + $edit;
// Specify the profile page as the default tab and remove settings
// already set above
$profile['type'] = MENU_DEFAULT_LOCAL_TASK;
unset($profile['page callback'],
$profile['page arguments'],
$profile['access callback'],
$profile['access arguments'],
$profile['file'],
$profile['file path']);
}
}
我没有意识到您想要更改编辑下的默认标签。这与我下面描述的一般原理相同,但稍作修改。此示例将使个人标签(user/<UID>/edit/Personal
)默认设置而不是帐户标签:
function mymodule_menu_alter(&$items) {
// Specify the Edit Account page as just a regular tab.
// You do not need to change this block: this will always be the same as long
// as you don't want Edit account to be the default tab.
$items['user/%user_category/edit/account']['type'] = MENU_LOCAL_TASK;
$items['user/%user_category/edit/account']['page callback'] = $items['user/%user_category/edit']['page callback'];
$items['user/%user_category/edit/account']['page arguments'] = $items['user/%user_category/edit']['page arguments'];
$items['user/%user_category/edit/account']['access callback'] = $items['user/%user_category/edit']['access callback'];
$items['user/%user_category/edit/account']['access arguments'] = $items['user/%user_category/edit']['access arguments'];
$items['user/%user_category/edit/account']['module'] = $items['user/%user_category/edit']['module'];
$items['user/%user_category/edit/account']['file'] = $items['user/%user_category/edit']['file'];
// Change default action to take when hitting user/<UID>/edit to
// the settings of the page you want to use.
// -- Custom settings start here --
$items['user/%user_category/edit']['page callback'] = $items['user/%user_category/edit/Personal']['page callback'];
$items['user/%user_category/edit']['page arguments'] = $items['user/%user_category/edit/Personal']['page arguments'];
$items['user/%user_category/edit']['access callback'] = $items['user/%user_category/edit/Personal']['access callback'];
$items['user/%user_category/edit']['access arguments'] = $items['user/%user_category/edit/Personal']['access arguments'];
$items['user/%user_category/edit']['module'] = $items['user/%user_category/edit/Personal']['module'];
$items['user/%user_category/edit']['file'] = $items['user/%user_category/edit/Personal']['file'];
// When loading a profile tab, user_edit needs two parameters. The second parameter is the name of the profile
// (i.e. Personal from user/<UID>/edit/Personal).
$items['user/%user_category/edit']['page arguments'] = array(1, 'Personal');
// Specify the Personal page as the default tab and remove settings
// already set above */
$items['user/%user_category/edit/Personal']['type'] = MENU_DEFAULT_LOCAL_TASK;
unset($items['user/%user_category/edit/Personal']['page callback']);
unset($items['user/%user_category/edit/Personal']['page arguments']);
unset($items['user/%user_category/edit/Personal']['access callback']);
unset($items['user/%user_category/edit/Personal']['access arguments']);
unset($items['user/%user_category/edit/Personal']['module']);
unset($items['user/%user_category/edit/Personal']['file']);
}
您可以使用hook_menu_alter
并更改特定标签的类型来执行此操作。
更改默认选项卡是一个令人痛苦的过程。基本上,默认选项卡会继承页面的所有属性,而不会选择任何选项卡。这样,用户就可以转到user/UID
并获取视图页面,而无需直接转到user/UID/view
。
要更清楚地了解这一点,请查看user_menu()
挂钩实现。请注意$items['user/%user/view']
非常空,$items['user/%user_uid_optional']
包含您希望在$items['user/%user/view']
下看到的所有设置。
因此,您将首先设置视图选项卡作为常规选项卡:要执行此操作,您将必须复制附加到user/UID
菜单项的所有设置并将它们放入user/UID/view
菜单项。
完成此操作后,您将使用要成为默认标签的标签的设置替换user/UID
的设置。
最后,您将取消设置默认选项卡的所有菜单项,因为它将继承user/UID
的设置。
查看此代码,该代码默认为编辑标签:
function mymodule_menu_alter(&$items) {
// Specify the View page as just a regular tab.
// You do not need to change this block: this will always be the same as long
// as you don't want View to be the default tab.
$items['user/%user/view']['type'] = MENU_LOCAL_TASK;
$items['user/%user/view']['page callback'] = $items['user/%user_uid_optional']['page callback'];
$items['user/%user/view']['page arguments'] = $items['user/%user_uid_optional']['page arguments'];
$items['user/%user/view']['access callback'] = $items['user/%user_uid_optional']['access callback'];
$items['user/%user/view']['access arguments'] = $items['user/%user_uid_optional']['access arguments'];
$items['user/%user/view']['file'] = $items['user/%user_uid_optional']['file'];
// Normal tabs don't have a weight
unset($items['user/%user/view']['weight']);
// Change default action to take when hitting user/<UID> to
// the settings of the page you want to use.
// -- Custom settings start here --
$items['user/%user_uid_optional']['page callback'] = $items['user/%user_category/edit']['page callback'];
$items['user/%user_uid_optional']['page arguments'] = $items['user/%user_category/edit']['page arguments'];
$items['user/%user_uid_optional']['access callback'] = $items['user/%user_category/edit']['access callback'];
$items['user/%user_uid_optional']['access arguments'] = $items['user/%user_category/edit']['access arguments'];
$items['user/%user_uid_optional']['file'] = $items['user/%user_category/edit']['file'];
// Specify the Edit page as the default tab and remove settings
// already set above
$items['user/%user_category/edit']['type'] = MENU_DEFAULT_LOCAL_TASK;
$items['user/%user_category/edit']['weight'] = -10;
unset($items['user/%user_category/edit']['page callback']);
unset($items['user/%user_category/edit']['page arguments']);
unset($items['user/%user_category/edit']['access callback']);
unset($items['user/%user_category/edit']['access arguments']);
unset($items['user/%user_category/edit']['file']);
}
使用菜单项的设置替换功能的第二部分,您应该处于良好状态。当然,请记住在进行任何菜单更改后清除缓存以使其生效。
答案 1 :(得分:1)
drupal.org上有一个模块。 适用于配置文件字段。 请参阅Profile Tools。
答案 2 :(得分:0)
以下是安装了内容配置文件并使用默认内容类型('个人资料')的代码:
function mymodule_menu_alter(&$items) {
// Save the data from user/%/edit into user/%/edit/account.
$items['user/%user_category/edit/account'] = $items['user/%user_category/edit'];
$items['user/%user_category/edit/account']['tab_parent'] = 'user/%/edit';
$items['user/%user_category/edit/account']['title'] = 'Account';
// Change the default user/%/edit to user/%/edit/profile.
$useredit = &$items['user/%user_category/edit'];
$userprofile = &$items['user/%user_category/edit/profile'];
$useredit['page callback'] = $userprofile['page callback'];
$useredit['page arguments'] = $userprofile['page arguments'];
$useredit['access callback'] = $userprofile['access callback'];
$useredit['access arguments'] = $userprofile['access arguments'];
$useredit['file'] = $userprofile['file'];
$useredit['file path'] = $userprofile['file path'];
// Make the user/%/edit/profile sub-tab the default and left-most sub-tab.
$userprofile['type'] = MENU_DEFAULT_LOCAL_TASK;
$userprofile['weight'] = -10;
}
更改$userprofile = $items['user/%user_category/edit/profile']
以匹配您需要的内容个人资料路径(在您的情况下,这将是$userprofile = $items['user/%user_category/edit/uprofile']
还要确保您的模块在content_profile模块之后运行(您的模块必须具有比-1更高的权重,这是content_profile.module的权重)。模块的默认权重为0,所以你应该没问题。
答案 3 :(得分:0)
我正在寻找解决方案,但对这种复杂性并不满意。我是这样做的。
function MYTHEME_menu_link(array $variables) {
global $user;
if($variables["element"]["#theme"] == "menu_link__user_menu" && $variables["element"]["#original_link"]["router_path"] == "user") {
$variables["element"]["#href"] = "user/".$user->uid."/edit";
}
return theme_menu_link($variables);
}