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..a6951bb 100644 --- a/src/Plugin/Field/FieldWidget/InlineEntityFormBase.php +++ b/src/Plugin/Field/FieldWidget/InlineEntityFormBase.php @@ -319,6 +319,11 @@ abstract class InlineEntityFormBase extends WidgetBase implements ContainerFacto return $element; } + public static function addIefValidateCallbacks($element) { + $element['#ief_element_validate'][] = [get_called_class(), 'validateSaveEntity']; + return $element; + } + /** * Pre-render callback: Move form elements into fieldsets for presentation purposes. * @@ -395,6 +400,38 @@ abstract class InlineEntityFormBase extends WidgetBase implements ContainerFacto } /** + * {@inheritdoc} + */ + public static function validateSaveEntity($entity_form, FormStateInterface $form_state) { + $ief_id = $entity_form['#ief_id']; + $entity = $entity_form['#entity']; + + if ($entity_form['#op'] == 'add') { + // Determine the correct weight of the new element. + $weight = 0; + $entities = $form_state->get(['inline_entity_form', $ief_id, 'entities']); + if (!empty($entities)) { + $weight = max(array_keys($entities)) + 1; + } + // Add the entity to form state, mark it for saving, and close the form. + $entities[] = array( + 'entity' => $entity, + '_weight' => $weight, + 'form' => NULL, + 'needs_save' => TRUE, + ); + $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); + } + } + + /** * Checks if current submit is relevant for IEF. * * We need to save all referenced entities and extract their IDs into field diff --git a/src/Plugin/Field/FieldWidget/InlineEntityFormComplex.php b/src/Plugin/Field/FieldWidget/InlineEntityFormComplex.php index a7781ff..f68480a 100644 --- a/src/Plugin/Field/FieldWidget/InlineEntityFormComplex.php +++ b/src/Plugin/Field/FieldWidget/InlineEntityFormComplex.php @@ -318,6 +318,7 @@ class InlineEntityFormComplex extends InlineEntityFormBase implements ContainerF $element['entities'][$key]['form']['inline_entity_form']['#process'] = [ ['\Drupal\inline_entity_form\Element\InlineEntityForm', 'processEntityForm'], + [get_class($this), 'addIefValidateCallbacks'], [get_class($this), 'addIefSubmitCallbacks'], [get_class($this), 'buildEntityFormActions'], ]; @@ -515,6 +516,7 @@ class InlineEntityFormComplex extends InlineEntityFormBase implements ContainerF ]; $element['form']['inline_entity_form']['#process'] = [ ['\Drupal\inline_entity_form\Element\InlineEntityForm', 'processEntityForm'], + [get_class($this), 'addIefValidateCallbacks'], [get_class($this), 'addIefSubmitCallbacks'], [get_class($this), 'buildEntityFormActions'], ]; @@ -655,6 +657,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.