From 735762bbfbbad4b426d552429ff941d09c1375a3 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 17 Jul 2026 07:53:48 +0000 Subject: [PATCH] feat: add Telegram social link setting across app and DB --- app/Controllers/SettingsController.php | 2 + app/Support/ConfigStore.php | 3 +- app/Views/frontend/layout.php | 5 ++ app/Views/settings/index.php | 11 +++ app/Views/user_layout.php | 5 ++ docs/settings.MD | 2 +- installer/database/data_de_DE.sql | 1 + installer/database/data_en_US.sql | 1 + installer/database/data_fr_FR.sql | 1 + installer/database/data_it_IT.sql | 1 + .../database/migrations/migrate_0.7.35.sql | 9 +++ .../issue-257-telegram-social-links.unit.php | 69 +++++++++++++++++++ 12 files changed, 108 insertions(+), 2 deletions(-) create mode 100644 installer/database/migrations/migrate_0.7.35.sql create mode 100644 tests/issue-257-telegram-social-links.unit.php diff --git a/app/Controllers/SettingsController.php b/app/Controllers/SettingsController.php index 08ccfe71a..a87a0a57c 100644 --- a/app/Controllers/SettingsController.php +++ b/app/Controllers/SettingsController.php @@ -128,6 +128,7 @@ public function updateGeneral(Request $request, Response $response, mysqli $db): 'social_instagram' => trim((string) ($data['social_instagram'] ?? '')), 'social_linkedin' => trim((string) ($data['social_linkedin'] ?? '')), 'social_bluesky' => trim((string) ($data['social_bluesky'] ?? '')), + 'social_telegram' => trim((string) ($data['social_telegram'] ?? '')), ]; foreach ($socialLinks as $key => $value) { @@ -254,6 +255,7 @@ private function resolveAppSettings(SettingsRepository $repository): array 'social_instagram' => $repository->get('app', 'social_instagram', $config['social_instagram'] ?? ''), 'social_linkedin' => $repository->get('app', 'social_linkedin', $config['social_linkedin'] ?? ''), 'social_bluesky' => $repository->get('app', 'social_bluesky', $config['social_bluesky'] ?? ''), + 'social_telegram' => $repository->get('app', 'social_telegram', $config['social_telegram'] ?? ''), ]; } diff --git a/app/Support/ConfigStore.php b/app/Support/ConfigStore.php index d8b856d9f..fa04b1ce8 100644 --- a/app/Support/ConfigStore.php +++ b/app/Support/ConfigStore.php @@ -25,6 +25,7 @@ public static function all(): array 'social_instagram' => '', 'social_linkedin' => '', 'social_bluesky' => '', + 'social_telegram' => '', ], 'mail' => [ 'driver' => 'mail', // mail|smtp|phpmailer @@ -411,7 +412,7 @@ private static function loadDatabaseSettings(): array self::$dbSettingsCache['app']['locale'] = (string) $raw['app']['locale']; } // Load social links - $socialKeys = ['social_facebook', 'social_twitter', 'social_instagram', 'social_linkedin', 'social_bluesky']; + $socialKeys = ['social_facebook', 'social_twitter', 'social_instagram', 'social_linkedin', 'social_bluesky', 'social_telegram']; foreach ($socialKeys as $socialKey) { if (isset($raw['app'][$socialKey])) { self::$dbSettingsCache['app'][$socialKey] = (string) $raw['app'][$socialKey]; diff --git a/app/Views/frontend/layout.php b/app/Views/frontend/layout.php index 670797662..c25125801 100644 --- a/app/Views/frontend/layout.php +++ b/app/Views/frontend/layout.php @@ -21,6 +21,7 @@ $socialInstagram = (string) ConfigStore::get('app.social_instagram', ''); $socialLinkedin = (string) ConfigStore::get('app.social_linkedin', ''); $socialBluesky = (string) ConfigStore::get('app.social_bluesky', ''); +$socialTelegram = (string) ConfigStore::get('app.social_telegram', ''); $catalogRoute = route_path('catalog'); $reservationsRoute = route_path('reservations'); $wishlistRoute = route_path('wishlist'); @@ -1674,6 +1675,10 @@ class="fab fa-linkedin"> + + + diff --git a/app/Views/settings/index.php b/app/Views/settings/index.php index f9e7b1702..aecaaa782 100644 --- a/app/Views/settings/index.php +++ b/app/Views/settings/index.php @@ -210,6 +210,17 @@ class="block w-full rounded-lg border-gray-300 focus:border-gray-500 focus:ring- class="block w-full rounded-lg border-gray-300 focus:border-gray-500 focus:ring-gray-500 text-sm py-2 px-3" placeholder="= __('https://bsky.app/profile/tuoprofilo') ?>"> +
= __("Lascia vuoto per nascondere il social dal footer") ?> diff --git a/app/Views/user_layout.php b/app/Views/user_layout.php index 72e735b4f..bc7b32aec 100644 --- a/app/Views/user_layout.php +++ b/app/Views/user_layout.php @@ -40,6 +40,7 @@ $socialInstagram = (string) ConfigStore::get('app.social_instagram', ''); $socialLinkedin = (string) ConfigStore::get('app.social_linkedin', ''); $socialBluesky = (string) ConfigStore::get('app.social_bluesky', ''); +$socialTelegram = (string) ConfigStore::get('app.social_telegram', ''); $catalogRoute = route_path('catalog'); $reservationsRoute = route_path('reservations'); $wishlistRoute = route_path('wishlist'); @@ -1063,6 +1064,10 @@ class="fab fa-linkedin"> + + + diff --git a/docs/settings.MD b/docs/settings.MD index a90d4df72..f5f52a4b1 100644 --- a/docs/settings.MD +++ b/docs/settings.MD @@ -37,7 +37,7 @@ La pagina Impostazioni (`/admin/settings`) è organizzata in **11 tab**. Il tab | Tab (`?tab=`) | Contenuto | |---|---| -| `general` | Identità: nome, logo, descrizione footer, link social (Facebook, Twitter/X, Instagram, LinkedIn, Bluesky) | +| `general` | Identità: nome, logo, descrizione footer, link social (Facebook, Twitter/X, Instagram, LinkedIn, Bluesky, Telegram) | | `email` | Provider/SMTP + toggle "richiedi approvazione admin" alla registrazione | | `templates` | Template email (19 tipi) | | `cms` | Contenuti homepage / pagine + layout immagine eventi | diff --git a/installer/database/data_de_DE.sql b/installer/database/data_de_DE.sql index ef1e7c6dc..786fb7da7 100644 --- a/installer/database/data_de_DE.sql +++ b/installer/database/data_de_DE.sql @@ -230,6 +230,7 @@ INSERT INTO `system_settings` (`category`, `setting_key`, `setting_value`, `desc ('app', 'social_instagram', '', 'Instagram-Profil-URL', NOW()), ('app', 'social_linkedin', '', 'LinkedIn-Profil-URL', NOW()), ('app', 'social_bluesky', '', 'Bluesky-Profil-URL', NOW()), +('app', 'social_telegram', '', 'Telegram-Profil-URL', NOW()), -- Email settings are configured by user in installer step 6 -- No default values here to avoid overwriting user choices diff --git a/installer/database/data_en_US.sql b/installer/database/data_en_US.sql index 9f3ba387f..7fb567a98 100644 --- a/installer/database/data_en_US.sql +++ b/installer/database/data_en_US.sql @@ -228,6 +228,7 @@ INSERT INTO `system_settings` (`category`, `setting_key`, `setting_value`, `desc ('app', 'social_instagram', '', 'Instagram profile URL', NOW()), ('app', 'social_linkedin', '', 'LinkedIn profile URL', NOW()), ('app', 'social_bluesky', '', 'Bluesky profile URL', NOW()), +('app', 'social_telegram', '', 'Telegram profile URL', NOW()), -- Email settings are configured by user in installer step 6 -- No default values here to avoid overwriting user choices diff --git a/installer/database/data_fr_FR.sql b/installer/database/data_fr_FR.sql index 8ed9a616c..4555a2868 100644 --- a/installer/database/data_fr_FR.sql +++ b/installer/database/data_fr_FR.sql @@ -230,6 +230,7 @@ INSERT INTO `system_settings` (`category`, `setting_key`, `setting_value`, `desc ('app', 'social_instagram', '', 'URL du profil Instagram', NOW()), ('app', 'social_linkedin', '', 'URL du profil LinkedIn', NOW()), ('app', 'social_bluesky', '', 'URL du profil Bluesky', NOW()), +('app', 'social_telegram', '', 'URL du profil Telegram', NOW()), -- Email settings are configured by user in installer step 6 -- No default values here to avoid overwriting user choices diff --git a/installer/database/data_it_IT.sql b/installer/database/data_it_IT.sql index be51e6898..b901c7cf6 100644 --- a/installer/database/data_it_IT.sql +++ b/installer/database/data_it_IT.sql @@ -281,6 +281,7 @@ INSERT INTO `system_settings` (`category`, `setting_key`, `setting_value`, `desc ('app', 'social_instagram', '', 'Instagram profile URL', NOW()), ('app', 'social_linkedin', '', 'LinkedIn profile URL', NOW()), ('app', 'social_bluesky', '', 'Bluesky profile URL', NOW()), +('app', 'social_telegram', '', 'Telegram profile URL', NOW()), -- Le impostazioni email sono configurate dall'utente nello step 6 dell'installer -- Nessun valore predefinito qui per evitare di sovrascrivere le scelte dell'utente diff --git a/installer/database/migrations/migrate_0.7.35.sql b/installer/database/migrations/migrate_0.7.35.sql new file mode 100644 index 000000000..609f7b668 --- /dev/null +++ b/installer/database/migrations/migrate_0.7.35.sql @@ -0,0 +1,9 @@ +-- Migration 0.7.35 — add Telegram social link setting. +-- +-- Existing installations upgraded to 0.7.35 must get app.social_telegram +-- in system_settings so the new admin/footer integration can persist/read it. +-- INSERT IGNORE keeps this idempotent on reruns and on fresh installs seeded +-- from installer/database/data_*.sql. + +INSERT IGNORE INTO `system_settings` (`category`, `setting_key`, `setting_value`, `description`) VALUES +('app', 'social_telegram', '', 'Telegram profile URL'); diff --git a/tests/issue-257-telegram-social-links.unit.php b/tests/issue-257-telegram-social-links.unit.php new file mode 100644 index 000000000..102521a89 --- /dev/null +++ b/tests/issue-257-telegram-social-links.unit.php @@ -0,0 +1,69 @@ + ''"), 'ConfigStore default includes social_telegram'); + $check(str_contains($settingsController, "'social_telegram' => trim((string) (\$data['social_telegram'] ?? ''))"), 'SettingsController saves social_telegram'); + $check(str_contains($settingsController, "'social_telegram' => \$repository->get('app', 'social_telegram', \$config['social_telegram'] ?? '')"), 'SettingsController resolves social_telegram'); + $check(str_contains($settingsView, 'id="social_telegram"'), 'Settings view has social_telegram input'); + $check(str_contains($settingsView, 'class="fa-brands fa-telegram mr-1"'), 'Settings view uses Telegram icon'); + $check(str_contains($frontendLayout, "ConfigStore::get('app.social_telegram', '')"), 'Frontend layout loads social_telegram'); + $check(str_contains($frontendLayout, 'class="fa-brands fa-telegram"'), 'Frontend layout renders Telegram icon'); + $check(str_contains($userLayout, "ConfigStore::get('app.social_telegram', '')"), 'User layout loads social_telegram'); + $check(str_contains($userLayout, 'class="fa-brands fa-telegram"'), 'User layout renders Telegram icon'); + $check(str_contains($migration, "'app', 'social_telegram', '', 'Telegram profile URL'"), 'Migration inserts social_telegram'); + $check(str_contains($seedEn, "('app', 'social_telegram', '', 'Telegram profile URL', NOW())"), 'en_US seed includes social_telegram'); + $check(str_contains($seedDe, "('app', 'social_telegram', '', 'Telegram-Profil-URL', NOW())"), 'de_DE seed includes social_telegram'); + $check(str_contains($seedFr, "('app', 'social_telegram', '', 'URL du profil Telegram', NOW())"), 'fr_FR seed includes social_telegram'); + $check(str_contains($seedIt, "('app', 'social_telegram', '', 'Telegram profile URL', NOW())"), 'it_IT seed includes social_telegram'); +} catch (Throwable $e) { + $failed++; + echo " FAIL exception: " . $e->getMessage() . "\n"; +} + +echo "\n {$passed} passed, {$failed} failed\n"; +exit($failed === 0 ? 0 : 1);