如何将 /user/[uid] 页面的标题从Your account更改为Welcome [user name] for login user,其中[user name]是当前登录用户的用户名?
5 回答
调用 hook_menu 后更改保存到 {menu_router} 表的数据。
代码示例:
function MYMODULE_menu_alter()
{
global $user;
if($user->uid != 0)
$items['user']['title'] = 'Welcome ' . $user->name;
}
请注意,在 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');
}
String Overrides模块应该使这变得容易。
在 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。
在 UI 中显示用户名时,最好使用format_username()
,它允许第三方模块更改显示为用户名的内容。(例如,模块可以显示用户字段的内容,而不是显示登录用户名。)
如果您不愿意编写自定义代码,可以使用String Overrides模块。如果您不想使用任何模块来更改用户配置文件页面的标题,您可以在用于站点的 settings.php 文件中添加以下代码。
$conf['locale_custom_strings_en'][''] = array(
'My account' => 'Welcome to my site'
);
请注意,无论是使用String Overrides模块还是$conf['locale_custom_strings_en']['']
在 settings.php 文件中添加数组,您都不能:
- 提供一个根据登录用户更改的字符串(这是问题所要求的)
- 提供仅在特定页面上使用的字符串
后一种情况可能是有利的,也可能是不利的。如果需要更改的字符串足够通用,即使不应该替换它也会被替换。