'', 'sessions' => [], 'option_sessions' => [], ]; // Populate Object foreach ($all as $key => $value) $request->{$key} = $value; // Return Object return $request; } /** * @param array $data * @return array */ private static function submittedValues(array $data): array { $values = []; foreach (['id', 'step', 'offering', 'date', 'time', 'method', 'coupon', 'skippable', 'gateway', 'prev'] as $key) { if (!isset($data[$key]) || !is_scalar($data[$key])) continue; $values[$key] = sanitize_text_field((string) $data[$key]); } // Clean nested submitted/decoded values before they reach the Draft. // The Draft setters and CustomFields then apply field-specific rules. foreach (['sessions', 'option_sessions', 'options', 'resources', 'form', 'participants', 'registration'] as $key) { if (isset($data[$key]) && is_array($data[$key])) $values[$key] = Input::sanitize($data[$key]); } return $values; } /** * @return mixed[] */ private static function prefill(): array { $offering_id = self::offeringId(); if ($offering_id <= 0) return []; $prefill = [ 'offering' => $offering_id, ]; $session = self::sessionQueryString(); if ($session !== '') $prefill['sessions'] = [$session]; $date = self::queryString(PageResolver::QUERY_DATE); if ($date !== '') $prefill['date'] = $date; $time = self::queryString(PageResolver::QUERY_TIME); if ($time !== '') $prefill['time'] = $time; if ($session !== '' && ($date === '' || $time === '')) { $parts = self::sessionLocalParts($offering_id, $session); if ($date === '' && isset($parts['date'])) $prefill['date'] = $parts['date']; if ($time === '' && isset($parts['time'])) $prefill['time'] = $parts['time']; } return $prefill; } private static function offeringId(): int { if (isset($_GET[PageResolver::QUERY_OFFERING]) && is_scalar($_GET[PageResolver::QUERY_OFFERING])) { return absint(wp_unslash((string) $_GET[PageResolver::QUERY_OFFERING])); } $queried_id = (int) get_queried_object_id(); if ($queried_id > 0 && get_post_type($queried_id) === OfferingPost::PT) return $queried_id; return 0; } private static function queryString(string $key): string { if (!isset($_GET[$key]) || !is_scalar($_GET[$key])) return ''; return sanitize_text_field(wp_unslash((string) $_GET[$key])); } private static function sessionQueryString(): string { $session = self::queryString(PageResolver::QUERY_SESSION); if ($session === '') { $requested = get_query_var(Slug::sessions()); $session = is_scalar($requested) ? sanitize_text_field((string) $requested) : ''; } if ($session === '') return ''; return self::normalizeSession($session); } private static function normalizeSession(string $session): string { if (preg_match('/^\d{14}$/', $session)) { $datetime = DateTimeImmutable::createFromFormat('!YmdHis', $session, new DateTimeZone('UTC')); if ($datetime instanceof DateTimeImmutable) return $datetime->format(DateTimeFormat::tech()); } if (preg_match('/^\d{8}T\d{6}$/', $session)) { $datetime = DateTimeImmutable::createFromFormat('!Ymd\THis', $session, new DateTimeZone('UTC')); if ($datetime instanceof DateTimeImmutable) return $datetime->format(DateTimeFormat::tech()); } return $session; } /** * @return array{date?: string, time?: string} */ private static function sessionLocalParts(int $offering_id, string $session): array { try { $offering = new Offering($offering_id, DayTidyConfig::general()); $datetime = new DateTime($session, new DateTimeZone('UTC')); return [ 'date' => $datetime->toTimezone(DateFormat::tech(), $offering->getTimeZone()), 'time' => $datetime->toTimezone(TimeFormat::tech(), $offering->getTimeZone()), ]; } catch (Exception $e) { return []; } } }