Drupal技术问询:如何在邮件模板变量中获取用户first name而非用户名/realname
解决方法:在邮件模板!username变量中获取用户First Name
嘿,我来帮你搞定这个需求!你已经创建了First Name字段并通过LDAP同步了数据,现在要把邮件模板里的!username从realname改成直接取First Name,有几种靠谱的方法:
方法1:直接访问用户实体字段
这是最直接的方式,只要你知道First Name字段的机器名(比如你创建字段时设的field_first_name,记得替换成你实际的机器名),可以修改代码如下:
// 先判断字段是否有值,避免空值或报错 if (!empty($params['account']->field_first_name->value)) { $variables['!username'] = $params['account']->field_first_name->value; } else { // 做个降级处理,避免没有First Name时显示空白 $variables['!username'] = $params['account']->realname ?? $params['account']->name; }
如果发现$params['account']没有加载字段数据(比如只拿到了基础用户对象),可以先加载完整的用户实体:
$user = \Drupal\user\Entity\User::load($params['account']->id()); if (!empty($user->field_first_name->value)) { $variables['!username'] = $user->field_first_name->value; } else { $variables['!username'] = $user->realname ?? $user->name; }
方法2:使用Drupal令牌系统
你提到有[user:fi...]的令牌,用令牌来获取也是符合Drupal最佳实践的方式,代码示例:
// 加载令牌服务 $token_service = \Drupal::token(); // 替换成你实际的First Name令牌(比如[user:field-first-name]) $first_name = $token_service->replace('[user:field-first-name]', ['user' => $params['account']]); // 同样做降级处理 $variables['!username'] = !empty($first_name) ? $first_name : ($params['account']->realname ?? $params['account']->name);
小提示
- 一定要确认你First Name字段的机器名,可以到用户字段管理页面查看;
- 加上降级逻辑很重要,避免某些用户没有First Name数据时邮件显示空白;
- 你之前的代码用
realname是因为realname是由First Name生成的,但直接取字段值更精准,不会受realname生成规则的影响。
内容的提问来源于stack exchange,提问作者Markus
相关产品推荐
相关产品推荐

