From 5db3928dfa1b494ccba6c088134e518c357911bc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=BCrgen=20Haas?=
 <21467-jurgenhaas@users.noreply.drupalcode.org>
Date: Thu, 22 Aug 2024 13:25:57 +0000
Subject: [PATCH 01/11] Issue #3469697 by jurgenhaas: ECA Form breaks complex
 IEF widget

---
 modules/form/src/HookHandler.php | 22 ++++++++++++----------
 1 file changed, 12 insertions(+), 10 deletions(-)

diff --git a/modules/form/src/HookHandler.php b/modules/form/src/HookHandler.php
index b67d9394e..e9a470af8 100644
--- a/modules/form/src/HookHandler.php
+++ b/modules/form/src/HookHandler.php
@@ -202,16 +202,18 @@ class HookHandler extends BaseHookHandler {
 
     try {
       $form['#entity'] = clone $entity;
-      $original_triggering_element = $form_state->getTriggeringElement();
-      $form_state->setTriggeringElement([
-        '#limit_validation_errors' => [],
-      ]);
-      /** @var \Drupal\Core\Form\FormValidatorInterface $validator */
-      $validator = \Drupal::service('form_validator');
-      $form_state->setValidationEnforced(TRUE);
-      $validator->validateForm(\Drupal::formBuilder()->getFormId($form_state->getFormObject(), $form_state), $form, $form_state);
-      $form_state->setTriggeringElement($original_triggering_element);
-      $form_state->setValidationEnforced(TRUE);
+      if ($form['#eca_ief_info']['widget_plugin_id'] !== 'inline_entity_form_complex') {
+        $original_triggering_element = $form_state->getTriggeringElement();
+        $form_state->setTriggeringElement([
+          '#limit_validation_errors' => [],
+        ]);
+        /** @var \Drupal\Core\Form\FormValidatorInterface $validator */
+        $validator = \Drupal::service('form_validator');
+        $form_state->setValidationEnforced(TRUE);
+        $validator->validateForm(\Drupal::formBuilder()->getFormId($form_state->getFormObject(), $form_state), $form, $form_state);
+        $form_state->setTriggeringElement($original_triggering_element);
+        $form_state->setValidationEnforced(TRUE);
+      }
 
       /** @var \Drupal\inline_entity_form\InlineFormInterface $handler */
       $handler = \Drupal::entityTypeManager()->getHandler($form['#entity']->getEntityTypeId(), 'inline_form');
-- 
GitLab


From c1da0d41e4fdf6bcf0987e5d7230da2588622fd9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=BCrgen=20Haas?=
 <21467-jurgenhaas@users.noreply.drupalcode.org>
Date: Thu, 22 Aug 2024 16:00:57 +0000
Subject: [PATCH 02/11] Downgrading logger message to warning

---
 modules/form/src/HookHandler.php | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/modules/form/src/HookHandler.php b/modules/form/src/HookHandler.php
index e9a470af8..3373e4e20 100644
--- a/modules/form/src/HookHandler.php
+++ b/modules/form/src/HookHandler.php
@@ -228,7 +228,7 @@ class HookHandler extends BaseHookHandler {
       ], $form['#entity']);
     }
     catch (\Throwable $t) {
-      \Drupal::logger('eca_form')->error("An error occurred while trying to build an inline entity from submitted form values. This might be a problem in case you use ECA to extend inline entity forms. Please report this to the ECA issue queue to help us improving it.");
+      \Drupal::logger('eca_form')->warning("An error occurred while trying to build an inline entity from submitted form values. This might be a problem in case you use ECA to extend inline entity forms. Please report this to the ECA issue queue to help us improving it.");
     }
 
     // Info is not needed anymore, remove it to prevent unnecessary bloat.
-- 
GitLab


From 1f3d21b08af14d6388de270f7e77184a47e9f5d2 Mon Sep 17 00:00:00 2001
From: lexsoft <lex.soft.0.0@gmail.com>
Date: Tue, 12 Nov 2024 14:25:01 +0000
Subject: [PATCH 03/11] Issue #3469697 by jurgenhaas: ECA Form breaks complex
 IEF widget - ensure broader compatibility

---
 modules/form/src/HookHandler.php | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/modules/form/src/HookHandler.php b/modules/form/src/HookHandler.php
index 3373e4e20..32b2669b6 100644
--- a/modules/form/src/HookHandler.php
+++ b/modules/form/src/HookHandler.php
@@ -202,7 +202,7 @@ class HookHandler extends BaseHookHandler {
 
     try {
       $form['#entity'] = clone $entity;
-      if ($form['#eca_ief_info']['widget_plugin_id'] !== 'inline_entity_form_complex') {
+      if (!str_starts_with($form['#eca_ief_info']['widget_plugin_id'], 'inline_entity_form_complex')) {
         $original_triggering_element = $form_state->getTriggeringElement();
         $form_state->setTriggeringElement([
           '#limit_validation_errors' => [],
-- 
GitLab


From efcab1c7311d20e029bc85cf93f496873cbd18a9 Mon Sep 17 00:00:00 2001
From: John Locke <john@freelock.com>
Date: Fri, 4 Apr 2025 11:01:07 -0700
Subject: [PATCH 04/11] Issue #3469697 by jurgenhaas: ECA Form breaks complex
 IEF widget

---
 modules/form/src/HookHandler.php | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/modules/form/src/HookHandler.php b/modules/form/src/HookHandler.php
index 32b2669b6..4354c1be7 100644
--- a/modules/form/src/HookHandler.php
+++ b/modules/form/src/HookHandler.php
@@ -268,10 +268,14 @@ class HookHandler extends BaseHookHandler {
     else {
       return;
     }
+    $delta = $form_state->getTriggeringElement()['#ief_row_delta'];
+    if (is_null($delta)) {
+      return;
+    }
     $info = [
       'parent' => $context['items']->getEntity(),
       'field_name' => $context['items']->getFieldDefinition()->getName(),
-      'delta' => $context['delta'],
+      'delta' => $delta,
       'widget_plugin_id' => $context['widget']->getPluginId(),
     ];
     $entity_form['#eca_ief_info'] = &$info;
-- 
GitLab


From 1ba6a3fb4e9efac76f05b10dd81589c02f573177 Mon Sep 17 00:00:00 2001
From: John Locke <john@freelock.com>
Date: Sat, 5 Apr 2025 11:10:58 -0700
Subject: [PATCH 05/11] Issue #3469697 by jurgenhaas: ECA Form breaks complex
 IEF widget - fix test to specify delta the same way IEF does

---
 modules/form/tests/src/Kernel/InlineEntityFormTest.php | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/modules/form/tests/src/Kernel/InlineEntityFormTest.php b/modules/form/tests/src/Kernel/InlineEntityFormTest.php
index bf7737dc6..e2339f656 100644
--- a/modules/form/tests/src/Kernel/InlineEntityFormTest.php
+++ b/modules/form/tests/src/Kernel/InlineEntityFormTest.php
@@ -81,6 +81,10 @@ class InlineEntityFormTest extends KernelTestBase {
     $form_object = \Drupal::entityTypeManager()->getFormObject('node', 'edit');
     $form_object->setEntity($article);
     $form_state = new FormState();
+
+    // IEF delta is found using the triggeringElement -- without this, no default entity is loaded.
+    $form_state->setTriggeringElement(['#ief_row_delta' => 0]);
+
     $form = \Drupal::formBuilder()->buildForm($form_object, $form_state);
 
     $this->assertTrue($form['field_pages']['widget'][0]['inline_entity_form']['title']['widget'][0]['#disabled'], "The model has set the title field to be disabled.");
-- 
GitLab


From 51359ef3eaa64a1fb8e46a201f90fdc02e5f27cf Mon Sep 17 00:00:00 2001
From: John Locke <john@freelock.com>
Date: Sat, 5 Apr 2025 12:47:21 -0700
Subject: [PATCH 06/11] Issue #3469697 by jurgenhaas: ECA Form breaks complex
 IEF widget - fix cs issue (line too long)

---
 modules/form/tests/src/Kernel/InlineEntityFormTest.php | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/modules/form/tests/src/Kernel/InlineEntityFormTest.php b/modules/form/tests/src/Kernel/InlineEntityFormTest.php
index e2339f656..f1e7b9de4 100644
--- a/modules/form/tests/src/Kernel/InlineEntityFormTest.php
+++ b/modules/form/tests/src/Kernel/InlineEntityFormTest.php
@@ -82,7 +82,8 @@ class InlineEntityFormTest extends KernelTestBase {
     $form_object->setEntity($article);
     $form_state = new FormState();
 
-    // IEF delta is found using the triggeringElement -- without this, no default entity is loaded.
+    // IEF delta is found using the triggeringElement --
+    // without this, no default entity is loaded.
     $form_state->setTriggeringElement(['#ief_row_delta' => 0]);
 
     $form = \Drupal::formBuilder()->buildForm($form_object, $form_state);
-- 
GitLab


From ad408565981430acfcb5827b883b082846bb9eac Mon Sep 17 00:00:00 2001
From: John Locke <john@freelock.com>
Date: Tue, 8 Apr 2025 01:01:59 -0700
Subject: [PATCH 07/11] Issue #3469697 by jurgenhaas: ECA Form breaks complex
 IEF widget - fix ComplexInlineEntityForm

---
 modules/form/src/HookHandler.php              | 28 ++++++++++++++-----
 .../tests/src/Kernel/InlineEntityFormTest.php |  4 ---
 2 files changed, 21 insertions(+), 11 deletions(-)

diff --git a/modules/form/src/HookHandler.php b/modules/form/src/HookHandler.php
index a18124881..15a2c4cae 100644
--- a/modules/form/src/HookHandler.php
+++ b/modules/form/src/HookHandler.php
@@ -259,12 +259,30 @@ class HookHandler extends BaseHookHandler {
       return;
     }
 
+    $plugin_id = $context['widget']->getPluginId();
+    $add_complex = false;
+    // If plugin_id == 'inline_entity_form_simple', we can safely attach #entity and we have the correct #delta.
+    if ($plugin_id == 'inline_entity_form_simple') {
+      $delta = $context['delta'];
+    }
+    elseif ($plugin_id == 'inline_entity_form_complex') {
+      $trigger = $form_state->getTriggeringElement();
+      if (isset($trigger['#ief_form']) && $trigger['#ief_form'] == 'add') {
+        $delta = $context['items']->count();
+      } else {
+        $delta = $trigger['#ief_row_delta'];
+      }
+    }
+    else {
+      // unrecognized widget.
+      return;
+    }
     // Pass along information for ::alterInlineEntityForm().
     if (isset($element['inline_entity_form'])) {
       $entity_form = &$element['inline_entity_form'];
     }
-    elseif (isset($element['entities'][$context['delta']]['form']['inline_entity_form'])) {
-      $entity_form = &$element['entities'][$context['delta']]['form']['inline_entity_form'];
+    elseif (isset($element['entities'][$delta]['form']['inline_entity_form'])) {
+      $entity_form = &$element['entities'][$delta]['form']['inline_entity_form'];
     }
     elseif (isset($element['form']['inline_entity_form'])) {
       $entity_form = &$element['form']['inline_entity_form'];
@@ -272,15 +290,11 @@ class HookHandler extends BaseHookHandler {
     else {
       return;
     }
-    $delta = $form_state->getTriggeringElement()['#ief_row_delta'];
-    if (is_null($delta)) {
-      return;
-    }
     $info = [
       'parent' => $context['items']->getEntity(),
       'field_name' => $context['items']->getFieldDefinition()->getName(),
       'delta' => $delta,
-      'widget_plugin_id' => $context['widget']->getPluginId(),
+      'widget_plugin_id' => $plugin_id,
     ];
     $entity_form['#eca_ief_info'] = &$info;
 
diff --git a/modules/form/tests/src/Kernel/InlineEntityFormTest.php b/modules/form/tests/src/Kernel/InlineEntityFormTest.php
index f1e7b9de4..745fafb65 100644
--- a/modules/form/tests/src/Kernel/InlineEntityFormTest.php
+++ b/modules/form/tests/src/Kernel/InlineEntityFormTest.php
@@ -82,10 +82,6 @@ class InlineEntityFormTest extends KernelTestBase {
     $form_object->setEntity($article);
     $form_state = new FormState();
 
-    // IEF delta is found using the triggeringElement --
-    // without this, no default entity is loaded.
-    $form_state->setTriggeringElement(['#ief_row_delta' => 0]);
-
     $form = \Drupal::formBuilder()->buildForm($form_object, $form_state);
 
     $this->assertTrue($form['field_pages']['widget'][0]['inline_entity_form']['title']['widget'][0]['#disabled'], "The model has set the title field to be disabled.");
-- 
GitLab


From dab6976144cea266201fe0a1747c2e5d6c41a939 Mon Sep 17 00:00:00 2001
From: John Locke <john@freelock.com>
Date: Tue, 8 Apr 2025 09:12:32 -0700
Subject: [PATCH 08/11] Issue #3469697 by jurgenhaas: ECA Form breaks complex
 IEF widget - phpcs issues

---
 modules/form/src/HookHandler.php | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/modules/form/src/HookHandler.php b/modules/form/src/HookHandler.php
index 15a2c4cae..75c0e9378 100644
--- a/modules/form/src/HookHandler.php
+++ b/modules/form/src/HookHandler.php
@@ -260,8 +260,9 @@ class HookHandler extends BaseHookHandler {
     }
 
     $plugin_id = $context['widget']->getPluginId();
-    $add_complex = false;
-    // If plugin_id == 'inline_entity_form_simple', we can safely attach #entity and we have the correct #delta.
+    $add_complex = FALSE;
+    // If plugin_id == 'inline_entity_form_simple', we can safely attach #entity
+    // and we have the correct #delta.
     if ($plugin_id == 'inline_entity_form_simple') {
       $delta = $context['delta'];
     }
@@ -269,12 +270,13 @@ class HookHandler extends BaseHookHandler {
       $trigger = $form_state->getTriggeringElement();
       if (isset($trigger['#ief_form']) && $trigger['#ief_form'] == 'add') {
         $delta = $context['items']->count();
-      } else {
+      }
+      else {
         $delta = $trigger['#ief_row_delta'];
       }
     }
     else {
-      // unrecognized widget.
+      // Unrecognized widget.
       return;
     }
     // Pass along information for ::alterInlineEntityForm().
-- 
GitLab


From a01c0d8f319a9066ea28606486531d988a521bcc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=BCrgen=20Haas?=
 <21467-jurgenhaas@users.noreply.drupalcode.org>
Date: Thu, 10 Apr 2025 14:11:17 +0000
Subject: [PATCH 09/11] Apply 2 suggestion(s) to 2 file(s)

---
 modules/form/src/HookHandler.php                       | 8 ++++----
 modules/form/tests/src/Kernel/InlineEntityFormTest.php | 1 -
 2 files changed, 4 insertions(+), 5 deletions(-)

diff --git a/modules/form/src/HookHandler.php b/modules/form/src/HookHandler.php
index 75c0e9378..4f7986723 100644
--- a/modules/form/src/HookHandler.php
+++ b/modules/form/src/HookHandler.php
@@ -261,14 +261,14 @@ class HookHandler extends BaseHookHandler {
 
     $plugin_id = $context['widget']->getPluginId();
     $add_complex = FALSE;
-    // If plugin_id == 'inline_entity_form_simple', we can safely attach #entity
+    // If plugin_id === 'inline_entity_form_simple', we can safely attach #entity
     // and we have the correct #delta.
-    if ($plugin_id == 'inline_entity_form_simple') {
+    if ($plugin_id === 'inline_entity_form_simple') {
       $delta = $context['delta'];
     }
-    elseif ($plugin_id == 'inline_entity_form_complex') {
+    elseif ($plugin_id === 'inline_entity_form_complex') {
       $trigger = $form_state->getTriggeringElement();
-      if (isset($trigger['#ief_form']) && $trigger['#ief_form'] == 'add') {
+      if (isset($trigger['#ief_form']) && $trigger['#ief_form'] === 'add') {
         $delta = $context['items']->count();
       }
       else {
diff --git a/modules/form/tests/src/Kernel/InlineEntityFormTest.php b/modules/form/tests/src/Kernel/InlineEntityFormTest.php
index 745fafb65..bf7737dc6 100644
--- a/modules/form/tests/src/Kernel/InlineEntityFormTest.php
+++ b/modules/form/tests/src/Kernel/InlineEntityFormTest.php
@@ -81,7 +81,6 @@ class InlineEntityFormTest extends KernelTestBase {
     $form_object = \Drupal::entityTypeManager()->getFormObject('node', 'edit');
     $form_object->setEntity($article);
     $form_state = new FormState();
-
     $form = \Drupal::formBuilder()->buildForm($form_object, $form_state);
 
     $this->assertTrue($form['field_pages']['widget'][0]['inline_entity_form']['title']['widget'][0]['#disabled'], "The model has set the title field to be disabled.");
-- 
GitLab


From 86fab8bc6ff497a1a3c35e2a778b98c0ab333c65 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?J=C3=BCrgen=20Haas?=
 <21467-jurgenhaas@users.noreply.drupalcode.org>
Date: Thu, 10 Apr 2025 14:21:58 +0000
Subject: [PATCH 10/11] Apply 1 suggestion(s) to 1 file(s)

---
 modules/form/src/HookHandler.php | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/modules/form/src/HookHandler.php b/modules/form/src/HookHandler.php
index 4f7986723..37f309736 100644
--- a/modules/form/src/HookHandler.php
+++ b/modules/form/src/HookHandler.php
@@ -261,8 +261,8 @@ class HookHandler extends BaseHookHandler {
 
     $plugin_id = $context['widget']->getPluginId();
     $add_complex = FALSE;
-    // If plugin_id === 'inline_entity_form_simple', we can safely attach #entity
-    // and we have the correct #delta.
+    // If plugin_id === 'inline_entity_form_simple', we can safely attach
+    // #entity and we have the correct #delta.
     if ($plugin_id === 'inline_entity_form_simple') {
       $delta = $context['delta'];
     }
-- 
GitLab


From bb3b5ea46ed93aa991e9a45b436345b9cf2faf1f Mon Sep 17 00:00:00 2001
From: mxh <webit.haupt@googlemail.com>
Date: Sat, 12 Apr 2025 09:15:26 +0200
Subject: [PATCH 11/11] Issue #3469697 by freelock, jurgenhaas, lexsoft, mxh:
 ECA Form breaks complex IEF widget

---
 modules/form/src/HookHandler.php | 33 +++++++++++++++++---------------
 1 file changed, 18 insertions(+), 15 deletions(-)

diff --git a/modules/form/src/HookHandler.php b/modules/form/src/HookHandler.php
index 37f309736..267632642 100644
--- a/modules/form/src/HookHandler.php
+++ b/modules/form/src/HookHandler.php
@@ -259,26 +259,29 @@ class HookHandler extends BaseHookHandler {
       return;
     }
 
-    $plugin_id = $context['widget']->getPluginId();
-    $add_complex = FALSE;
-    // If plugin_id === 'inline_entity_form_simple', we can safely attach
-    // #entity and we have the correct #delta.
-    if ($plugin_id === 'inline_entity_form_simple') {
-      $delta = $context['delta'];
-    }
-    elseif ($plugin_id === 'inline_entity_form_complex') {
-      $trigger = $form_state->getTriggeringElement();
-      if (isset($trigger['#ief_form']) && $trigger['#ief_form'] === 'add') {
-        $delta = $context['items']->count();
+    $delta = $context['delta'] ?? NULL;
+    if (isset($element['#ief_id']) && ($triggering_element = &$form_state->getTriggeringElement())) {
+      if (isset($triggering_element['#ief_row_delta'])) {
+        $delta = $triggering_element['#ief_row_delta'];
       }
       else {
-        $delta = $trigger['#ief_row_delta'];
+        $entities = $form_state->get([
+          'inline_entity_form',
+          $element['#ief_id'],
+          'entities',
+        ]);
+        if (!empty($entities)) {
+          $delta = count($entities);
+        }
+        elseif (isset($triggering_element['#ief_form']) && $triggering_element['#ief_form'] === 'add') {
+          $delta = $context['items']->count();
+        }
       }
     }
-    else {
-      // Unrecognized widget.
+    if (!isset($delta)) {
       return;
     }
+
     // Pass along information for ::alterInlineEntityForm().
     if (isset($element['inline_entity_form'])) {
       $entity_form = &$element['inline_entity_form'];
@@ -296,7 +299,7 @@ class HookHandler extends BaseHookHandler {
       'parent' => $context['items']->getEntity(),
       'field_name' => $context['items']->getFieldDefinition()->getName(),
       'delta' => $delta,
-      'widget_plugin_id' => $plugin_id,
+      'widget_plugin_id' => $context['widget']->getPluginId(),
     ];
     $entity_form['#eca_ief_info'] = &$info;
 
-- 
GitLab