diff --git a/app/Http/Controllers/Admin/AdminContentController.php b/app/Http/Controllers/Admin/AdminContentController.php index 305d917f2..6f5fcd109 100644 --- a/app/Http/Controllers/Admin/AdminContentController.php +++ b/app/Http/Controllers/Admin/AdminContentController.php @@ -193,16 +193,26 @@ class AdminContentController extends BasePageController */ protected function normalizeContentUrl(array $data): array { - if (isset($data['url'])) { - // Ensure URL starts with / - if ($data['url'] !== '/' && !str_starts_with($data['url'], '/')) { - $data['url'] = '/'.$data['url']; - } + if (isset($data['url']) && $data['url'] !== '') { + $url = $data['url']; - // Ensure URL ends with / - if (!str_ends_with($data['url'], '/')) { - $data['url'] .= '/'; + // Check if URL is external (has protocol or is a domain pattern) + $hasProtocol = str_starts_with($url, 'http://') || str_starts_with($url, 'https://'); + $isDomain = !str_starts_with($url, '/') && preg_match('/^[a-zA-Z0-9][a-zA-Z0-9-]*\.[a-zA-Z]{2,}/', $url); + + // Only normalize internal URLs (those starting with / or root) + if (!$hasProtocol && !$isDomain) { + // Ensure internal URL starts with / + if ($url !== '/' && !str_starts_with($url, '/')) { + $data['url'] = '/' . $url; + } + + // Ensure internal URL ends with / + if (!str_ends_with($data['url'], '/')) { + $data['url'] .= '/'; + } } + // External URLs are left as-is } return $data; diff --git a/app/View/Composers/GlobalDataComposer.php b/app/View/Composers/GlobalDataComposer.php index cece08f89..2d0c293a1 100644 --- a/app/View/Composers/GlobalDataComposer.php +++ b/app/View/Composers/GlobalDataComposer.php @@ -4,6 +4,7 @@ namespace App\View\Composers; use App\Events\UserLoggedIn; use App\Models\Category; +use App\Models\Content; use App\Models\Settings; use App\Models\User; use Illuminate\Support\Facades\Auth; @@ -34,6 +35,13 @@ class GlobalDataComposer $viewData['site'] = $siteArray; // Now it's a proper array, not a Settings model } + // Load useful links for sidebar + $usefulLinks = Content::active() + ->ofType(Content::TYPE_USEFUL) + ->orderBy('ordinal') + ->get(); + $viewData['usefulLinks'] = $usefulLinks; + if (Auth::check()) { $userdata = User::find(Auth::id()); $userdata->categoryexclusions = User::getCategoryExclusionById(Auth::id()); diff --git a/resources/views/partials/sidebar.blade.php b/resources/views/partials/sidebar.blade.php index 6ac652faf..5e41ca0f6 100644 --- a/resources/views/partials/sidebar.blade.php +++ b/resources/views/partials/sidebar.blade.php @@ -111,6 +111,67 @@ + + @if(isset($usefulLinks) && $usefulLinks->isNotEmpty()) + + @endif + @auth @php @@ -143,5 +204,104 @@ @endauth +@push('styles') + +@endpush