validator = new FormValidator(); } /** * Przetwarza żądanie POST formularza * * @param FormEditViewModel $formViewModel * @param array $postData Dane z $_POST * @return array Wynik przetwarzania ['success' => bool, 'errors' => array, 'data' => array] */ public function handleSubmit(FormEditViewModel $formViewModel, array $postData): array { $result = [ 'success' => false, 'errors' => [], 'data' => [] ]; // Walidacja CSRF $csrfToken = isset($postData['_csrf_token']) ? (string) $postData['_csrf_token'] : ''; if (!\Shared\Security\CsrfToken::validate($csrfToken)) { $result['errors'] = ['csrf' => 'Nieprawidłowy token bezpieczeństwa. Odśwież stronę i spróbuj ponownie.']; return $result; } // Walidacja $errors = $this->validator->validate($postData, $formViewModel->fields, $formViewModel->languages); if (!empty($errors)) { $result['errors'] = $errors; // Zapisz dane do persist przy błędzie walidacji if ($formViewModel->persist) { $formViewModel->saveToPersist($postData); } return $result; } // Przetwórz dane (np. konwersja typów) $processedData = $this->processData($postData, $formViewModel->fields); $result['success'] = true; $result['data'] = $processedData; // Wyczyść persist po sukcesie if ($formViewModel->persist) { $formViewModel->clearPersist(); } return $result; } /** * Przetwarza dane z formularza (konwersja typów) */ private function processData(array $postData, array $fields): array { $processed = []; foreach ($fields as $field) { $value = $postData[$field->name] ?? null; // Konwersja typów switch ($field->type) { case FormFieldType::SWITCH: $processed[$field->name] = $value ? 1 : 0; break; case FormFieldType::NUMBER: $processed[$field->name] = $value !== null && $value !== '' ? (float)$value : null; break; case FormFieldType::LANG_SECTION: if ($field->langFields !== null) { $processed[$field->name] = $this->processLangSection($postData, $field); } break; default: $processed[$field->name] = $value; } } return $processed; } /** * Przetwarza sekcję językową */ private function processLangSection(array $postData, $section): array { $result = []; if ($section->langFields === null) { return $result; } foreach ($section->langFields as $field) { $fieldName = $field->name; $langData = $postData[$fieldName] ?? []; foreach ($langData as $langId => $value) { if (!isset($result[$langId])) { $result[$langId] = []; } // Konwersja typów dla pól językowych switch ($field->type) { case FormFieldType::SWITCH: $result[$langId][$fieldName] = $value ? 1 : 0; break; case FormFieldType::NUMBER: $result[$langId][$fieldName] = $value !== null && $value !== '' ? (float)$value : null; break; default: $result[$langId][$fieldName] = $value; } } } return $result; } /** * Przywraca dane z persist do POST (przy błędzie walidacji) */ public function restoreFromPersist(FormEditViewModel $formViewModel): ?array { if (!$formViewModel->persist) { return null; } return $_SESSION['form_persist'][$formViewModel->formId] ?? null; } /** * Sprawdza czy żądanie jest submitowaniem formularza */ public function isFormSubmit(string $formId): bool { return $_SERVER['REQUEST_METHOD'] === 'POST' && (isset($_POST['_form_id']) && $_POST['_form_id'] === $formId); } }