From 5000144b07be72b9406dd96dd1819dce5b8f2ef1 Mon Sep 17 00:00:00 2001
From: ad0z <a0z@noreply.codeberg.org>
Date: Sat, 25 Jan 2025 13:48:56 +0100
Subject: [PATCH 1/3] Issue #2973170: disable "Autocreate entity" for file
 target

---
 src/Feeds/Target/EntityReference.php | 48 ++++++++++++++++++----------
 src/Feeds/Target/File.php            |  7 ++++
 2 files changed, 39 insertions(+), 16 deletions(-)

diff --git a/src/Feeds/Target/EntityReference.php b/src/Feeds/Target/EntityReference.php
index 25c2fec2..083e3336 100644
--- a/src/Feeds/Target/EntityReference.php
+++ b/src/Feeds/Target/EntityReference.php
@@ -322,7 +322,7 @@ class EntityReference extends FieldTargetBase implements ConfigurableTargetInter
       return $target_ids;
     }
 
-    if ($this->configuration['autocreate'] && $field === $this->getLabelKey()) {
+    if ($this->hasAutocreateSupport() && $this->configuration['autocreate'] && $field === $this->getLabelKey()) {
       return [$this->createEntity($search)];
     }
 
@@ -362,18 +362,32 @@ class EntityReference extends FieldTargetBase implements ConfigurableTargetInter
     return $entity->id();
   }
 
+  /**
+   * Determines if given target has auto create support.
+   *
+   * @return bool
+   *   TRUE if supported, FALSE otherwise.
+   */
+  protected function hasAutocreateSupport() {
+    return TRUE;
+  }
+
   /**
    * {@inheritdoc}
    */
   public function defaultConfiguration() {
     $config = parent::defaultConfiguration() + [
-      'reference_by' => $this->getLabelKey(),
-      'autocreate' => FALSE,
-      'autocreate_bundle' => FALSE,
-    ];
+        'reference_by' => $this->getLabelKey(),
+        'autocreate' => FALSE,
+        'autocreate_bundle' => FALSE,
+      ];
     if (array_key_exists('feeds_item', $this->getPotentialFields())) {
       $config['feeds_item'] = FALSE;
     }
+    if ($this->hasAutocreateSupport()) {
+      $config['autocreate'] = FALSE;
+      $config['autocreate_bundle'] = FALSE;
+    }
     return $config;
   }
 
@@ -425,18 +439,20 @@ class EntityReference extends FieldTargetBase implements ConfigurableTargetInter
       ],
     ];
 
-    $form['autocreate'] = [
-      '#type' => 'checkbox',
-      '#title' => $this->t('Autocreate entity'),
-      '#default_value' => $this->configuration['autocreate'],
-      '#states' => [
-        'visible' => [
-          ':input[name="mappings[' . $delta . '][settings][reference_by]"]' => [
-            'value' => $this->getLabelKey(),
+    if ($this->hasAutocreateSupport()) {
+      $form['autocreate'] = [
+        '#type' => 'checkbox',
+        '#title' => $this->t('Autocreate entity'),
+        '#default_value' => $this->configuration['autocreate'],
+        '#states' => [
+          'visible' => [
+            ':input[name="mappings[' . $delta . '][settings][reference_by]"]' => [
+              'value' => $this->getLabelKey(),
+            ],
           ],
         ],
-      ],
-    ];
+      ];
+    }
 
     $bundles = $this->getBundles();
     if (count($bundles) > 0) {
@@ -488,7 +504,7 @@ class EntityReference extends FieldTargetBase implements ConfigurableTargetInter
       ];
     }
 
-    if ($this->configuration['reference_by'] === $this->getLabelKey()) {
+    if ($this->hasAutocreateSupport() && $this->configuration['reference_by'] === $this->getLabelKey()) {
       $create = $this->configuration['autocreate'] ? $this->t('Yes') : $this->t('No');
       $summary[] = $this->t('Autocreate entities: %create', ['%create' => $create]);
       if ($this->configuration['autocreate'] && in_array($this->configuration['autocreate_bundle'], $this->getBundles())) {
diff --git a/src/Feeds/Target/File.php b/src/Feeds/Target/File.php
index b4592634..b86ad3e4 100644
--- a/src/Feeds/Target/File.php
+++ b/src/Feeds/Target/File.php
@@ -415,4 +415,11 @@ class File extends EntityReference {
     }
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  protected function hasAutocreateSupport() {
+    return FALSE;
+  }
+
 }
-- 
GitLab


From 5873374eef932a39e028dbc161e324a6ef2eb187 Mon Sep 17 00:00:00 2001
From: ad0z <a0z@noreply.codeberg.org>
Date: Wed, 29 Jan 2025 21:31:47 +0100
Subject: [PATCH 2/3] Issue #2973170: update
 EntityReference::defaultConfiguration, update tests

---
 src/Feeds/Target/EntityReference.php                      | 2 --
 tests/src/Functional/Feeds/Target/EntityReferenceTest.php | 2 ++
 tests/src/Functional/Feeds/Target/FileTest.php            | 4 ++++
 3 files changed, 6 insertions(+), 2 deletions(-)

diff --git a/src/Feeds/Target/EntityReference.php b/src/Feeds/Target/EntityReference.php
index 083e3336..6fe733b0 100644
--- a/src/Feeds/Target/EntityReference.php
+++ b/src/Feeds/Target/EntityReference.php
@@ -378,8 +378,6 @@ class EntityReference extends FieldTargetBase implements ConfigurableTargetInter
   public function defaultConfiguration() {
     $config = parent::defaultConfiguration() + [
         'reference_by' => $this->getLabelKey(),
-        'autocreate' => FALSE,
-        'autocreate_bundle' => FALSE,
       ];
     if (array_key_exists('feeds_item', $this->getPotentialFields())) {
       $config['feeds_item'] = FALSE;
diff --git a/tests/src/Functional/Feeds/Target/EntityReferenceTest.php b/tests/src/Functional/Feeds/Target/EntityReferenceTest.php
index 92ccc987..c7afc2b7 100644
--- a/tests/src/Functional/Feeds/Target/EntityReferenceTest.php
+++ b/tests/src/Functional/Feeds/Target/EntityReferenceTest.php
@@ -80,6 +80,8 @@ class EntityReferenceTest extends FeedsBrowserTestBase {
     $this->assertSession()->optionExists('mappings[2][settings][autocreate_bundle]', 'foo');
     $this->assertSession()->optionExists('mappings[2][settings][autocreate_bundle]', 'qux');
     $this->assertSession()->optionNotExists('mappings[2][settings][autocreate_bundle]', 'bar');
+    // Assert that autocreate field exists.
+    $this->assertSession()->fieldExists('mappings[2][settings][autocreate]');
   }
 
 }
diff --git a/tests/src/Functional/Feeds/Target/FileTest.php b/tests/src/Functional/Feeds/Target/FileTest.php
index d097d73e..a2dbe349 100644
--- a/tests/src/Functional/Feeds/Target/FileTest.php
+++ b/tests/src/Functional/Feeds/Target/FileTest.php
@@ -65,6 +65,10 @@ class FileTest extends FeedsBrowserTestBase {
       ],
     ]);
 
+    // Assert that autocreate field does not exist for file target.
+    $this->drupalGet('/admin/structure/feeds/manage/' . $feed_type->id() . '/mapping');
+    $this->assertSession()->fieldNotExists('mappings[2][settings][autocreate]');
+
     // Create a feed and import.
     $feed = $this->createFeed($feed_type->id(), [
       'source' => $this->getBaseUrl() . '/testing/feeds/files.csv',
-- 
GitLab


From fa17da3a7ac31ef7f1ec5be449dfd02d119c269e Mon Sep 17 00:00:00 2001
From: MegaChriz <megachriz@hotmail.com>
Date: Tue, 25 Feb 2025 12:33:28 +0100
Subject: [PATCH 3/3] Corrections and added test for the file target.

---
 src/Feeds/Target/EntityReference.php          | 48 +++++++++----------
 .../Feeds/Target/EntityReferenceTest.php      |  2 +-
 .../src/Functional/Feeds/Target/FileTest.php  | 36 ++++++++++++--
 3 files changed, 56 insertions(+), 30 deletions(-)

diff --git a/src/Feeds/Target/EntityReference.php b/src/Feeds/Target/EntityReference.php
index 6fe733b0..4705a34c 100644
--- a/src/Feeds/Target/EntityReference.php
+++ b/src/Feeds/Target/EntityReference.php
@@ -363,7 +363,7 @@ class EntityReference extends FieldTargetBase implements ConfigurableTargetInter
   }
 
   /**
-   * Determines if given target has auto create support.
+   * Determines if this target has autocreate support.
    *
    * @return bool
    *   TRUE if supported, FALSE otherwise.
@@ -377,8 +377,8 @@ class EntityReference extends FieldTargetBase implements ConfigurableTargetInter
    */
   public function defaultConfiguration() {
     $config = parent::defaultConfiguration() + [
-        'reference_by' => $this->getLabelKey(),
-      ];
+      'reference_by' => $this->getLabelKey(),
+    ];
     if (array_key_exists('feeds_item', $this->getPotentialFields())) {
       $config['feeds_item'] = FALSE;
     }
@@ -450,30 +450,30 @@ class EntityReference extends FieldTargetBase implements ConfigurableTargetInter
           ],
         ],
       ];
-    }
-
-    $bundles = $this->getBundles();
-    if (count($bundles) > 0) {
-
-      // Check that recent field configuration changes haven't invalidated any
-      // previous selection.
-      if (!in_array($this->configuration['autocreate_bundle'], $bundles)) {
-        $this->configuration['autocreate_bundle'] = reset($bundles);
-      }
 
-      $form['autocreate_bundle'] = [
-        '#type' => 'select',
-        '#title' => $this->t('Bundle to autocreate'),
-        '#options' => $bundles,
-        '#default_value' => $this->configuration['autocreate_bundle'],
-        '#states' => [
-          'visible' => [
-            ':input[name="mappings[' . $delta . '][settings][autocreate]"]' => [
-              ['checked' => TRUE, 'visible' => TRUE],
+      $bundles = $this->getBundles();
+      if (count($bundles) > 0) {
+
+        // Check that recent field configuration changes haven't invalidated any
+        // previous selection.
+        if (!in_array($this->configuration['autocreate_bundle'], $bundles)) {
+          $this->configuration['autocreate_bundle'] = reset($bundles);
+        }
+
+        $form['autocreate_bundle'] = [
+          '#type' => 'select',
+          '#title' => $this->t('Bundle to autocreate'),
+          '#options' => $bundles,
+          '#default_value' => $this->configuration['autocreate_bundle'],
+          '#states' => [
+            'visible' => [
+              ':input[name="mappings[' . $delta . '][settings][autocreate]"]' => [
+                ['checked' => TRUE, 'visible' => TRUE],
+              ],
             ],
           ],
-        ],
-      ];
+        ];
+      }
     }
 
     return $form;
diff --git a/tests/src/Functional/Feeds/Target/EntityReferenceTest.php b/tests/src/Functional/Feeds/Target/EntityReferenceTest.php
index c7afc2b7..fb5aef92 100644
--- a/tests/src/Functional/Feeds/Target/EntityReferenceTest.php
+++ b/tests/src/Functional/Feeds/Target/EntityReferenceTest.php
@@ -80,7 +80,7 @@ class EntityReferenceTest extends FeedsBrowserTestBase {
     $this->assertSession()->optionExists('mappings[2][settings][autocreate_bundle]', 'foo');
     $this->assertSession()->optionExists('mappings[2][settings][autocreate_bundle]', 'qux');
     $this->assertSession()->optionNotExists('mappings[2][settings][autocreate_bundle]', 'bar');
-    // Assert that autocreate field exists.
+    // Assert that the autocreate field exists.
     $this->assertSession()->fieldExists('mappings[2][settings][autocreate]');
   }
 
diff --git a/tests/src/Functional/Feeds/Target/FileTest.php b/tests/src/Functional/Feeds/Target/FileTest.php
index a2dbe349..ddb1ac7e 100644
--- a/tests/src/Functional/Feeds/Target/FileTest.php
+++ b/tests/src/Functional/Feeds/Target/FileTest.php
@@ -39,7 +39,7 @@ class FileTest extends FeedsBrowserTestBase {
   /**
    * Tests importing several files.
    */
-  public function test() {
+  public function testImport() {
     // Create a feed type for importing nodes with files.
     $feed_type = $this->createFeedTypeForCsv([
       'title' => 'title',
@@ -65,10 +65,6 @@ class FileTest extends FeedsBrowserTestBase {
       ],
     ]);
 
-    // Assert that autocreate field does not exist for file target.
-    $this->drupalGet('/admin/structure/feeds/manage/' . $feed_type->id() . '/mapping');
-    $this->assertSession()->fieldNotExists('mappings[2][settings][autocreate]');
-
     // Create a feed and import.
     $feed = $this->createFeed($feed_type->id(), [
       'source' => $this->getBaseUrl() . '/testing/feeds/files.csv',
@@ -82,6 +78,36 @@ class FileTest extends FeedsBrowserTestBase {
     }
   }
 
+  /**
+   * Tests that configuring a file target on the mapping page works.
+   */
+  public function testConfigureTarget() {
+    // Create a feed type.
+    $feed_type = $this->createFeedTypeForCsv([
+      'guid' => 'guid',
+      'title' => 'title',
+    ]);
+
+    // Go to the mapping page, and a target to 'field_file'.
+    $edit = [
+      'add_target' => 'field_file',
+    ];
+    $this->drupalGet('/admin/structure/feeds/manage/' . $feed_type->id() . '/mapping');
+    $this->submitForm($edit, 'Save');
+
+    // Check editing target configuration.
+    $edit = [];
+    $this->submitForm($edit, 'target-settings-2');
+
+    // Assert that certain fields appear.
+    $this->assertSession()->fieldExists('mappings[2][settings][reference_by]');
+    $this->assertSession()->fieldExists('mappings[2][settings][existing]');
+
+    // Assert that the autocreate field does not exist, since the file target
+    // does not support that feature.
+    $this->assertSession()->fieldNotExists('mappings[2][settings][autocreate]');
+  }
+
   /**
    * Lists test files.
    */
-- 
GitLab