如何在 Drupal 中使用 2 个钩子创建伪字段
2023-03-04•3 分钟阅读
什么是伪字段?
在 Drupal 中,伪字段是指不将数据存储在数据库中,而是动态即时生成内容的字段。伪字段允许站点构建者和开发人员向实体(如节点、用户和分类术语)添加自定义内容,而无需为此创建单独的字段。
伪字段在许多方面都表现得像常规字段。但是,它们不将数据存储在数据库中,而是使用回调函数在查看实体时生成其内容。
如何创建伪字段?
在 Drupal 8、9、10 中
通过结合使用 hook_ENTITY_TYPE_view()
和 hook_entity_extra_field_info()
,您可以定义自定义伪字段,并精确指定在显示实体时应如何渲染它们。
在以下示例中,我们将向段落实体类型添加一个伪字段,该字段将在段落的任何使用位置渲染一个 Google Classroom 分享按钮。该字段将显示在“管理显示”中,就像在实体中创建的字段一样。

方法
确保在文件顶部添加以下两行。
use Drupal\Core\Entity\Display\EntityViewDisplayInterface;
use Drupal\Core\Entity\EntityInterface;
在您的自定义模块的 my_module.module
文件中,使用 hook_entity_extra_field_info()
函数定义伪字段:
/**
* Implements hook_entity_extra_field_info().
*/
function MY_MODULE_entity_extra_field_info() {
$display_fields = [];
$display_fields['paragraph']['google_classroom_button']['display']['google_classroom_button'] = [
'label' => t('Google Classroom 按钮'),
'description' => t('显示 Google Classroom 按钮'),
'weight' => 100,
'visible' => TRUE,
];
return $display_fields;
}
在此示例中,我们为 paragraph
实体类型和 google_classroom_button 包定义了一个名为 google_classroom_button
的伪字段。
如果您想将字段添加到内容类型,您应该在上面的代码中将 paragraph 替换为 node,并将 google_classroom_button 替换为您的内容类型的名称。
/**
* Implements hook_ENTITY_TYPE_view().
*/
function MY_MODULE_paragraph_view(array &$build, EntityInterface $entity, EntityViewDisplayInterface $display) {
if ($display->getComponent('google_classroom_button')) {
$currentUrl = Url::fromRoute('<current>',[] , ['absolute' => 'true'])->toString();
$output = '<script src="https://apis.google.com/js/platform.js" async defer></script>';
$output .= '<div class="g-sharetoclassroom" data-size="64" data-url="' . $currentUrl . '" ></div>';
$build['google_classroom_button'] = [
'#type' => 'markup',
'#markup' => $output,
'#allowed_tags' => ['script', 'div'],
];
}
}
上面的代码正在检查“google_classroom_button”组件是否已添加到段落实体的显示配置中。如果已添加,则为“google_classroom_button”伪字段生成自定义输出。
伪字段的用例
- 显示计算值或聚合值(例如,节点上的评论数)
- 嵌入来自其他来源的内容(例如 YouTube 视频或社交媒体动态)
- 显示自定义标记或 HTML(例如相关内容列表)
总结
- 这是一种无需处理 twig 模板即可在实体中获取额外信息的快速方法。
- 创建实体视图时,伪字段将不可用。