From 211081121fac58c9c28a38edcf89c6c3bd159ad0 Mon Sep 17 00:00:00 2001 From: Jacek Pyziak Date: Sun, 8 Feb 2026 20:13:01 +0100 Subject: [PATCH] ver 0.250: migrate settings to form-edit and cleanup legacy settings classes --- PROJECT_STRUCTURE.md | 2 +- .../Domain/Settings/SettingsRepository.php | 174 +++++++-- .../admin/Controllers/SettingsController.php | 342 ++++++++++++++++-- autoload/admin/class.Site.php | 4 +- autoload/admin/controls/class.Newsletter.php | 12 +- autoload/admin/controls/class.Settings.php | 115 ------ autoload/admin/factory/class.Settings.php | 104 ------ autoload/admin/view/class.Settings.php | 13 - autoload/front/factory/class.Newsletter.php | 6 +- tests/bootstrap.php | 3 + updates/0.20/ver_0.250.zip | Bin 0 -> 9943 bytes updates/0.20/ver_0.250_files.txt | 3 + updates/changelog.php | 10 +- updates/versions.php | 2 +- 14 files changed, 480 insertions(+), 310 deletions(-) delete mode 100644 autoload/admin/controls/class.Settings.php delete mode 100644 autoload/admin/factory/class.Settings.php delete mode 100644 autoload/admin/view/class.Settings.php create mode 100644 updates/0.20/ver_0.250.zip create mode 100644 updates/0.20/ver_0.250_files.txt diff --git a/PROJECT_STRUCTURE.md b/PROJECT_STRUCTURE.md index e08b12e..83d4ead 100644 --- a/PROJECT_STRUCTURE.md +++ b/PROJECT_STRUCTURE.md @@ -89,7 +89,7 @@ shop\product:{product_id}:{lang_id}:{permutation_hash} - **Lokalizacja UI:** `admin/templates/site/main-layout.php:172` - **JavaScript:** `admin/templates/site/main-layout.php:235-274` - **Endpoint AJAX:** `/admin/settings/clear_cache_ajax/` -- **Kontroler:** `autoload/admin/controls/class.Settings.php:20-42` +- **Kontroler:** `autoload/admin/Controllers/SettingsController.php:43-60` - **Działanie:** 1. Pokazuje spinner "Czyszczę cache..." 2. Czyści katalogi: `temp/`, `thumbs/` diff --git a/autoload/Domain/Settings/SettingsRepository.php b/autoload/Domain/Settings/SettingsRepository.php index 9aa71e0..2a0969a 100644 --- a/autoload/Domain/Settings/SettingsRepository.php +++ b/autoload/Domain/Settings/SettingsRepository.php @@ -2,65 +2,159 @@ namespace Domain\Settings; /** - * Repozytorium ustawień - deleguje do admin\factory\Settings (legacy) - * - * Krok pośredni migracji: wyodrębnia logikę zapisu z kontrolera. - * Docelowo zastąpi factory bezpośrednim dostępem do bazy (jak BannerRepository). + * Repozytorium ustawien panelu administratora. */ class SettingsRepository { + private $db; + + public function __construct($db = null) + { + if ($db) { + $this->db = $db; + return; + } + + global $mdb; + $this->db = $mdb; + } + /** - * Zapis ustawień + * Zapis ustawien. * - * @param array $values Tablica wartości z formularza - * @return array Odpowiedź z factory ['status' => string, 'msg' => string] + * @param array $values Tablica wartosci z formularza + * @return array ['status' => string, 'msg' => string] */ public function saveSettings(array $values): array { - $settings = \admin\factory\Settings::settings_details(); + $currentSettings = $this->getSettings(); - $response = \admin\factory\Settings::settings_save( - $values['firm_name'], $values['firm_adress'], $values['additional_info'], $values['contact_form'], $values['contact_email'], $values['email_host'], - $values['email_port'], $values['email_login'], $values['email_password'], $values['google_maps'], $values['facebook_link'], $values['statistic_code'], $values['htaccess'], - $values['robots'], $values['shop_bank_account_info'], $values['update'], $values['boot_animation'], $settings['newsletter_header'], $settings['newsletter_footer'], $values['hotpay_api'] - ); + $settingsToSave = [ + 'firm_name' => $values['firm_name'] ?? '', + 'firm_adress' => $values['firm_adress'] ?? '', + 'additional_info' => $values['additional_info'] ?? '', + 'contact_form' => $this->isEnabled($values['contact_form'] ?? null) ? 1 : 0, + 'contact_email' => $values['contact_email'] ?? '', + 'email_host' => $values['email_host'] ?? '', + 'email_port' => $values['email_port'] ?? '', + 'email_login' => $values['email_login'] ?? '', + 'email_password' => $values['email_password'] ?? '', + 'google_maps' => $values['google_maps'] ?? '', + 'facebook_link' => $values['facebook_link'] ?? '', + 'statistic_code' => $values['statistic_code'] ?? '', + 'htaccess' => $values['htaccess'] ?? '', + 'robots' => $values['robots'] ?? '', + 'shop_bank_account_info' => $values['shop_bank_account_info'] ?? '', + 'update' => $this->isEnabled($values['update'] ?? null) ? 1 : 0, + 'boot_animation' => $values['boot_animation'] ?? '', + // Te pola sa edytowane w module newsletter i musza zostac zachowane. + 'newsletter_header' => $currentSettings['newsletter_header'] ?? '', + 'newsletter_footer' => $currentSettings['newsletter_footer'] ?? '', + 'hotpay_api' => $values['hotpay_api'] ?? '', - \admin\factory\Settings::settings_update( 'devel', $values['devel'] == 'on' ? 1 : 0 ); - \admin\factory\Settings::settings_update( 'ssl', $values['ssl'] == 'on' ? 1 : 0 ); - \admin\factory\Settings::settings_update( 'htaccess_cache', $values['htaccess_cache'] == 'on' ? 1 : 0 ); - \admin\factory\Settings::settings_update( 'free_delivery', $values['free_delivery'] ); - \admin\factory\Settings::settings_update( 'przelewy24_sandbox', $values['przelewy24_sandbox'] == 'on' ? 1 : 0 ); - \admin\factory\Settings::settings_update( 'przelewy24_merchant_id', $values['przelewy24_merchant_id'] ); - \admin\factory\Settings::settings_update( 'przelewy24_crc_key', $values['przelewy24_crc_key'] ); - \admin\factory\Settings::settings_update( 'update_key', $values['update_key'] ); - \admin\factory\Settings::settings_update( 'tpay_id', $values['tpay_id'] ); - \admin\factory\Settings::settings_update( 'tpay_sandbox', $values['tpay_sandbox'] == 'on' ? 1 : 0 ); - \admin\factory\Settings::settings_update( 'tpay_security_code', $values['tpay_security_code'] ); - \admin\factory\Settings::settings_update( 'piksel', $values['piksel'] ); - \admin\factory\Settings::settings_update( 'generate_webp', $values['generate_webp'] == 'on' ? 1 : 0 ); - \admin\factory\Settings::settings_update( 'lazy_loading', $values['lazy_loading'] == 'on' ? 1 : 0 ); - \admin\factory\Settings::settings_update( 'orlen_paczka_map_token', $values['orlen_paczka_map_token'] ); - \admin\factory\Settings::settings_update( 'google_tag_manager_id', $values['google_tag_manager_id'] ); - \admin\factory\Settings::settings_update( 'infinitescroll', $values['infinitescroll'] == 'on' ? 1 : 0 ); - \admin\factory\Settings::settings_update( 'own_gtm_js', $values['own_gtm_js'] ); - \admin\factory\Settings::settings_update( 'own_gtm_html', $values['own_gtm_html'] ); + 'devel' => $this->isEnabled($values['devel'] ?? null) ? 1 : 0, + 'ssl' => $this->isEnabled($values['ssl'] ?? null) ? 1 : 0, + 'htaccess_cache' => $this->isEnabled($values['htaccess_cache'] ?? null) ? 1 : 0, + 'free_delivery' => $values['free_delivery'] ?? '', + 'przelewy24_sandbox' => $this->isEnabled($values['przelewy24_sandbox'] ?? null) ? 1 : 0, + 'przelewy24_merchant_id' => $values['przelewy24_merchant_id'] ?? '', + 'przelewy24_crc_key' => $values['przelewy24_crc_key'] ?? '', + 'update_key' => $values['update_key'] ?? '', + 'tpay_id' => $values['tpay_id'] ?? '', + 'tpay_sandbox' => $this->isEnabled($values['tpay_sandbox'] ?? null) ? 1 : 0, + 'tpay_security_code' => $values['tpay_security_code'] ?? '', + 'piksel' => $values['piksel'] ?? '', + 'generate_webp' => $this->isEnabled($values['generate_webp'] ?? null) ? 1 : 0, + 'lazy_loading' => $this->isEnabled($values['lazy_loading'] ?? null) ? 1 : 0, + 'orlen_paczka_map_token' => $values['orlen_paczka_map_token'] ?? '', + 'google_tag_manager_id' => $values['google_tag_manager_id'] ?? '', + 'infinitescroll' => $this->isEnabled($values['infinitescroll'] ?? null) ? 1 : 0, + 'own_gtm_js' => $values['own_gtm_js'] ?? '', + 'own_gtm_html' => $values['own_gtm_html'] ?? '', + ]; - foreach ( $values['warehouse_message_zero'] as $key => $val ) - \admin\factory\Settings::settings_update( 'warehouse_message_zero_' . $key, $val ); + $warehouseMessageZero = $values['warehouse_message_zero'] ?? []; + if (is_array($warehouseMessageZero)) { + foreach ($warehouseMessageZero as $key => $value) { + $settingsToSave['warehouse_message_zero_' . $key] = $value; + } + } - foreach ( $values['warehouse_message_nonzero'] as $key => $val ) - \admin\factory\Settings::settings_update( 'warehouse_message_nonzero_' . $key, $val ); + $warehouseMessageNonZero = $values['warehouse_message_nonzero'] ?? []; + if (is_array($warehouseMessageNonZero)) { + foreach ($warehouseMessageNonZero as $key => $value) { + $settingsToSave['warehouse_message_nonzero_' . $key] = $value; + } + } - return $response; + // Zachowanie zgodne z dotychczasowym flow: pelna podmiana zestawu ustawien. + $this->db->query('TRUNCATE pp_settings'); + $this->updateSettings($settingsToSave); + + \S::set_message('Ustawienia zostaly zapisane'); + + return ['status' => 'ok', 'msg' => 'Ustawienia zostaly zapisane.']; } /** - * Pobranie wszystkich ustawień + * Aktualizacja pojedynczego parametru. + */ + public function updateSetting(string $param, $value): bool + { + $this->db->delete('pp_settings', ['param' => $param]); + $this->db->insert('pp_settings', ['param' => $param, 'value' => $value]); + + return true; + } + + /** + * Aktualizacja wielu parametrow przez jedna sciezke. + */ + public function updateSettings(array $settings): bool + { + foreach ($settings as $param => $value) { + $this->updateSetting((string)$param, $value); + } + + return true; + } + + /** + * Pobranie wszystkich ustawien. * - * @return array Tablica ustawień [param => value] + * @return array Tablica ustawien [param => value] */ public function getSettings(): array { - return \admin\factory\Settings::settings_details() ?? []; + $results = $this->db->select('pp_settings', '*', ['ORDER' => ['id' => 'ASC']]); + $settings = []; + + if (is_array($results)) { + foreach ($results as $row) { + if (isset($row['param'])) { + $settings[$row['param']] = $row['value'] ?? ''; + } + } + } + + return $settings; + } + + private function isEnabled($value): bool + { + if (is_bool($value)) { + return $value; + } + + if (is_int($value) || is_float($value)) { + return (int)$value === 1; + } + + if (is_string($value)) { + $normalized = strtolower(trim($value)); + return in_array($normalized, ['1', 'on', 'true', 'yes'], true); + } + + return false; } } diff --git a/autoload/admin/Controllers/SettingsController.php b/autoload/admin/Controllers/SettingsController.php index a259f50..68dfaf1 100644 --- a/autoload/admin/Controllers/SettingsController.php +++ b/autoload/admin/Controllers/SettingsController.php @@ -2,87 +2,375 @@ namespace admin\Controllers; 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 ustawień w panelu administratora (nowa architektura) - * - * Używa Dependency Injection zamiast static methods - * Deleguje logikę do Domain\Settings\SettingsRepository + * Kontroler ustawien w panelu administratora. */ class SettingsController { private SettingsRepository $settingsRepository; + private FormRequestHandler $formHandler; public function __construct(SettingsRepository $settingsRepository) { $this->settingsRepository = $settingsRepository; + $this->formHandler = new FormRequestHandler(); } /** - * Czyszczenie cache + * Czyszczenie cache. */ public function clearCache(): void { - \S::delete_dir( '../temp/' ); - \S::delete_dir( '../thumbs/' ); + \S::delete_dir('../temp/'); + \S::delete_dir('../thumbs/'); $redis = \RedisConnection::getInstance()->getConnection(); - if ( $redis ) + if ($redis) { $redis->flushAll(); + } - \S::alert( 'Cache został wyczyszczony.' ); + \S::alert('Cache został wyczyszczony.'); \S::htacces(); - header( 'Location: /admin/dashboard/main_view/' ); + header('Location: /admin/dashboard/main_view/'); exit; } /** - * Czyszczenie cache (AJAX) + * Czyszczenie cache (AJAX). */ public function clearCacheAjax(): void { try { - \S::delete_dir( '../temp/' ); - \S::delete_dir( '../thumbs/' ); + \S::delete_dir('../temp/'); + \S::delete_dir('../thumbs/'); $redis = \RedisConnection::getInstance()->getConnection(); - if ( $redis ) + 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() ] ); + 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 ustawień (AJAX) + * Zapis ustawien (AJAX). */ public function save(): void { - $values = json_decode( \S::get( 'values' ), true ); + // 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 : []); - $response = $this->settingsRepository->saveSettings( $values ); + \S::delete_dir('../temp/'); + \S::htacces(); - \S::delete_dir( '../temp/' ); + echo json_encode($result); + exit; + } + + $languages = \admin\factory\Languages::languages_list(); + $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( $response ); + 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 ustawień + * Widok ustawien. */ public function view(): string { - return \Tpl::view( 'settings/settings', [ - 'languages' => \admin\factory\Languages::languages_list(), - 'settings' => $this->settingsRepository->getSettings() - ] ); + $languages = \admin\factory\Languages::languages_list(); + $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/settings_save/', ''), + ]; + + return new FormEditViewModel( + $this->getFormId(), + 'Edycja ustawień', + $data, + $fields, + $tabs, + $actions, + 'POST', + '/admin/settings/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; } } diff --git a/autoload/admin/class.Site.php b/autoload/admin/class.Site.php index 62a8e2d..39c975a 100644 --- a/autoload/admin/class.Site.php +++ b/autoload/admin/class.Site.php @@ -214,8 +214,10 @@ class Site ); }, 'Settings' => function() { + global $mdb; + return new \admin\Controllers\SettingsController( - new \Domain\Settings\SettingsRepository() + new \Domain\Settings\SettingsRepository( $mdb ) ); }, 'ProductArchive' => function() { diff --git a/autoload/admin/controls/class.Newsletter.php b/autoload/admin/controls/class.Newsletter.php index 17ebe58..97e2090 100644 --- a/autoload/admin/controls/class.Newsletter.php +++ b/autoload/admin/controls/class.Newsletter.php @@ -10,7 +10,7 @@ class Newsletter public static function send() { - if ( \admin\factory\Newsletter::send( \S::get( 'dates' ), \S::get('template')) ) + if ( \admin\factory\Newsletter::send( \S::get( 'dates' ), \S::get( 'template' ) ) ) \S::alert( 'Newsletter został dodany do kolejki wysyłania.' ); header( 'Location: /admin/newsletter/prepare/' ); @@ -26,11 +26,11 @@ class Newsletter public static function settings_save() { - $settings = \admin\factory\Settings::settings_details(); $values = json_decode( \S::get( 'values' ), true ); + $settingsRepository = new \Domain\Settings\SettingsRepository(); - \admin\factory\Settings::settings_update( 'newsletter_footer', $values['newsletter_footer'] ); - \admin\factory\Settings::settings_update( 'newsletter_header', $values['newsletter_header'] ); + $settingsRepository -> updateSetting( 'newsletter_footer', $values['newsletter_footer'] ?? '' ); + $settingsRepository -> updateSetting( 'newsletter_header', $values['newsletter_header'] ?? '' ); \S::alert( 'Ustawienia zostały zapisane.' ); @@ -40,8 +40,10 @@ class Newsletter public static function settings() { + $settingsRepository = new \Domain\Settings\SettingsRepository(); + return \admin\view\Newsletter::settings( - \admin\factory\Settings::settings_details() + $settingsRepository -> getSettings() ); } diff --git a/autoload/admin/controls/class.Settings.php b/autoload/admin/controls/class.Settings.php deleted file mode 100644 index 63d71dd..0000000 --- a/autoload/admin/controls/class.Settings.php +++ /dev/null @@ -1,115 +0,0 @@ - getConnection(); - if ( $redis ) - $redis -> flushAll(); - - \S::alert( 'Cache został wyczyszczony.' ); - header( 'Location: /admin/dashboard/main_view/' ); - exit; - } - - /** - * @deprecated Routing kieruje do admin\Controllers\SettingsController::clearCacheAjax(). - * Ta metoda pozostaje tylko jako fallback dla starej architektury. - */ - static public function clear_cache_ajax() - { - try - { - // Czyszczenie katalogów cache - \S::delete_dir( '../temp/' ); - \S::delete_dir( '../thumbs/' ); - - // Czyszczenie Redis cache - $redis = \RedisConnection::getInstance() -> getConnection(); - if ( $redis ) - $redis -> flushAll(); - - // Zwróć odpowiedź JSON - echo json_encode( [ 'status' => 'success', 'message' => 'Cache został wyczyszczony.' ] ); - } - catch ( \Exception $e ) - { - // W przypadku błędu - echo json_encode( [ 'status' => 'error', 'message' => 'Błąd podczas czyszczenia cache: ' . $e->getMessage() ] ); - } - exit; - } - - /** - * @deprecated Routing kieruje do admin\Controllers\SettingsController::save(). - * Ta metoda pozostaje tylko jako fallback dla starej architektury. - */ - public static function settings_save() - { - $values = json_decode( \S::get( 'values' ), true ); - - $settings = \admin\factory\Settings::settings_details( true ); - - $response = \admin\factory\Settings::settings_save( - $values['firm_name'], $values['firm_adress'], $values['additional_info'], $values['contact_form'], $values['contact_email'], $values['email_host'], - $values['email_port'], $values['email_login'], $values['email_password'], $values['google_maps'], $values['facebook_link'], $values['statistic_code'], $values['htaccess'], - $values['robots'], $values['shop_bank_account_info'], $values['update'], $values['boot_animation'], $settings['newsletter_header'], $settings['newsletter_footer'], $values['hotpay_api'] - ); - - \admin\factory\Settings::settings_update( 'devel', $values['devel'] == 'on' ? 1 : 0 ); - \admin\factory\Settings::settings_update( 'ssl', $values['ssl'] == 'on' ? 1 : 0 ); - \admin\factory\Settings::settings_update( 'htaccess_cache', $values['htaccess_cache'] == 'on' ? 1 : 0 ); - \admin\factory\Settings::settings_update( 'free_delivery', $values['free_delivery'] ); - \admin\factory\Settings::settings_update( 'przelewy24_sandbox', $values['przelewy24_sandbox'] == 'on' ? 1 : 0 ); - \admin\factory\Settings::settings_update( 'przelewy24_merchant_id', $values['przelewy24_merchant_id'] ); - \admin\factory\Settings::settings_update( 'przelewy24_crc_key', $values['przelewy24_crc_key'] ); - \admin\factory\Settings::settings_update( 'update_key', $values['update_key'] ); - \admin\factory\Settings::settings_update( 'tpay_id', $values['tpay_id'] ); - \admin\factory\Settings::settings_update( 'tpay_sandbox', $values['tpay_sandbox'] == 'on' ? 1 : 0 ); - \admin\factory\Settings::settings_update( 'tpay_security_code', $values['tpay_security_code'] ); - \admin\factory\Settings::settings_update( 'piksel', $values['piksel'] ); - \admin\factory\Settings::settings_update( 'generate_webp', $values['generate_webp'] == 'on' ? 1 : 0 ); - \admin\factory\Settings::settings_update( 'lazy_loading', $values['lazy_loading'] == 'on' ? 1 : 0 ); - \admin\factory\Settings::settings_update( 'orlen_paczka_map_token', $values['orlen_paczka_map_token'] ); - \admin\factory\Settings::settings_update( 'google_tag_manager_id', $values['google_tag_manager_id'] ); - \admin\factory\Settings::settings_update( 'infinitescroll', $values['infinitescroll'] == 'on' ? 1 : 0 ); - // own_gtm_js - \admin\factory\Settings::settings_update( 'own_gtm_js', $values['own_gtm_js'] ); - // own_gtm_html - \admin\factory\Settings::settings_update( 'own_gtm_html', $values['own_gtm_html'] ); - - foreach ( $values[ 'warehouse_message_zero'] as $key => $val ) - \admin\factory\Settings::settings_update( 'warehouse_message_zero_' . $key, $val ); - - foreach ( $values[ 'warehouse_message_nonzero'] as $key => $val ) - \admin\factory\Settings::settings_update( 'warehouse_message_nonzero_' . $key, $val ); - - \S::delete_dir( '../temp/' ); - \S::htacces(); - - echo json_encode( $response ); - exit; - } - - /** - * @deprecated Routing kieruje do admin\Controllers\SettingsController::view(). - * Ta metoda pozostaje tylko jako fallback dla starej architektury. - */ - public static function view() - { - return \Tpl::view( 'settings/settings', [ - 'languages' => \admin\factory\Languages::languages_list(), - 'settings' => \admin\factory\Settings::settings_details() - ] ); - } -} -?> diff --git a/autoload/admin/factory/class.Settings.php b/autoload/admin/factory/class.Settings.php deleted file mode 100644 index a38b9e5..0000000 --- a/autoload/admin/factory/class.Settings.php +++ /dev/null @@ -1,104 +0,0 @@ - delete( 'pp_settings', [ 'param' => $param ] ); - $mdb -> insert( 'pp_settings', [ 'param' => $param, 'value' => $value ] ); - - return true; - } - - public static function settings_save( - $firm_name, $firm_adress, $additional_info, $contact_form, $contact_email, $email_host, $email_port, $email_login, $email_password, $google_maps, $facebook_link, $statistic_code, $htaccess, - $robots, $shop_bank_account_info, $update, $boot_animation, $newsletter_header, $newsletter_footer, $hotpay_api - ) - { - global $mdb; - - $mdb -> query( 'TRUNCATE pp_settings' ); - - $mdb -> insert( 'pp_settings', [ - [ - 'param' => 'firm_name', - 'value' => $firm_name, - ], [ - 'param' => 'firm_adress', - 'value' => $firm_adress - ], [ - 'param' => 'additional_info', - 'value' => $additional_info - ], [ - 'param' => 'contact_form', - 'value' => $contact_form == 'on' ? 1 : 0 - ], [ - 'param' => 'contact_email', - 'value' => $contact_email - ], [ - 'param' => 'email_host', - 'value' => $email_host - ], [ - 'param' => 'email_port', - 'value' => $email_port - ], [ - 'param' => 'email_login', - 'value' => $email_login - ], [ - 'param' => 'email_password', - 'value' => $email_password - ], [ - 'param' => 'google_maps', - 'value' => $google_maps - ], [ - "param" => 'facebook_link', - 'value' => $facebook_link - ], [ - 'param' => 'statistic_code', - 'value' => $statistic_code - ], [ - 'param' => 'htaccess', - 'value' => $htaccess - ], [ - 'param' => 'robots', - 'value' => $robots - ], [ - 'param' => 'shop_bank_account_info', - 'value' => $shop_bank_account_info - ], [ - 'param' => 'update', - 'value' => $update == 'on' ? 1 : 0 - ], [ - 'param' => 'boot_animation', - 'value' => $boot_animation - ], [ - 'param' => 'newsletter_header', - 'value' => $newsletter_header - ], [ - 'param' => 'newsletter_footer', - 'value' => $newsletter_footer - ], [ - 'param' => 'hotpay_api', - 'value' => $hotpay_api - ] - ] - ); - - \S::set_message( 'Ustawienia zostały zapisane' ); - - return $response = [ 'status' => 'ok', 'msg' => 'Ustawienia zostały zapisane.' ]; - } - - public static function settings_details() - { - global $mdb; - $results = $mdb -> select( 'pp_settings', '*', [ 'ORDER' => [ 'id' => 'ASC' ] ] ); - if ( is_array( $results ) ) foreach ( $results as $row ) - $settings[ $row['param'] ] = $row['value']; - return $settings; - } -} -?> \ No newline at end of file diff --git a/autoload/admin/view/class.Settings.php b/autoload/admin/view/class.Settings.php deleted file mode 100644 index 8ee7e4b..0000000 --- a/autoload/admin/view/class.Settings.php +++ /dev/null @@ -1,13 +0,0 @@ - settings = $settings; - return $tpl -> render( 'settings/settings' ); - } -} -?> \ No newline at end of file diff --git a/autoload/front/factory/class.Newsletter.php b/autoload/front/factory/class.Newsletter.php index ff1406b..7521364 100644 --- a/autoload/front/factory/class.Newsletter.php +++ b/autoload/front/factory/class.Newsletter.php @@ -26,6 +26,8 @@ class Newsletter public static function newsletter_send( $limit = 5 ) { global $mdb, $settings, $lang; + $settingsRepository = new \Domain\Settings\SettingsRepository( $mdb ); + $settingsDetails = $settingsRepository -> getSettings(); $results = $mdb -> query( 'SELECT * FROM pp_newsletter_send ORDER BY id ASC LIMIT ' . $limit ) -> fetchAll(); if ( is_array( $results ) and !empty( $results ) ) @@ -36,7 +38,7 @@ class Newsletter $text = \admin\view\Newsletter::preview( \admin\factory\Articles::articles_by_date_add( $dates[0], $dates[1] ), - \admin\factory\Settings::settings_details(), + $settingsDetails, \admin\factory\Newsletter::email_template_detalis($row['id_template']) ); @@ -119,4 +121,4 @@ class Newsletter return $mdb -> delete( 'pp_newsletter', [ 'email' => $email ] ); return false; } -} \ No newline at end of file +} diff --git a/tests/bootstrap.php b/tests/bootstrap.php index aad8116..0121a04 100644 --- a/tests/bootstrap.php +++ b/tests/bootstrap.php @@ -12,6 +12,9 @@ if (file_exists(__DIR__ . '/../vendor/autoload.php')) { $prefixes = [ 'Domain\\' => __DIR__ . '/../autoload/Domain/', 'admin\\Controllers\\' => __DIR__ . '/../autoload/admin/Controllers/', + 'admin\\Support\\Forms\\' => __DIR__ . '/../autoload/admin/Support/Forms/', + 'admin\\ViewModels\\Forms\\' => __DIR__ . '/../autoload/admin/ViewModels/Forms/', + 'admin\\Validation\\' => __DIR__ . '/../autoload/admin/Validation/', ]; foreach ($prefixes as $prefix => $baseDir) { diff --git a/updates/0.20/ver_0.250.zip b/updates/0.20/ver_0.250.zip new file mode 100644 index 0000000000000000000000000000000000000000..d318a142454825271e19429a1758d23eb5f9136b GIT binary patch literal 9943 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 WEYxom1^~ePzSw`~FF<7fc=|t-YHUUT literal 0 HcmV?d00001 diff --git a/updates/0.20/ver_0.250_files.txt b/updates/0.20/ver_0.250_files.txt new file mode 100644 index 0000000..24ade22 --- /dev/null +++ b/updates/0.20/ver_0.250_files.txt @@ -0,0 +1,3 @@ +F: ../autoload/admin/controls/class.Settings.php +F: ../autoload/admin/factory/class.Settings.php +F: ../autoload/admin/view/class.Settings.php diff --git a/updates/changelog.php b/updates/changelog.php index 1afc2af..a0673c0 100644 --- a/updates/changelog.php +++ b/updates/changelog.php @@ -1,4 +1,12 @@ -ver. 0.249
+ver. 0.250
+- UPDATE - refaktoryzacja Settings: `Domain\\Settings\\SettingsRepository` ma bezposredni dostep do bazy (bez delegacji do `admin\\factory\\Settings`) +- UPDATE - przepieto pozostale uzycia `admin\\factory\\Settings` na `Domain\\Settings\\SettingsRepository` (`admin\\controls\\Settings`, `admin\\controls\\Newsletter`, `front\\factory\\Newsletter`) +- UPDATE - DI dla SettingsController: repozytorium otrzymuje `$mdb` w `admin\\Site` +- UPDATE - Settings: widok edycji przeniesiony na nowy mechanizm formularza (`FormEditViewModel` + `components/form-edit`) jak w banerach +- UPDATE - usunieto nieuzywana legacy klase `autoload/admin/factory/class.Settings.php` +- UPDATE - usunieto legacy fallback kontrolera `autoload/admin/controls/class.Settings.php` +- UPDATE - usunieto nieuzywana klase widoku `autoload/admin/view/class.Settings.php` +
ver. 0.249
- FIX - banner edit: poprawiono zapisywanie danych jezykowych i synchronizacje CKEditor przed zapisem - FIX - banner edit: naprawiono hash zakladek (usunieto `undefined` w URL) - FIX - filemanager: przywrocono dzialanie popupa wyboru obrazka z banera diff --git a/updates/versions.php b/updates/versions.php index 290433d..c33123e 100644 --- a/updates/versions.php +++ b/updates/versions.php @@ -1,5 +1,5 @@