Skip to content

Commit b099383

Browse files
committed
Add route helpers
1 parent b5ca6f0 commit b099383

9 files changed

+176
-24
lines changed

README.md

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,12 @@ php artisan vendor:publish --tag="filament-flexible-content-block-pages-migratio
3030
php artisan migrate
3131
```
3232

33+
Further configure the third-party packages that are used. Check the installation documentation of these packages:
34+
35+
- [Laravel Localization](https://github.com/mcamara/laravel-localization?tab=readme-ov-file#installation):
36+
Make sure the middlewares are properly setup if you want to use localised routes.
37+
38+
3339
Check [the configuration documentation}(#configuration) for more explanations on how to tweak the package.
3440

3541
Optionally, you can publish the views using
@@ -40,12 +46,19 @@ php artisan vendor:publish --tag="filament-flexible-content-block-pages-views"
4046

4147
## Setup in your project
4248

49+
### Translations
50+
51+
If you want translated content and routes, go through the following steps:
52+
53+
1. Configure the supported locales in the Filament Flexible Content Blocks configuration
54+
2. Configure the `route_helper` in [`filament-flexible-content-block-pages.php`](./config/filament-flexible-content-block-pages.php)
55+
4356
### Routes
4457

4558
Register the routes in your route file, probably `web.php`:
4659

4760
```php
48-
\Statikbe\FilamentFlexibleContentBlockPages\Facades\FilamentFlexibleContentBlockPages::routes();
61+
\Statikbe\FilamentFlexibleContentBlockPages\Facades\FilamentFlexibleContentBlockPages::defineRoutes();
4962
```
5063

5164
### Filament panel

config/filament-flexible-content-block-pages.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,5 @@
5555
'default_canonical_locale' => 'nl',
5656
],
5757

58+
'route_helper' => \Statikbe\FilamentFlexibleContentBlockPages\Routes\LocalisedPageRouteHelper::class,
5859
];

src/FilamentFlexibleContentBlockPages.php

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22

33
namespace Statikbe\FilamentFlexibleContentBlockPages;
44

5-
use Illuminate\Support\Facades\Route;
6-
use Statikbe\FilamentFlexibleContentBlockPages\Http\Controllers\PageController;
5+
use Statikbe\FilamentFlexibleContentBlockPages\Models\Page;
6+
use Statikbe\FilamentFlexibleContentBlockPages\Models\Settings;
77

88
class FilamentFlexibleContentBlockPages
99
{
@@ -14,13 +14,16 @@ public function config(): FilamentFlexibleContentBlockPagesConfig
1414

1515
public function routes(): void
1616
{
17-
Route::get('{grandparent}/{parent}/{page}', [PageController::class, 'grandchildIndex'])
18-
->name('filament-flexible-content-block-pages::child_page_index');
19-
Route::get('{parent}/{page}', [PageController::class, 'childIndex'])
20-
->name('filament-flexible-content-block-pages::child_page_index');
21-
Route::get('{page}', [PageController::class, 'index'])
22-
->name('filament-flexible-content-block-pages::page_index');
23-
Route::get('/', [PageController::class, 'homeIndex'])
24-
->name('home');
17+
$this->config()->getRouteHelper()::defineRoutes();
18+
}
19+
20+
public function getUrl(Page $page, ?string $locale = null): string
21+
{
22+
return $this->config()->getRouteHelper()::getUrl($page, $locale);
23+
}
24+
25+
public function getSettings(): Settings
26+
{
27+
return $this->config()->getSettingsModel()::getSettings();
2528
}
2629
}

src/FilamentFlexibleContentBlockPagesConfig.php

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
use Statikbe\FilamentFlexibleContentBlockPages\Models\Page;
77
use Statikbe\FilamentFlexibleContentBlockPages\Models\Redirect;
88
use Statikbe\FilamentFlexibleContentBlockPages\Models\Settings;
9+
use Statikbe\FilamentFlexibleContentBlockPages\Routes\Contracts\HandlesPageRoutes;
10+
use Statikbe\FilamentFlexibleContentBlockPages\Routes\LocalisedPageRouteHelper;
911
use Statikbe\FilamentFlexibleContentBlocks\FilamentFlexibleContentBlocksServiceProvider;
1012

1113
class FilamentFlexibleContentBlockPagesConfig
@@ -24,11 +26,13 @@ class FilamentFlexibleContentBlockPagesConfig
2426

2527
private string $settingsModel;
2628

29+
private HandlesPageRoutes $routeHelper;
30+
2731
public function __construct()
2832
{
2933
$this->pageModel = $this->packageConfig('models.page', Page::class);
30-
$this->redirectModel = $this->packageConfig('models.redirect', \Statikbe\FilamentFlexibleContentBlockPages\Models\Redirect::class);
31-
$this->settingsModel = $this->packageConfig('models.settings', \Statikbe\FilamentFlexibleContentBlockPages\Models\Settings::class);
34+
$this->redirectModel = $this->packageConfig('models.redirect', Redirect::class);
35+
$this->settingsModel = $this->packageConfig('models.settings', Settings::class);
3236
}
3337

3438
public function getSupportedLocales(): array
@@ -102,6 +106,15 @@ public function getSEODefaultCanonicalLocale(): string
102106
return $this->packageConfig('seo.default_canonical_locale', 'en');
103107
}
104108

109+
public function getRouteHelper(): HandlesPageRoutes
110+
{
111+
if (! $this->routeHelper) {
112+
$this->routeHelper = app($this->packageConfig('route_helper', LocalisedPageRouteHelper::class));
113+
}
114+
115+
return $this->routeHelper;
116+
}
117+
105118
private function packageConfig(string $configKey, $default = null): mixed
106119
{
107120
return config('filament-flexible-content-block-pages.'.$configKey);

src/Models/Page.php

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@
44

55
use Illuminate\Database\Eloquent\Factories\HasFactory;
66
use Illuminate\Database\Eloquent\Model;
7-
use Mcamara\LaravelLocalization\Facades\LaravelLocalization;
87
use Spatie\MediaLibrary\HasMedia;
98
use Statikbe\FilamentFlexibleContentBlockPages\Facades\FilamentFlexibleContentBlockPages;
109
use Statikbe\FilamentFlexibleContentBlocks\Models\Concerns\HasAuthorAttributeTrait;
@@ -54,16 +53,7 @@ public function getTable()
5453

5554
public function getViewUrl(?string $locale = null): string
5655
{
57-
// toggle the locale to make sure the slug gets translated:
58-
/*$currentLocale = app()->getLocale();
59-
$locale = $locale ?? $currentLocale;
60-
61-
$url = LaravelLocalization::getLocalizedUrl($locale, route('home_index')) . '/' . $this->translate('slug', $locale);
62-
63-
return $url;*/
64-
65-
// TODO
66-
return 'https://www.google.com';
56+
return FilamentFlexibleContentBlockPages::getUrl($this, $locale);
6757
}
6858

6959
public function getPreviewUrl(?string $locale = null): string
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php
2+
3+
namespace Statikbe\FilamentFlexibleContentBlockPages\Routes;
4+
5+
use Illuminate\Support\Facades\Route;
6+
use Statikbe\FilamentFlexibleContentBlockPages\Http\Controllers\PageController;
7+
use Statikbe\FilamentFlexibleContentBlockPages\Routes\Contracts\HandlesPageRoutes;
8+
9+
abstract class AbstractPageRouteHelper implements HandlesPageRoutes
10+
{
11+
const ROUTE_PAGE = 'filament-flexible-content-block-pages::child_page_index';
12+
13+
const ROUTE_HOME = 'home';
14+
15+
const ROUTE_CHILD_PAGE = 'filament-flexible-content-block-pages::child_page_index';
16+
17+
const ROUTE_GRANDCHILD_PAGE = 'filament-flexible-content-block-pages::grandchild_page_index';
18+
19+
public function defineRoutes(): void
20+
{
21+
Route::get('{grandparent}/{parent}/{page}', [PageController::class, 'grandchildIndex'])
22+
->name(static::ROUTE_GRANDCHILD_PAGE);
23+
Route::get('{parent}/{page}', [PageController::class, 'childIndex'])
24+
->name(static::ROUTE_CHILD_PAGE);
25+
Route::get('{page}', [PageController::class, 'index'])
26+
->name(static::ROUTE_PAGE);
27+
Route::get('/', [PageController::class, 'homeIndex'])
28+
->name(static::ROUTE_HOME);
29+
}
30+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
3+
namespace Statikbe\FilamentFlexibleContentBlockPages\Routes\Contracts;
4+
5+
use Statikbe\FilamentFlexibleContentBlockPages\Models\Page;
6+
7+
interface HandlesPageRoutes
8+
{
9+
/**
10+
* Create the page routes. Routes needed:
11+
* - home page
12+
* - page
13+
* - page with parent
14+
* - page with grandparent
15+
*/
16+
public function defineRoutes(): void;
17+
18+
/**
19+
* Returns the url of the given page in the given locale.
20+
*/
21+
public function getUrl(Page $page, ?string $locale = null): string;
22+
}
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<?php
2+
3+
namespace Statikbe\FilamentFlexibleContentBlockPages\Routes;
4+
5+
use Illuminate\Support\Facades\Route;
6+
use Mcamara\LaravelLocalization\Facades\LaravelLocalization;
7+
use Statikbe\FilamentFlexibleContentBlockPages\Models\Page;
8+
9+
/**
10+
* Handles localised URLs.
11+
*/
12+
class LocalisedPageRouteHelper extends AbstractPageRouteHelper
13+
{
14+
public function defineRoutes(): void
15+
{
16+
Route::group([
17+
'prefix' => LaravelLocalization::setLocale(),
18+
'middleware' => ['localeSessionRedirect', 'localizationRedirect', 'localeViewPath', 'localize'],
19+
], function () {
20+
parent::defineRoutes();
21+
});
22+
}
23+
24+
public function getUrl(Page $page, ?string $locale = null): string
25+
{
26+
if ($page->code === Page::HOME_PAGE) {
27+
return LaravelLocalization::getLocalizedUrl($locale, static::ROUTE_HOME);
28+
}
29+
30+
$ancestorSlugs = [];
31+
$locale = $locale ?? app()->getLocale();
32+
33+
if ($page->parent?->parent) {
34+
$ancestorSlugs[] = $page->parent->parent->translate('slug', $locale);
35+
}
36+
37+
if ($page->parent) {
38+
$ancestorSlugs[] = $page->parent->translate('slug', $locale);
39+
}
40+
41+
$ancestorSlugs[] = $page->translate('slug', $locale);
42+
43+
return LaravelLocalization::getLocalizedUrl($locale, route(static::ROUTE_HOME)).'/'.implode('/', $ancestorSlugs);
44+
}
45+
}

src/Routes/PageRouteHelper.php

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?php
2+
3+
namespace Statikbe\FilamentFlexibleContentBlockPages\Routes;
4+
5+
use Statikbe\FilamentFlexibleContentBlockPages\Models\Page;
6+
7+
/**
8+
* Handles non-localised URLs.
9+
*/
10+
class PageRouteHelper extends AbstractPageRouteHelper
11+
{
12+
public function getUrl(Page $page, ?string $locale = null): string
13+
{
14+
if ($page->code === Page::HOME_PAGE) {
15+
return route(static::ROUTE_HOME);
16+
}
17+
18+
if ($page->parent && $page->parent->parent) {
19+
return route(static::ROUTE_GRANDCHILD_PAGE, [
20+
'grandparent' => $page->parent->parent,
21+
'parent' => $page->parent,
22+
'page' => $page,
23+
]);
24+
}
25+
26+
if ($page->parent) {
27+
return route(static::ROUTE_CHILD_PAGE, [
28+
'parent' => $page->parent,
29+
'page' => $page,
30+
]);
31+
}
32+
33+
return route('page_index', ['page' => $page]);
34+
}
35+
}

0 commit comments

Comments
 (0)