从另一个模块修改hook_menu()中给出的标题

时间:2013-02-11 16:16:56

标签: drupal drupal-7 drupal-routes

如何将登录用户的您的帐户指定给/ user / [uid]页面的标题更改为欢迎[用户名] ,其中< em> [用户名] 是当前登录用户的用户名?

5 个答案:

答案 0 :(得分:2)

使用hook_menu_alter

  

在调用hook_menu之后,将保存的数据更改为{menu_router}表。

代码示例:

function MYMODULE_menu_alter()
{
    global $user;
    if($user->uid != 0)
        $items['user']['title'] = 'Welcome ' . $user->name;
}

答案 1 :(得分:1)

您应该可以使用Menu token module

完成此操作
  

菜单令牌模块提供令牌,可用于标题或菜单项(链接)的路径。

(它需要受欢迎的Token module。)

答案 2 :(得分:0)

请注意,对于Drupal 7.23,user.module包含一个“标题回调”,用于确定用户是否已登录,并使用相应的标题进行回复。

适合我的代码(通过主题模板,而不是自定义模块):

    function YOURTHEME_menu_alter(&$items) { 
      $items['user']['title callback'] = 'YOURTHEME_user_menu_title';
}

    function YOURTHEME_user_menu_title() {
      global $user;
      return user_is_logged_in() ? t($user->name) : t('User account');
}

答案 3 :(得分:0)

String Overrides模块应该可以轻松实现。

答案 4 :(得分:0)

在Drupal 7中,hook_menu()hook_menu_alter()仅在需要刷新有关从模块实现的路由的数据时(例如,启用,禁用,安装或卸载模块时)才被调用。在标题中使用当前登录用户名的hook_menu_alter()实现将为不同用户显示相同的用户名。
与此不同,每次呈现与该路由关联的页面时,都会调用与该路由关联的标题回调。

正确的代码将类似于以下代码。

function mymodule_menu_alter(&$items) { 
  $items['user']['title callback'] = 'mymodule_user_profile_title';
}

function mymodule_user_profile_title() {
  global $user;
  return user_is_logged_in() ? t('Welcome, @name', array('@name' => format_username($user))) : t('User account');
}

请注意,t()的第一个参数必须是文字字符串,而不是t($user->name)中的动态值,因为包含字符串翻译的数据库表将不包含用于网站。 这也是错误的,因为显示的用户名对于网站上使用的语言是不变的:例如,在意大利网站中,像 Albert 这样的用户名不会翻译为 Alberto Vincent 也不会翻译为 Vincenzo

在用户界面中显示用户名时,始终最好使用format_username(),它允许第三方模块更改显示为用户名的内容。 (例如,一个模块可以显示用户字段的内容,而不显示登录用户名。)

如果您不愿意编写自定义代码,则可以使用String Overrides模块。如果您不想仅使用任何模块来更改用户个人资料页面的标题,则可以在用于网站的settings.php文件中添加以下代码。

$conf['locale_custom_strings_en'][''] = array(
  'My account' => 'Welcome to my site'
);

请注意,使用 String Overrides 模块或在settings.php文件中添加$conf['locale_custom_strings_en']['']数组,您将无法:

  • 根据登录的用户提供一个可更改的字符串(这是问题的根源)
  • 提供仅在特定页面上使用的字符串

后一种情况可能是赞成也可能是反对。如果需要更改的字符串足够通用,那么即使不需要更改也将被替换。