返回博客

如何在 Drupal 中使用 2 个钩子创建伪字段

2023-03-043 分钟阅读

什么是伪字段?

在 Drupal 中,伪字段是指不将数据存储在数据库中,而是动态即时生成内容的字段。伪字段允许站点构建者和开发人员向实体(如节点、用户和分类术语)添加自定义内容,而无需为此创建单独的字段。

伪字段在许多方面都表现得像常规字段。但是,它们不将数据存储在数据库中,而是使用回调函数在查看实体时生成其内容。

如何创建伪字段?

在 Drupal 8、9、10 中

通过结合使用 hook_ENTITY_TYPE_view()hook_entity_extra_field_info(),您可以定义自定义伪字段,并精确指定在显示实体时应如何渲染它们。

在以下示例中,我们将向段落实体类型添加一个伪字段,该字段将在段落的任何使用位置渲染一个 Google Classroom 分享按钮。该字段将显示在“管理显示”中,就像在实体中创建的字段一样。

Drupal 伪字段将出现在管理显示选项卡中的字段列表中。

方法

确保在文件顶部添加以下两行。

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 模板即可在实体中获取额外信息的快速方法。
  • 创建实体视图时,伪字段将不可用。