$params Request params with decoded `values` array * @param array $uploadedFiles From {@see SubmissionMultipartReader::resolveUploadedFiles()} * @param array<\IvyForms\Entity\Field\Field> $formFields * * @return array */ public function mergeUploadedFilesIntoValues( array $params, array $uploadedFiles, array $formFields ): array { if ($uploadedFiles === [] || !$this->hasMergeableValues($params)) { unset($params['ivyforms_fm']); return $params; } $mapRaw = isset($params['ivyforms_fm']) ? $params['ivyforms_fm'] : ''; unset($params['ivyforms_fm']); if (!is_string($mapRaw) || $mapRaw === '') { return $params; } $decodedMap = SubmissionMultipartReader::decodeFileParamMap($mapRaw); $this->ensureUploadHelpersLoaded(); $this->assertUploadCountsBeforePersist($uploadedFiles, $decodedMap, $formFields); $byLogicalKey = SubmissionUploadFilePersister::collectUploadedUrls( $uploadedFiles, $decodedMap, $formFields ); return $this->applyUploadedUrls($params, $byLogicalKey); } /** * @param array $params * @param array $byLogicalKey * * @return array */ private function applyUploadedUrls(array $params, array $byLogicalKey): array { foreach ($byLogicalKey as $logicalKey => $urls) { if ($urls === []) { continue; } $params['values'][$logicalKey] = count($urls) === 1 ? $urls[0] : wp_json_encode($urls); } return $params; } /** * @param array $uploadedFiles * @param array $decodedMap * @param array $formFields */ private function assertUploadCountsBeforePersist( array $uploadedFiles, array $decodedMap, array $formFields ): void { $countsByKey = SubmissionMultipartReader::groupUploadCountsByLogicalKey($uploadedFiles, $decodedMap); foreach ($countsByKey as $logicalKey => $count) { if ($count === 0) { continue; } $fieldEntity = SubmissionUploadFileValidator::findFieldForUploadKey($formFields, $logicalKey); SubmissionUploadFileValidator::assertUploadCountWithinLimits($count, $fieldEntity, $logicalKey); } } /** * @param array $params */ private function hasMergeableValues(array $params): bool { return array_key_exists('values', $params) && is_array($params['values']); } private function ensureUploadHelpersLoaded(): void { if (!function_exists('wp_handle_upload')) { require_once ABSPATH . 'wp-admin/includes/file.php'; } } }