У меня есть пользовательский объект, предоставляемый внешним модулем, и я определил два пакета, назовем их 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
, чтобы избежать повторной загрузки объекта?Есть ли другой способ сделать это?
Заранее спасибо.