From 9d0824304f87e8840dc58423c3c81e002c6e9e23 Mon Sep 17 00:00:00 2001 From: Jon Goldberg Date: Thu, 28 Jul 2022 17:19:28 -0400 Subject: [PATCH] Improve AfformSubmission creation --- .../core/Civi/Api4/Action/Afform/Submit.php | 36 +++++++++++++++---- 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/ext/afform/core/Civi/Api4/Action/Afform/Submit.php b/ext/afform/core/Civi/Api4/Action/Afform/Submit.php index 64f802fbc8..7bf5a3f9aa 100644 --- a/ext/afform/core/Civi/Api4/Action/Afform/Submit.php +++ b/ext/afform/core/Civi/Api4/Action/Afform/Submit.php @@ -26,6 +26,15 @@ class Submit extends AbstractProcessor { protected $values; protected function processForm() { + // Save submission record + if (!empty($this->_afform['create_submission'])) { + $submission = AfformSubmission::create(FALSE) + ->addValue('contact_id', \CRM_Core_Session::getLoggedInContactID()) + ->addValue('afform_name', $this->name) + ->addValue('data', $this->getValues()) + ->execute()->first(); + } + $entityValues = []; foreach ($this->_formDataModel->getEntities() as $entityName => $entity) { $entityValues[$entityName] = []; @@ -67,13 +76,13 @@ class Submit extends AbstractProcessor { \Civi::dispatcher()->dispatch('civi.afform.submit', $event); } - // Save submission record + $submissionData = $this->array_insert($this->getValues(), $this->_entityIds); + // Update submission record with entity IDs. if (!empty($this->_afform['create_submission'])) { - $submission = AfformSubmission::create(FALSE) - ->addValue('contact_id', \CRM_Core_Session::getLoggedInContactID()) - ->addValue('afform_name', $this->name) - ->addValue('data', $this->_entityIds) - ->execute()->first(); + AfformSubmission::update(FALSE) + ->addWhere('id', '=', $submission['id']) + ->addValue('data', $submissionData) + ->execute(); } // Return ids and a token for uploading files @@ -82,6 +91,21 @@ 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; + } + } + return($arr); + } + /** * Replace Entity reference fields with the id of the referenced entity. * @param string $entityName -- 2.25.1