\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)
/**
* 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;
}
/**
$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)
->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']]);
->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']);
}
}