Afform Submission - Combine arrays, add test
authorColeman Watts <coleman@civicrm.org>
Mon, 12 Sep 2022 16:17:29 +0000 (12:17 -0400)
committerColeman Watts <coleman@civicrm.org>
Mon, 12 Sep 2022 21:52:07 +0000 (17:52 -0400)
ext/afform/core/Civi/Api4/Action/Afform/Submit.php
ext/afform/mock/tests/phpunit/api/v4/AfformContactUsageTest.php

index 7bf5a3f9aae5a43375953772cb1150f30d4719ad..9ab7a5177a5234f5492937ff301edc50113bab92 100644 (file)
@@ -76,7 +76,7 @@ class Submit extends AbstractProcessor {
       \Civi::dispatcher()->dispatch('civi.afform.submit', $event);
     }
 
-    $submissionData = $this->array_insert($this->getValues(), $this->_entityIds);
+    $submissionData = $this->combineValuesAndIds($this->getValues(), $this->_entityIds);
     // Update submission record with entity IDs.
     if (!empty($this->_afform['create_submission'])) {
       AfformSubmission::update(FALSE)
@@ -94,16 +94,20 @@ class Submit extends AbstractProcessor {
   /**
    * Recursively add entity IDs to the values.
    */
-  protected function array_insert($arr, $ins) {
-    if (is_array($arr) && is_array($ins)) foreach ($ins as $k => $v) {
-      if (isset($arr[$k]) && is_array($v) && is_array($arr[$k])) {
-        $arr[$k] = $this->array_insert($arr[$k], $v);
-      }
-      else {
-        $arr[$k] = $v;
+  protected function combineValuesAndIds($values, $ids, $isJoin = FALSE) {
+    $combined = [];
+    $values += array_fill_keys(array_keys($ids), []);
+    foreach ($values as $name => $value) {
+      foreach ($value as $idx => $val) {
+        $idData = $ids[$name][$idx] ?? [];
+        if (!$isJoin) {
+          $idData['_joins'] = $this->combineValuesAndIds($val['joins'] ?? [], $idData['_joins'] ?? [], TRUE);
+        }
+        $item = array_merge($isJoin ? $val : ($val['fields'] ?? []), $idData);
+        $combined[$name][$idx] = $item;
       }
     }
-    return($arr);
+    return $combined;
   }
 
   /**
index 6040704ff6f6535dcf8970245e9c3f8a27e2bfc9..1c1ba056c8f092ba6a9e0924e88da944c3db5312 100644 (file)
@@ -158,7 +158,11 @@ EOHTML;
 
     $this->assertEquals($this->formName, $submission['afform_name']);
     $this->assertIsInt($submission['data']['Activity1'][0]['id']);
+    $this->assertEquals('Individual1', $submission['data']['Activity1'][0]['subject']);
     $this->assertIsInt($submission['data']['Individual1'][0]['id']);
+    $this->assertEquals($firstName, $submission['data']['Individual1'][0]['first_name']);
+    $this->assertEquals('site', $submission['data']['Individual1'][0]['last_name']);
+    $this->assertEquals('This field is set in the data array', $submission['data']['Individual1'][0]['source']);
 
     // Check that Activity was submitted correctly.
     $activity = \Civi\Api4\Activity::get(FALSE)
@@ -170,7 +174,7 @@ EOHTML;
       ->execute()->first();
     $this->assertEquals($firstName, $contact['first_name']);
     $this->assertEquals('site', $contact['last_name']);
-    // Check that the data overrides form submsision
+    // Check that the data overrides form submission
     $this->assertEquals('Register A site', $contact['source']);
     // Check that the contact and the activity were correctly linked up as per the form.
     $this->callAPISuccessGetSingle('ActivityContact', ['contact_id' => $contact['id'], 'activity_id' => $activity['id']]);
@@ -342,7 +346,12 @@ EOHTML;
       ->execute()->single();
     $this->assertEquals($contact['id'], $submission['data']['Individual1'][0]['id']);
     $this->assertEquals($contact['org.id'], $submission['data']['Organization1'][0]['id']);
+    $this->assertEquals('Organization1', $submission['data']['Individual1'][0]['employer_id']);
     $this->assertEquals($contact['email_primary'], $submission['data']['Individual1'][0]['_joins']['Email'][0]['id']);
+    $this->assertEquals($individualEmail, $submission['data']['Individual1'][0]['_joins']['Email'][0]['email']);
+    $this->assertEquals($locationType, $submission['data']['Individual1'][0]['_joins']['Email'][0]['location_type_id']);
+    $this->assertEquals($orgEmail, $submission['data']['Organization1'][0]['_joins']['Email'][0]['email']);
+    $this->assertEquals($locationType, $submission['data']['Organization1'][0]['_joins']['Email'][0]['location_type_id']);
   }
 
 }