179 lines
5.2 KiB
PHP
179 lines
5.2 KiB
PHP
<?php
|
|
namespace admin\ViewModels\Forms;
|
|
|
|
/**
|
|
* Główny model widoku formularza edycji
|
|
*/
|
|
class FormEditViewModel
|
|
{
|
|
public string $formId;
|
|
public string $title;
|
|
public string $method;
|
|
public string $action;
|
|
public ?string $backUrl;
|
|
public array $tabs;
|
|
public array $fields;
|
|
public array $hiddenFields;
|
|
public array $actions;
|
|
public bool $persist;
|
|
public array $data;
|
|
public ?array $validationErrors;
|
|
public ?array $languages;
|
|
|
|
/**
|
|
* @param string $formId Unikalny identyfikator formularza
|
|
* @param string $title Tytuł formularza
|
|
* @param array $data Dane obiektu (np. banner)
|
|
* @param array $fields Pola formularza
|
|
* @param array $tabs Zakładki formularza
|
|
* @param array $actions Akcje (przyciski)
|
|
* @param string $method Metoda HTTP (POST, GET)
|
|
* @param string $action URL akcji formularza
|
|
* @param string|null $backUrl URL powrotu
|
|
* @param bool $persist Czy zapamiętywać dane w sesji
|
|
* @param array $hiddenFields Dodatkowe ukryte pola
|
|
* @param array|null $languages Dostępne języki (dla sekcji językowych)
|
|
* @param array|null $validationErrors Błędy walidacji
|
|
*/
|
|
public function __construct(
|
|
string $formId,
|
|
string $title,
|
|
array $data = [],
|
|
array $fields = [],
|
|
array $tabs = [],
|
|
array $actions = [],
|
|
string $method = 'POST',
|
|
string $action = '',
|
|
?string $backUrl = null,
|
|
bool $persist = true,
|
|
array $hiddenFields = [],
|
|
?array $languages = null,
|
|
?array $validationErrors = null
|
|
) {
|
|
$this->formId = $formId;
|
|
$this->title = $title;
|
|
$this->data = $data;
|
|
$this->fields = $fields;
|
|
$this->tabs = $tabs;
|
|
$this->actions = $actions;
|
|
$this->method = $method;
|
|
$this->action = $action;
|
|
$this->backUrl = $backUrl;
|
|
$this->persist = $persist;
|
|
$this->hiddenFields = $hiddenFields;
|
|
$this->languages = $languages;
|
|
$this->validationErrors = $validationErrors;
|
|
}
|
|
|
|
/**
|
|
* Sprawdza czy formularz ma zakładki
|
|
*/
|
|
public function hasTabs(): bool
|
|
{
|
|
return count($this->tabs) > 0;
|
|
}
|
|
|
|
/**
|
|
* Sprawdza czy formularz ma sekcje językowe
|
|
*/
|
|
public function hasLangSections(): bool
|
|
{
|
|
foreach ($this->fields as $field) {
|
|
if ($field->type === FormFieldType::LANG_SECTION) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* Zwraca pola dla konkretnej zakładki
|
|
*/
|
|
public function getFieldsForTab(string $tabId): array
|
|
{
|
|
return array_filter($this->fields, function (FormField $field) use ($tabId) {
|
|
return $field->tabId === $tabId && $field->type !== FormFieldType::LANG_SECTION;
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Zwraca sekcje językowe dla konkretnej zakładki
|
|
*/
|
|
public function getLangSectionsForTab(string $tabId): array
|
|
{
|
|
return array_filter($this->fields, function (FormField $field) use ($tabId) {
|
|
return $field->type === FormFieldType::LANG_SECTION &&
|
|
$field->langSectionParentTab === $tabId;
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Pobiera wartość pola z danych lub sesji (persist)
|
|
*/
|
|
public function getFieldValue(FormField $field, $languageId = null, ?string $langFieldName = null)
|
|
{
|
|
$fieldName = $field->name;
|
|
|
|
// Dla sekcji językowych - pobierz wartość z data[lang_id][field_name]
|
|
if ($languageId !== null && $langFieldName !== null) {
|
|
$fieldName = $langFieldName;
|
|
return $this->data['languages'][$languageId][$fieldName] ?? null;
|
|
}
|
|
|
|
// Zwykłe pole - najpierw sprawdź sesję (persist), potem dane
|
|
if ($this->persist && isset($_SESSION['form_persist'][$this->formId][$fieldName])) {
|
|
return $_SESSION['form_persist'][$this->formId][$fieldName];
|
|
}
|
|
|
|
return $this->data[$fieldName] ?? $field->value;
|
|
}
|
|
|
|
/**
|
|
* Sprawdza czy pole ma błąd walidacji
|
|
*/
|
|
public function hasError(string $fieldName, $languageId = null): bool
|
|
{
|
|
if ($this->validationErrors === null) {
|
|
return false;
|
|
}
|
|
|
|
if ($languageId !== null) {
|
|
return isset($this->validationErrors[$fieldName][$languageId]);
|
|
}
|
|
|
|
return isset($this->validationErrors[$fieldName]);
|
|
}
|
|
|
|
/**
|
|
* Pobiera komunikat błędu dla pola
|
|
*/
|
|
public function getError(string $fieldName, $languageId = null): ?string
|
|
{
|
|
if ($languageId !== null) {
|
|
return $this->validationErrors[$fieldName][$languageId] ?? null;
|
|
}
|
|
return $this->validationErrors[$fieldName] ?? null;
|
|
}
|
|
|
|
/**
|
|
* Czyści dane persist z sesji
|
|
*/
|
|
public function clearPersist(): void
|
|
{
|
|
if (isset($_SESSION['form_persist'][$this->formId])) {
|
|
unset($_SESSION['form_persist'][$this->formId]);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Zapisuje dane do sesji (persist)
|
|
*/
|
|
public function saveToPersist(array $data): void
|
|
{
|
|
if (!isset($_SESSION['form_persist'])) {
|
|
$_SESSION['form_persist'] = [];
|
|
}
|
|
$_SESSION['form_persist'][$this->formId] = $data;
|
|
}
|
|
}
|