Drupal - 将'user /%/ edit / uprofile'设置为'user /%/ edit'上的默认选项卡

时间:2010-08-04 18:30:16

标签: php drupal menu

我正在使用内容配置文件模块。当用户在他们的查看个人资料页面上并按下编辑时,他们希望显示个人资料编辑页面,而不是现在的帐户设置。内容配置文件编辑页面的路径是“user /%/ edit / uprofile”。有谁知道如何将'user /%/ edit / uprofile'设置为'user /%/ edit'的默认选项卡?

4 个答案:

答案 0 :(得分:6)

编辑2(内容配置文件)

此示例适用于“内容配置文件”选项卡。只需将$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']);
  }
}

编辑1(对于Core的配置文件模块)

我没有意识到您想要更改编辑下的默认标签。这与我下面描述的一般原理相同,但稍作修改。此示例将使个人标签(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);
}