logo

额外区块类型 (EBT) - 全新的布局构建器体验❗

额外区块类型 (EBT) - 样式化、可定制的区块类型:幻灯片、标签页、卡片、手风琴等更多类型。内置背景、DOM Box、JavaScript 插件的设置。立即体验布局构建的未来。

演示 EBT 模块 下载 EBT 模块

❗额外段落类型 (EPT) - 全新的 Paragraphs 体验

额外段落类型 (EPT) - 类似的基于 Paragraph 的模块集合。

演示 EPT 模块 滚动

滚动

9.10.2. Drupal 字段 API。字段格式化器:在页面上显示数据字段。

17/10/2025, by Ivan

Menu

在本文中,我们将讨论字段格式化器(Field Formatters),它们允许我们编辑字段的显示方式并将其显示在页面上。

在之前的文章中,我们创建了链接字段类型(Link),在本文中,我们将探讨这些字段如何显示在页面上,以及哪个类负责显示它们。通过 Drupal 添加的每个字段都可以在页面上显示,并且可以在页面的“管理显示”中编辑其设置。

manage display

在“格式”列中,您可以选择如何显示字段。该列是通过字段格式化器类(Field Formatter classes)形成的。我们来看一下 Link 模块中的类,它负责将链接显示到页面:

core/modules/link/src/Plugin/Field/FieldFormatter/LinkFormatter.php

类注释显示了该格式化器所属的字段类型。

/**
 * Plugin implementation of the 'link' formatter.
 *
 * @FieldFormatter(
 *   id = "link",
 *   label = @Translation("Link"),
 *   field_types = {
 *     "link"
 *   }
 * )
 */

在此文件中,我们主要关注 viewElements() 方法,它负责将数据输出到页面。请注意,格式化器并不会向数据库发送请求,而是从变量 $items 中获取数据。渲染后的实体数据传递给 $items。因此,我们实现了类的责任分离:字段小部件(Field Widget)负责数据输入,字段存储(Field Storage)负责数据存储,而字段格式化器(Field Formatter)负责数据输出。这非常方便,因为可以在不同的层次缓存数据。例如,如果输出或字段格式化器设置发生更改,则没有必要重置节点的缓存,因为数据本身没有变化,只有它们的显示发生了变化。这对于调试和添加新功能也很方便。如果你只需要改变输出,你只需为字段类型添加一个新的字段格式化器,并编写你的输出逻辑。

此外,LinkFormatter 类还具有 settingsForm() 方法,它负责在“管理显示”页面上配置格式化器。通过表单 API,你可以为字段添加设置字段,并将这些设置存储在配置中。

Link 模块还有另一个格式化器:

core/modules/link/src/Plugin/Field/FieldFormatter/LinkSeparateFormatter.php

它继承自普通的 LinkFormatter,但有一个不同之处,它为这个格式化器连接了一个单独的模板:

core/modules/link/templates/link-formatter-link-separate.html.twig

因此,输出字段的 HTML 通过模板传递。格式化器只负责形成 $element 文件,并通过 $delta 为多个字段的每个值写入数据。

正如你所看到的,字段 API 使用起来非常简单方便。在下一篇文章中,我们将编写我们自己的字段类型,包含存储(Storage)、小部件(Widget)和格式化器(Formatter)。