显示模式:视图模式和表单模式
显示模式
显示模式(可在 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

表单模式和(表单)操作
- 统一管理入口:/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_build 和 hook_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 | 合作伙伴消息
- 点击保存
- 设置为必填字段
- 默认选择所有四个值并保存
- 点击“管理表单显示”标签
- 在字段列表底部找到“自定义显示设置”,展开
- 在“为以下表单模式使用自定义显示设置”中启用“注册”,并保存
- 现在会出现第二个名为“注册”的标签
- 将“订阅列表”字段拖到“禁用”区域并保存
- 转到“管理显示”标签,确认“订阅列表”字段已启用
退出站点并访问注册表单时,“订阅列表”字段将不可见。
登录后,该字段会出现在用户资料编辑表单中。