diff --git a/app/Controllers/SettingsController.php b/app/Controllers/SettingsController.php index 08ccfe71..a87a0a57 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 d8b856d9..fa04b1ce 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 67079766..c2512580 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 f9e7b170..aecaaa78 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 72e735b4..bc7b32ae 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 a90d4df7..f5f52a4b 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 ef1e7c6d..786fb7da 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 9f3ba387..7fb567a9 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 8ed9a616..4555a286 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 be51e689..b901c7cf 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 00000000..609f7b66 --- /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 00000000..102521a8 --- /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);