云客Drupal源码分析之实体表单entity form

本文详细介绍了Drupal8中的实体表单,包括实体表单的设置、路由、构建过程和对象。阐述了如何在实体定义中配置处理器,以及如何通过 '_entity_form' 指定实体表单路由。内容涵盖了从实体对象的获取到表单构建的整个流程,旨在帮助读者深入理解Drupal8的实体表单机制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以下内容仅是一个预览,完整内容请见文尾:

实体表单用于提供实体的用户交互,如:创建、编辑、删除等,她建立在表单组件基础之上,提供了对实体的特定支持,在阅读本篇前,请务必先阅读本系列表单相关主题。

实体表单操作的是实体,一切围绕实体对象,当删除、编辑实体时,会使用实体储存处理器加载实体,在新建操作时会新建一个实体,实体本身具备CURD方法,在表单中重点处理内容是各阶段如何得到实体对象,派发钩子、调用验证、表单控件、如何传递值等等

实体表单设置:
在实体定义中,表单被视为一种实体处理器,因此要运用表单的实体,需要在实体定义时进行处理器设置(或者通过实体定义修改钩子设置),在释文的handlers根键下指定form子键,其下一级键名是实体的表单操作名,提供对实体某一方面或某一显示模式下的操作,常用的如:add、edit、delete、cancel,操作名不强制为特定字符,但通常按照最佳实践命名,默认或多合一功能的表单可以使用名字:default,还可以指定有特殊功能的表单,如:register,操作名也作为表单显示模式名(详见本系列显示模式主题),她对应的键值是完全限定名字空间类名或容器服务id,在内部该值传递给类解析服务(id:class_resolver)的getInstanceFromDefinition方法去实例化成一个对象,该对象将被当做表单对象使用。

实体表单路由:
为普通的表单定义路由时可以使用“_form”来代替“_controller”以指定一个表单类或服务id,类似,实体表单可以使用“_entity_form”来指定一个实体表单,不过其值不是一个表单类或服务id,而是如下格式:
“实体类型ID.表单操作名”,如“block.delete”
可以仅指定“实体类型ID”,此时相当于指定为:“实体类型ID .default” ,表单操作名和表单模式名的区别与联系请见本系列表单显示,注意这里并没有涉及bundle,因为bundle信息可以在实体对象上获取,不管是创建表单还是其他操作的表单,都必有一个实体对象,其必保存着bundle信息,如节点实体的创建表单建立过程如下:

  public function add(NodeTypeInterface $node_type) {
    $node = $this->entityManager()->getStorage('node')->create([
      'type' => $node_type->id(),
    ]);
    $form = $this->entityFormBuilder()->getForm($node);
    return $form;
  }

关于指定实体对象的bundle信息也见下文的实体表单对象的getEntityFromRouteMatch方法
以“_entity_form”方式指定的路由会在实体路由增强器(服务id:route_enhancer.entity)中被处理,补充设置控制器为:
'controller.entity_form:getContentResult'
也就是方法:\Drupal\Core\Entity\HtmlEntityFormController:: getContentResult
在该控制器内部由实体类型管理器的getFormObject 方法来实例化实体表单对象(见下),然后通过实体表单对象的getEntityFromRouteMatch方法来取得实体对象并注入到实体表单对象中,然后初始化一个表单状态对象,再调用表单构建器的构建表单方法($formBuilder->buildForm ($form_object, $form_state);)开始执行,这意味着实体表单的处理和普通表单处理在逻辑上无异,都使用表单构建器,返回的结果作为页面主内容。

实体表单构建器:
在控制器中针对普通表单的使用,系统提供了表单构建器作为表单系统的入口以统一使用,类似,针对实体表单,系统提供了实体表单构建器作为实体表单系...

完整目录如下:
实体表单设置
实体表单路由
实体表单构建器
被实体表单操作的实体对象来源
实体表单对象
实体表单基类
实体表单基类使用示例
内容实体表单基类
内容实体表单基类使用示例
确认表单
实体删除表单
补充

 

各位《云客drupal源码分析》系列的读者:
本系列分享希望帮助大家理解drupal底层原理,并缩短学习时间,但部分重点内容在博客仅发布前言和目录,这是因为:drupal在国外如此流行但在国内却很小众,一个重要原因应该是中文资料的缺乏,我们是否能够找到一种方式来激发高质量的中文资料出产?此时同是积极推动者的晴空提出能否用付费阅读的方式来鼓励更多教程作者?并建立了一个付费阅读drupal资料的网站,学习者仅需支付很少费用即可查询到最用心的知识注解,避免大量查找资料,可以节省大量学习时间是划算的,作者也能分配精力去开发高质量内容而得到回报,drupal是精品中的精品,超过一半的世界五百强用她做网站,难能可贵,国内普及初期需要一个良好的土壤,普及开后免费内容会越来越多,为了支持国内发展,云客决定将重点内容放在晴空的这个网站上收费阅读,读者只需要微信支付很少费用即可,云客在这里承诺该系列得到的所有订阅费用全部捐献给drupal深圳社区,用以组织活动等等,发展社区需要大家贡献力量,该网站于2017年3月29日上线,请移步:http://nowicode.com/ 阅读本篇完整版

我是云客,【云游天下,做客四方】,联系方式见主页,欢迎转载,但须注明出处

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值