如何在 Drupal 8 的用户个人资料页面上添加自定义 HTML?
How to add custom HTML on user profile page in Drupal 8?
当用户登录时,会将他们带到他们的 /user 页面。此页面上通常有默认文本:成员 X 个月。但没有别的。
您可以在此处管理此显示:admin/config/people/accounts/display
问题是,如何在此页面上添加更多信息不是很明显。我更喜欢直接编辑用户配置文件模板,但这似乎不再用于 Drupal 8。
我要添加的东西类型:
- 链接到用户帐户不同方面的图标菜单(例如发票、订单、编辑帐户、我的积分等)
- 随机文本块,例如:"X invoices due"、"X time until next game starts" 等
- 从外部获取的账户信息API(用户名、密码、地址、总订单等)
我打算制作一个 "drupal block" 并在所有 /user 路径上显示它,但我认为我没有正确使用该页面。
- 有没有办法添加可用于显示此信息的字段? (以便我可以从 admin/config/people/accounts/display 管理它)
- 是否有我可以覆盖的用户配置文件模板
请记住,无论使用什么,一个用户绝不能访问另一个用户的个人资料。它只会用作已登录用户的登录页面,因此只有该用户才能看到他们帐户的详细信息。
更新
我看到您可以覆盖 user.html.twig,但这意味着文件中没有 PHP(这当然不是一个好方法)。那么如何将 PHP 逻辑添加到该模板中呢?
第一件事:您可以覆盖用户配置文件模板。在 yourtheme/templates/ 目录中创建一个名为 user--profile.html.twig 的模板。在此文件中,您可以在 {{ var_dump(user) }}
中找到用户实体。您可以根据需要呈现信息。
第二件事:如果你想在用户个人资料上增加额外的变量。您可以将这些变量附加到 hook_user_load()
中的用户。在这个钩子中,你可以编写所有的逻辑,你可以从这里附加你的块。并在树枝中以 {{ user.your_variable }}
的形式访问它们。
由于我们不能在 twig 中编写 php 代码,我们需要将所有东西从我们的钩子、module_functions、控制器到 twig 附加。这是很好的做法。
我采纳了 @Monal Sof 的上述建议,但在我的情况下不起作用,而且我复制了 MYTHEME/templates/user/user.html.twig
下的 user.html.twig
文件(来自用户模块)来定义我的自定义代码,但它显示在所有节点页面上。
所以我在 MYTHEME.theme
文件中使用了 hook_theme_suggestions_HOOK_alter() 来定义用户配置文件的自定义模板。
这是我遵循的步骤:
/**
* Implements hook_theme_suggestions_HOOK_alter().
*/
function MYTHEME_theme_suggestions_user_alter(array &$suggestions, array $variables) {
$request = \Drupal::routeMatch()->getRouteObject();
$path_args = explode('/', $request->getPath());
if (\Drupal::currentUser()->isAuthenticated() && in_array('user', $path_args)) {
$suggestions[] = 'user__profile';
}
}
在此之后我将我的自定义模板放在 MYTHEME/templates/user/user--profile.html.twig
下并清除缓存。
有一个模块可以帮助完成此模板建议以及更多其他模块:https://www.drupal.org/project/twigsuggest
当用户登录时,会将他们带到他们的 /user 页面。此页面上通常有默认文本:成员 X 个月。但没有别的。
您可以在此处管理此显示:admin/config/people/accounts/display
问题是,如何在此页面上添加更多信息不是很明显。我更喜欢直接编辑用户配置文件模板,但这似乎不再用于 Drupal 8。
我要添加的东西类型:
- 链接到用户帐户不同方面的图标菜单(例如发票、订单、编辑帐户、我的积分等)
- 随机文本块,例如:"X invoices due"、"X time until next game starts" 等
- 从外部获取的账户信息API(用户名、密码、地址、总订单等)
我打算制作一个 "drupal block" 并在所有 /user 路径上显示它,但我认为我没有正确使用该页面。
- 有没有办法添加可用于显示此信息的字段? (以便我可以从 admin/config/people/accounts/display 管理它)
- 是否有我可以覆盖的用户配置文件模板
请记住,无论使用什么,一个用户绝不能访问另一个用户的个人资料。它只会用作已登录用户的登录页面,因此只有该用户才能看到他们帐户的详细信息。
更新
我看到您可以覆盖 user.html.twig,但这意味着文件中没有 PHP(这当然不是一个好方法)。那么如何将 PHP 逻辑添加到该模板中呢?
第一件事:您可以覆盖用户配置文件模板。在 yourtheme/templates/ 目录中创建一个名为 user--profile.html.twig 的模板。在此文件中,您可以在 {{ var_dump(user) }}
中找到用户实体。您可以根据需要呈现信息。
第二件事:如果你想在用户个人资料上增加额外的变量。您可以将这些变量附加到 hook_user_load()
中的用户。在这个钩子中,你可以编写所有的逻辑,你可以从这里附加你的块。并在树枝中以 {{ user.your_variable }}
的形式访问它们。
由于我们不能在 twig 中编写 php 代码,我们需要将所有东西从我们的钩子、module_functions、控制器到 twig 附加。这是很好的做法。
我采纳了 @Monal Sof 的上述建议,但在我的情况下不起作用,而且我复制了 MYTHEME/templates/user/user.html.twig
下的 user.html.twig
文件(来自用户模块)来定义我的自定义代码,但它显示在所有节点页面上。
所以我在 MYTHEME.theme
文件中使用了 hook_theme_suggestions_HOOK_alter() 来定义用户配置文件的自定义模板。
这是我遵循的步骤:
/**
* Implements hook_theme_suggestions_HOOK_alter().
*/
function MYTHEME_theme_suggestions_user_alter(array &$suggestions, array $variables) {
$request = \Drupal::routeMatch()->getRouteObject();
$path_args = explode('/', $request->getPath());
if (\Drupal::currentUser()->isAuthenticated() && in_array('user', $path_args)) {
$suggestions[] = 'user__profile';
}
}
在此之后我将我的自定义模板放在 MYTHEME/templates/user/user--profile.html.twig
下并清除缓存。
有一个模块可以帮助完成此模板建议以及更多其他模块:https://www.drupal.org/project/twigsuggest