假设我有一个类似于这样的本地任务的路径:
MODULE_NAME.node_options:
path: '/node/{node}/options'
defaults:
_form: '\Drupal\MODULE_NAME\Form\NodeOptionsForm'
_title: 'Options'
requirements:
_entity_access: 'node.update'
node: \d+
options:
parameters:
node:
type: 'entity:node'NodeOptionsForm应向用户显示2-3个单选按钮,以选择要在节点上执行的服务,例如使用A.I创建主体摘要。
( a)我应该为表单使用哪个基类?
( b) {节点}参数是如何实际传递给表单实例的?换句话说,如何创建表单实例才能访问节点?
发布于 2023-05-30 16:40:40
您可以在您的NodeInterface中使用buildForm类,如下所示
label();
$form['#node'] = $node;
return $form;
}=> FormBase类将用于所有基本窗体,除非它是一个配置表单。
( b) {节点}参数是如何实际传递给表单实例的?换句话说,表单实例必须如何创建才能访问节点?=> You可以在buildForm中以NodeInterface $node的形式传递它。
发布于 2023-05-31 06:58:29
与不用于本地任务的路由相比,除了在模块的.links.task.yml文件中添加之外,本地任务的路由没有不同的要求。
例如,Book模块定义以下本地任务。
entity.node.book_outline_form:
route_name: entity.node.book_outline_form
base_route: entity.node.canonical
title: Outline
weight: 2路线是由这些线定义的。
entity.node.book_outline_form:
path: '/node/{node}/outline'
defaults:
_entity_form: 'node.book_outline'
_title: 'Outline'
requirements:
_permission: 'administer book outlines'
_entity_access: 'node.view'
node: \d+
options:
_node_operation_route: TRUE在这种情况下,表单是用_entity_form定义的。它也可以使用_form;在这种情况下,_form值是实现FormInterface的类的名称(包括名称空间),该类由FormBase实现,基类模块可以对其表单进行扩展。其他可用于窗体的基类包括ConfigFormBase、用于配置窗体的ConfirmFormBase、用于确认表单的C8或用于图像效果设置的ImageEffectFormBase。
任何路由参数都会传递给buildForm()方法,任何实现FormInterface的类都需要实现。
另一种方法是像Book模块一样,使用hook_entity_build()添加一个新的表单类,并在路由定义中使用_entity_form。
function book_entity_type_build(array &$entity_types) {
/** @var \Drupal\Core\Entity\EntityTypeInterface[] $entity_types */
$entity_types['node']->setFormClass('book_outline', 'Drupal\\book\\Form\\BookOutlineForm')
->setLinkTemplate('book-outline-form', '/node/{node}/outline')
->setLinkTemplate('book-remove-form', '/node/{node}/outline/remove')
->addConstraint('BookOutline', []);
}在这种情况下,编辑的实体在$this->entity中传递给实体表单类的方法。
https://drupal.stackexchange.com/questions/315902
复制相似问题