我有一个由外部模块提供的自定义实体,并且已经定义了两个捆绑包,我们将它们称为basic
和extended
。它们具有相同的基本字段,但是extended
还有一些其他字段。
我需要从basic
转换为extended
(但不是相反),但是我遇到了问题,因为extended
有一些必填字段。
更改捆绑并调用$entity->save()
然后重定向到编辑表单的操作有些起作用,但是如果出现问题或用户关闭窗口,则该实体将处于无效状态,因为必填字段永远不会设置,并且会导致问题。
我还尝试通过加载extended
来覆盖表格,在验证后复制值并更改包,但这会调用loadUnchanged()
并在验证新字段时失败,因为它们没有还不存在。这是相关代码:
$basic_entity = ExternalEntity::load($route_match->getParameter('id'));
$extended_entity = \Drupal::entityTypeManager()->getStorage('external_entity')
->create(array(
'type' => 'extended',
)
);
$fields = $basic_entity->getFields();
foreach ($fields as $name => $value) {
$extended_entity->set($name, $value->value);
}
$extended_entity->set('type', 'extended');
$extended_entity->enforceIsNew(false);
$extended_entity->setValidationRequired(FALSE);
$form = \Drupal::service('entity.form_builder')->getForm($extended_entity);
如何删除preSave
挂钩以避免重新加载实体?
还有其他解决方法吗?
谢谢。