*/ public static function buildEntryData(int $formId): array { return [ 'formId' => $formId, 'userId' => get_current_user_id() ?: null, 'status' => Entry::DEFAULT_STATUS, 'ipAddress' => IpDetectionService::getUserIpAddress(), 'userAgent' => self::getUserAgent(), 'sourceURL' => self::getSourceURL(), ]; } /** * Get the value of a parent subfield. * * @param int $fieldId * @param int|null $parentId * @param array $submissionData * @param array $parentSubfieldKeys * @return mixed|null */ public static function getParentSubfieldValue( int $fieldId, ?int $parentId, array $submissionData, array $parentSubfieldKeys ) { if (!$parentId || !isset($parentSubfieldKeys[$fieldId])) { return null; } $subKey = $parentSubfieldKeys[$fieldId]; $parentValue = self::decodeSubmissionValue($submissionData[$parentId] ?? []); if (!isset($parentValue[$subKey])) { return null; } $val = $parentValue[$subKey]; return is_array($val) ? implode(', ', $val) : $val; } /** * Get the compound field value by combining child field values. * * @param int $fieldId * @param array> $parentChildrenMap * @param array $parentSubfieldKeys * @param array $submissionData * @return string */ public static function getCompoundFieldValue( int $fieldId, array $parentChildrenMap, array $parentSubfieldKeys, array $submissionData ): string { if (empty($parentChildrenMap[$fieldId])) { return ''; } $parentValue = self::decodeSubmissionValue($submissionData[$fieldId] ?? []); $childValues = []; foreach ($parentChildrenMap[$fieldId] as $childId) { $subKey = $parentSubfieldKeys[$childId] ?? null; if ($subKey !== null && isset($parentValue[$subKey]) && $parentValue[$subKey] !== '') { $val = $parentValue[$subKey]; $childValues[] = is_array($val) ? implode(', ', $val) : $val; } } return implode(' ', $childValues); } /** * Decode a submission value into an array. * Handles JSON strings (e.g., Likert submissions) and ensures an array is returned. * * @param mixed $value * @return array */ public static function decodeSubmissionValue($value): array { if (is_string($value)) { $decoded = json_decode($value, true); return is_array($decoded) ? $decoded : []; } return is_array($value) ? $value : []; } /** * Get the default field value from submission data. * * @param int $fieldId * @param array $submissionData * @return mixed|string */ public static function getDefaultFieldValue(int $fieldId, array $submissionData) { return $submissionData[$fieldId] ?? ''; } /** * Build parent-children map from form fields. * * @param array $formFields * @return array> */ public static function buildParentChildrenMap(array $formFields): array { $parentChildrenMap = []; foreach ($formFields as $field) { $parentId = method_exists($field, 'getParentId') ? $field->getParentId() : null; if ($parentId && $parentId > 0) { $parentChildrenMap[$parentId][] = $field->getId(); } } return $parentChildrenMap; } /** * Build subfield key map for each parent. * * @param array> $parentChildrenMap * @param array $submissionData * @param array $formFields * @return array */ public static function buildParentSubfieldKeys( array $parentChildrenMap, array $submissionData, array $formFields = [] ): array { $fieldById = []; foreach ($formFields as $field) { if (method_exists($field, 'getId')) { $fieldById[$field->getId()] = $field; } } $parentSubfieldKeys = []; foreach ($parentChildrenMap as $parentId => $childIds) { $parentValue = self::decodeSubmissionValue($submissionData[$parentId] ?? []); $keys = array_keys($parentValue); $orderedChildIds = NameFieldKeyHelper::sortChildIdsByDisplayOrder($childIds, $fieldById); foreach ($orderedChildIds as $i => $childId) { $subKey = NameFieldKeyHelper::resolveStoredNameSubfieldKey($fieldById[$childId] ?? null); if ($subKey === null) { $subKey = $keys[$i] ?? null; } $parentSubfieldKeys[$childId] = $subKey; } } return $parentSubfieldKeys; } }