logo

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

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

演示 EBT 模块 下载 EBT 模块

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

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

演示 EPT 模块 滚动

滚动

显示模式:视图模式和表单模式

30/09/2025, by Ivan

显示模式

显示模式(可在 admin/Structure/Display-Mode 中管理)用于提供内容实体在查看或编辑时的不同展示方式。显示模式有两种类型——“视图模式”和“表单模式”。这两种显示模式——视图模式和表单模式——都是“配置对象”的示例。下面是一个导出的视图模式示例。

uuid: 15dc7aa9-13fd-4412-9c06-06d09f915d08
langcode: en
status: false
dependencies:
  module:
    - node
id: node.full
label: 'Full content'
targetEntityType: node
cache: true

来源: core.entity_view_mode.node.full.yml

需要注意的主要属性是 targetEntityType。每个显示模式(视图模式或表单模式)都关联到一个且仅一个内容实体类型。按照约定,某些标签会被多个显示模式使用。例如,Drupal Core 的标准配置文件在节点、用户自定义区块和评论的视图模式标签中使用了“Full”一词。

视图模式和显示

  • 统一管理入口:/admin/structure/display-mode/view
  • 在每个包中通过“自定义显示设置”启用,例如:/admin/structure/types/manage/page/display (其中“page”是节点实体包)
  • 为每个包配置视图模式,例如:/admin/structure/types/manage/page/display/teaser (其中“page”是节点实体包,“teaser”是视图模式)

视图模式的概念早于 Drupal 8。它们在 Drupal 7 就已存在。在 Drupal 6 中有“构建模式”的概念。视图模式允许 Drupal 的建站工具(如 Entity Reference 字段)以特定方式调用某个实体。例如,假设 “song” 和 “artist” 各是一个节点类型,并且 song 节点包含一个引用 artist 的字段。song 节点的“完整”视图模式可能需要调用 artist 节点的“摘要”视图模式。在此例中,“摘要”是 artist 节点的视图模式,“完整”是 song 节点的视图模式。

通常情况下,如果站点开发者希望以摘要模式显示 artist 节点,那么他会为 artist 和 teaser 专门配置显示。这可以在实体包配置页面的“管理显示”标签完成。例如,在 Drupal Core 的标准安装中,对应的页面是 /admin/structure/types/manage/article/display

在该页面上,站点开发者可以为包启用自定义字段显示设置(字段顺序和格式化器使用)来适配不同视图模式。并不是所有视图模式都需要为所有包做特殊设置。在这个例子中,只有“RSS”和“摘要”视图模式有自己的配置。其他视图模式则回退到“默认”配置。实体类型包和视图模式之间的这种关联称为“视图显示”。@see EntityViewDisplayInterface

d8-view-modes

表单模式和(表单)操作

  • 统一管理入口:/admin/structure/display-mode/form
  • 在每个包中启用,例如:/admin/structure/types/manage/page/form-display (其中“page”是节点实体包)
  • 为包配置表单模式,例如:/admin/structure/types/manage/page/form-display/simple (其中“page”是节点实体包,“simple”是表单模式)

与视图模式类似,表单模式也是为同一个内容实体包创建不同字段配置的方式。表单模式允许设置多个字段小部件排序和配置,就像视图模式允许设置多个字段格式化器排序和配置一样。

在 Drupal 7 中,字段和字段小部件都在任意内容类型的“管理字段”标签下配置。现在拆分为两个标签:“管理字段”和“管理表单显示”。这让我们在添加/编辑内容类型时对表单显示有了更多灵活性。“管理显示”标签依旧保留了 Drupal 7 的样式。除了内容类型,我们还可以为其他实体类型(如用户、分类、评论和自定义区块)管理视图模式。

除了表单模式,表单操作还能定义哪些类用于某些表单,比如节点删除表单。节点删除表单和节点编辑表单所用的类不同。这些操作在实体注解中定义。

下面是一个示例,它会在 MyEntityForm 中显示两个自定义表单操作以及“默认”表单模式。确保该表单继承自 ContentEntityForm。

/**
 * @ContentEntityType(
 *   id = "myentity",
 *   handlers = {
 *     "form" = {
 *       "default" = "Drupal\myentity\Form\MyEntityForm",
 *       "add" = "Drupal\myentity\Form\MyEntityForm",
 *       "edit" = "Drupal\myentity\Form\MyEntityForm",
 *       "delete" = "Drupal\myentity\Form\MyEntityDeleteForm",
 *     },
 *   },
 * )
 */

如果你需要为现有实体添加或修改可用的表单操作,可以使用 hook_entity_type_buildhook_entity_type_alter

目前必须为所使用的表单模式显式配置操作。与视图模式不同(如果某个视图模式未配置显示,会回退到默认显示),表单模式不会自动使用“默认”操作。这被认为是一个 bug。参见 #2511720: 允许表单模式在未显式设置操作时使用默认操作

要在路由中显示某个表单模式,使用 _entity_form。例如,要显示 MyEntity 的自定义“编辑”表单模式,可以这样配置:

entity.myentity.edit_form:
 path: '/myentity/{myentity}/edit'
 defaults:
   _entity_form: myentity.edit
   _title: 'Edit MyEntity'
 requirements:
   _permission: 'edit myentity entities' 

另一个示例:

常见需求是用户注册表单中不显示所有用户字段。用户注册后,可以在资料编辑表单中看到额外字段。下面是这种配置示例:

  • 在 /admin/config/people/account/fields 中点击“添加字段”
  • 在下一个页面选择字段类型:列表(文本)
  • 给它起个标签:“订阅列表”
  • 点击“保存并继续”
  • 填写允许值列表,例如:

                     1 | 新闻
                     2 | 重要公告
                     3 | 优惠、折扣、促销
                     4 | 合作伙伴消息

  • 点击保存
  • 设置为必填字段
  • 默认选择所有四个值并保存
  • 点击“管理表单显示”标签
  • 在字段列表底部找到“自定义显示设置”,展开
  • 在“为以下表单模式使用自定义显示设置”中启用“注册”,并保存
  • 现在会出现第二个名为“注册”的标签
  • 将“订阅列表”字段拖到“禁用”区域并保存
  • 转到“管理显示”标签,确认“订阅列表”字段已启用

退出站点并访问注册表单时,“订阅列表”字段将不可见。
登录后,该字段会出现在用户资料编辑表单中。