9.10.2. Drupal 字段 API。字段格式化器:在页面上显示数据字段。
在本文中,我们将讨论字段格式化器(Field Formatters),它们允许我们编辑字段的显示方式并将其显示在页面上。
在之前的文章中,我们创建了链接字段类型(Link),在本文中,我们将探讨这些字段如何显示在页面上,以及哪个类负责显示它们。通过 Drupal 添加的每个字段都可以在页面上显示,并且可以在页面的“管理显示”中编辑其设置。
在“格式”列中,您可以选择如何显示字段。该列是通过字段格式化器类(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)。