160 lines
4.7 KiB
PHP
160 lines
4.7 KiB
PHP
<?php
|
|
namespace admin\Support\Forms;
|
|
|
|
use admin\ViewModels\Forms\FormEditViewModel;
|
|
use admin\ViewModels\Forms\FormFieldType;
|
|
use admin\Validation\FormValidator;
|
|
|
|
/**
|
|
* Obsługa żądań formularza (POST, persist, walidacja)
|
|
*/
|
|
class FormRequestHandler
|
|
{
|
|
private FormValidator $validator;
|
|
|
|
public function __construct()
|
|
{
|
|
$this->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);
|
|
}
|
|
}
|