diff --git a/src/Form/EntityInlineForm.php b/src/Form/EntityInlineForm.php index 91a09a5..7e05635 100644 --- a/src/Form/EntityInlineForm.php +++ b/src/Form/EntityInlineForm.php @@ -140,8 +140,10 @@ class EntityInlineForm implements InlineFormInterface { */ public function entityForm($entity_form, FormStateInterface $form_state) { $operation = 'default'; - $controller = $this->entityManager->getFormObject($entity_form['#entity']->getEntityTypeId(), $operation); + $controller = $this->entityManager->getFormObject($entity_form['#entity']->getEntityTypeId(), $operation, FALSE); $controller->setEntity($entity_form['#entity']); + $form_state->set(['inline_entity_form', $entity_form['#ief_id'], 'entity_form'], $controller); + $child_form_state = $this->buildChildFormState($controller, $form_state, $entity_form['#entity'], $operation, $entity_form['#parents']); $entity_form = $controller->buildForm($entity_form, $child_form_state); @@ -189,8 +191,8 @@ class EntityInlineForm implements InlineFormInterface { $entity = $entity_form['#entity']; $operation = 'default'; - $controller = \Drupal::entityManager() - ->getFormObject($entity->getEntityTypeId(), $operation); + /** @var \Drupal\Core\Entity\EntityFormInterface $controller */ + $controller = $form_state->get(['inline_entity_form', $entity_form['#ief_id'], 'entity_form']); $child_form_state = static::buildChildFormState($controller, $form_state, $entity, $operation, $entity_form['#parents']); $entity_form['#entity'] = $controller->validateForm($entity_form, $child_form_state); @@ -227,7 +229,8 @@ class EntityInlineForm implements InlineFormInterface { /** @var \Drupal\Core\Entity\EntityInterface $entity */ $entity = $entity_form['#entity']; $operation = 'default'; - $controller = \Drupal::entityManager()->getFormObject($entity->getEntityTypeId(), $operation); + /** @var \Drupal\Core\Entity\EntityFormInterface $controller */ + $controller = $form_state->get(['inline_entity_form', $entity_form['#ief_id'], 'entity_form']); $controller->setEntity($entity); $child_form_state = static::buildChildFormState($controller, $form_state, $entity, $operation, $entity_form['#parents']); diff --git a/src/Plugin/Field/FieldWidget/InlineEntityFormBase.php b/src/Plugin/Field/FieldWidget/InlineEntityFormBase.php index 4cc2db4..43e173a 100644 --- a/src/Plugin/Field/FieldWidget/InlineEntityFormBase.php +++ b/src/Plugin/Field/FieldWidget/InlineEntityFormBase.php @@ -315,6 +315,7 @@ abstract class InlineEntityFormBase extends WidgetBase implements ContainerFacto * Form array structure. */ public static function addIefSubmitCallbacks($element) { + $element['#element_validate'][] = [get_called_class(), 'validateSaveEntity']; $element['#ief_element_submit'][] = [get_called_class(), 'submitSaveEntity']; return $element; } @@ -365,8 +366,9 @@ abstract class InlineEntityFormBase extends WidgetBase implements ContainerFacto * @param $form_state * The form state of the parent form. */ - public static function submitSaveEntity($entity_form, FormStateInterface $form_state) { + public static function validateSaveEntity($entity_form, FormStateInterface $form_state) { $ief_id = $entity_form['#ief_id']; + /** @var \Drupal\Core\Entity\EntityInterface $entity */ $entity = $entity_form['#entity']; if ($entity_form['#op'] == 'add') { @@ -381,7 +383,7 @@ abstract class InlineEntityFormBase extends WidgetBase implements ContainerFacto 'entity' => $entity, '_weight' => $weight, 'form' => NULL, - 'needs_save' => TRUE, + 'needs_save' => FALSE, ); $form_state->set(['inline_entity_form', $ief_id, 'entities'], $entities); } @@ -389,6 +391,27 @@ abstract class InlineEntityFormBase extends WidgetBase implements ContainerFacto $delta = $entity_form['#ief_row_delta']; $entities = $form_state->get(['inline_entity_form', $ief_id, 'entities']); $entities[$delta]['entity'] = $entity; + $entities[$delta]['needs_save'] = FALSE; + $form_state->set(['inline_entity_form', $ief_id, 'entities'], $entities); + } + } + + public static function submitSaveEntity($entity_form, FormStateInterface $form_state) { + $ief_id = $entity_form['#ief_id']; + $entity = $entity_form['#entity']; + + if ($entity_form['#op'] == 'add') { + $entities = $form_state->get(['inline_entity_form', $ief_id, 'entities']); + $item = array_pop($entities); + $item['entity'] = $entity; + $item['needs_save'] = TRUE; + array_push($entities, $item); + $form_state->set(['inline_entity_form', $ief_id, 'entities'], $entities); + } + else { + $delta = $entity_form['#ief_row_delta']; + $entities = $form_state->get(['inline_entity_form', $ief_id, 'entities']); + $entities[$delta]['entity'] = $entity; $entities[$delta]['needs_save'] = TRUE; $form_state->set(['inline_entity_form', $ief_id, 'entities'], $entities); } diff --git a/src/Plugin/Field/FieldWidget/InlineEntityFormComplex.php b/src/Plugin/Field/FieldWidget/InlineEntityFormComplex.php index a7781ff..c8ebc0d 100644 --- a/src/Plugin/Field/FieldWidget/InlineEntityFormComplex.php +++ b/src/Plugin/Field/FieldWidget/InlineEntityFormComplex.php @@ -655,6 +655,10 @@ class InlineEntityFormComplex extends InlineEntityFormBase implements ContainerF $item['target_id'] = $item['entity']->id(); $items[] = $item; } + else { + $item['target_id'] = NULL; + $items[] = $item; + } } // Sort items by _weight.