Files
shopPRO/autoload/admin/Controllers/SettingsController.php

380 lines
12 KiB
PHP

<?php
namespace admin\Controllers;
use Domain\Languages\LanguagesRepository;
use Domain\Settings\SettingsRepository;
use admin\ViewModels\Forms\FormEditViewModel;
use admin\ViewModels\Forms\FormField;
use admin\ViewModels\Forms\FormTab;
use admin\ViewModels\Forms\FormAction;
use admin\Support\Forms\FormRequestHandler;
/**
* Kontroler ustawien w panelu administratora.
*/
class SettingsController
{
private SettingsRepository $settingsRepository;
private LanguagesRepository $languagesRepository;
private FormRequestHandler $formHandler;
public function __construct(SettingsRepository $settingsRepository, LanguagesRepository $languagesRepository)
{
$this->settingsRepository = $settingsRepository;
$this->languagesRepository = $languagesRepository;
$this->formHandler = new FormRequestHandler();
}
/**
* Czyszczenie cache.
*/
public function clearCache(): void
{
\S::delete_dir('../temp/');
\S::delete_dir('../thumbs/');
$redis = \RedisConnection::getInstance()->getConnection();
if ($redis) {
$redis->flushAll();
}
\S::alert('Cache został wyczyszczony.');
\S::htacces();
header('Location: /admin/dashboard/main_view/');
exit;
}
/**
* Czyszczenie cache (AJAX).
*/
public function clearCacheAjax(): void
{
try {
\S::delete_dir('../temp/');
\S::delete_dir('../thumbs/');
$redis = \RedisConnection::getInstance()->getConnection();
if ($redis) {
$redis->flushAll();
}
\S::htacces();
echo json_encode(['status' => 'success', 'message' => 'Cache został wyczyszczony.']);
} catch (\Exception $e) {
echo json_encode(['status' => 'error', 'message' => 'Błąd podczas czyszczenia cache: ' . $e->getMessage()]);
}
exit;
}
/**
* Zapis ustawien (AJAX).
*/
public function save(): void
{
// Kompatybilnosc wsteczna dla legacy gridEdit (values jako JSON).
$legacyValues = \S::get('values');
if ($legacyValues) {
$values = json_decode($legacyValues, true);
$result = $this->settingsRepository->saveSettings(is_array($values) ? $values : []);
\S::delete_dir('../temp/');
\S::htacces();
echo json_encode($result);
exit;
}
$languages = $this->languagesRepository->languagesList();
$settings = $this->settingsRepository->getSettings();
$viewModel = $this->buildFormViewModel($settings, $languages);
$result = $this->formHandler->handleSubmit($viewModel, $_POST);
if (!$result['success']) {
$_SESSION['form_errors'][$this->getFormId()] = $result['errors'];
echo json_encode(['success' => false, 'errors' => $result['errors']]);
exit;
}
$values = $this->transformFormDataToSettings($result['data']);
$saveResult = $this->settingsRepository->saveSettings($values);
\S::delete_dir('../temp/');
\S::htacces();
echo json_encode([
'success' => ($saveResult['status'] ?? '') === 'ok',
'message' => $saveResult['msg'] ?? 'Ustawienia zostały zapisane.',
'errors' => (($saveResult['status'] ?? '') === 'ok') ? [] : ['general' => ($saveResult['msg'] ?? 'Błąd zapisu.')],
]);
exit;
}
/**
* Widok ustawien.
*/
public function view(): string
{
$languages = $this->languagesRepository->languagesList();
$settings = $this->settingsRepository->getSettings();
$validationErrors = $_SESSION['form_errors'][$this->getFormId()] ?? null;
if ($validationErrors) {
unset($_SESSION['form_errors'][$this->getFormId()]);
}
$viewModel = $this->buildFormViewModel($settings, $languages, $validationErrors);
return \Tpl::view('components/form-edit', ['form' => $viewModel]);
}
private function buildFormViewModel(array $settings, array $languages, ?array $errors = null): FormEditViewModel
{
$data = $this->transformSettingsToFormData($settings, $languages);
$tabs = [
new FormTab('contact', 'Dane kontaktowe', 'fa-paper-plane'),
new FormTab('shop', 'Sklep', 'fa-dollar'),
new FormTab('products', 'Produkty', 'fa-shopping-cart'),
new FormTab('mail', 'Poczta', 'fa-envelope'),
new FormTab('other', 'Pozostałe', 'fa-bars'),
new FormTab('system', 'System', 'fa-cog'),
new FormTab('conversions', 'Konwersje', 'fa-line-chart'),
];
$fields = [
FormField::text('firm_name', [
'label' => 'Nazwa firmy',
'tab' => 'contact',
]),
FormField::editor('additional_info', [
'label' => 'Dodatkowe informacje',
'tab' => 'contact',
'height' => 150,
]),
FormField::switch('google_maps', [
'label' => 'Mapa',
'tab' => 'contact',
]),
FormField::textarea('firm_adress', [
'label' => 'Mapa - adres',
'tab' => 'contact',
]),
FormField::editor('shop_bank_account_info', [
'label' => 'Dane do przelewu',
'tab' => 'shop',
'height' => 200,
]),
FormField::text('hotpay_api', [
'label' => 'Klucz API HotPay',
'tab' => 'shop',
]),
FormField::switch('tpay_sandbox', [
'label' => 'Tpay.com - tryb sandbox',
'tab' => 'shop',
]),
FormField::text('tpay_id', [
'label' => 'Tpay.com ID',
'tab' => 'shop',
]),
FormField::text('tpay_security_code', [
'label' => 'Tpay.com - kod bezpieczeństwa',
'tab' => 'shop',
]),
FormField::switch('przelewy24_sandbox', [
'label' => 'Przelewy24.pl - tryb sandbox',
'tab' => 'shop',
]),
FormField::text('przelewy24_merchant_id', [
'label' => 'Przelewy24.pl - merchant ID',
'tab' => 'shop',
]),
FormField::text('przelewy24_crc_key', [
'label' => 'Przelewy24.pl - klucz CRC',
'tab' => 'shop',
]),
FormField::text('free_delivery', [
'label' => 'Darmowa dostawa od',
'tab' => 'shop',
'attributes' => ['class' => 'number-format'],
]),
FormField::text('orlen_paczka_map_token', [
'label' => 'Orlen Paczka map token',
'tab' => 'shop',
]),
FormField::langSection('warehouse_messages', 'products', [
FormField::text('warehouse_message_zero', [
'label' => 'Komunikat gdy stan magazynowy równy 0',
]),
FormField::text('warehouse_message_nonzero', [
'label' => 'Komunikat gdy stan magazynowy większy niż 0',
]),
]),
FormField::switch('contact_form', [
'label' => 'Formularz kontaktowy',
'tab' => 'mail',
]),
FormField::text('contact_email', [
'label' => 'Email kontaktowy',
'tab' => 'mail',
]),
FormField::text('email_host', [
'label' => 'Email - host',
'tab' => 'mail',
]),
FormField::text('email_port', [
'label' => 'Email - port',
'tab' => 'mail',
]),
FormField::text('email_login', [
'label' => 'Email - login',
'tab' => 'mail',
]),
FormField::text('email_password', [
'label' => 'Email - hasło',
'tab' => 'mail',
]),
FormField::text('facebook_link', [
'label' => 'Facebook link',
'tab' => 'other',
]),
FormField::text('piksel', [
'label' => 'Piksel Facebook',
'tab' => 'other',
]),
FormField::textarea('statistic_code', [
'label' => 'Kod statystyk',
'tab' => 'other',
'rows' => 10,
]),
FormField::textarea('htaccess', [
'label' => 'Własne reguły htacess',
'tab' => 'other',
'rows' => 10,
]),
FormField::textarea('robots', [
'label' => 'Własne reguły robots.txt',
'tab' => 'other',
'rows' => 10,
]),
FormField::switch('update', [
'label' => 'Aktualizacja',
'tab' => 'system',
]),
FormField::text('update_key', [
'label' => 'Numer licencji',
'tab' => 'system',
]),
FormField::switch('devel', [
'label' => 'Strona konstrukcyjna',
'tab' => 'system',
]),
FormField::switch('lazy_loading', [
'label' => 'Lazy loading obrazów',
'tab' => 'system',
]),
FormField::switch('generate_webp', [
'label' => 'Generowanie obrazków WEBP',
'tab' => 'system',
]),
FormField::switch('infinitescroll', [
'label' => 'Infinitescroll',
'tab' => 'system',
]),
FormField::switch('htaccess_cache', [
'label' => 'Htaccess cache',
'tab' => 'system',
]),
FormField::text('google_tag_manager_id', [
'label' => 'Google Tag Manager - ID',
'tab' => 'conversions',
]),
FormField::textarea('own_gtm_js', [
'label' => 'Własny kod GTM JS (bez tagu script)',
'tab' => 'conversions',
'rows' => 10,
]),
FormField::textarea('own_gtm_html', [
'label' => 'Własny kod GTM HTML',
'tab' => 'conversions',
'rows' => 10,
]),
];
$actions = [
FormAction::save('/admin/settings/save/', ''),
];
return new FormEditViewModel(
$this->getFormId(),
'Edycja ustawień',
$data,
$fields,
$tabs,
$actions,
'POST',
'/admin/settings/save/',
null,
false,
[],
$languages,
$errors
);
}
private function getFormId(): string
{
return 'settings-edit';
}
private function transformSettingsToFormData(array $settings, array $languages): array
{
$data = $settings;
$data['languages'] = [];
foreach ($languages as $lang) {
if (!($lang['status'] ?? false)) {
continue;
}
$langId = (string)$lang['id'];
$data['languages'][$langId] = [
'warehouse_message_zero' => $settings['warehouse_message_zero_' . $langId] ?? '',
'warehouse_message_nonzero' => $settings['warehouse_message_nonzero_' . $langId] ?? '',
];
}
return $data;
}
private function transformFormDataToSettings(array $data): array
{
if (!isset($data['warehouse_messages']) || !is_array($data['warehouse_messages'])) {
return $data;
}
$data['warehouse_message_zero'] = [];
$data['warehouse_message_nonzero'] = [];
foreach ($data['warehouse_messages'] as $langId => $langValues) {
if (!is_array($langValues)) {
continue;
}
$data['warehouse_message_zero'][$langId] = $langValues['warehouse_message_zero'] ?? '';
$data['warehouse_message_nonzero'][$langId] = $langValues['warehouse_message_nonzero'] ?? '';
}
unset($data['warehouse_messages']);
return $data;
}
}