Skip to content

Commit fd366f6

Browse files
committed
feat: add slug generation functionality with DefaultSlugGenerator and ContentSlugFactory
1 parent cef97b2 commit fd366f6

File tree

5 files changed

+62
-3
lines changed

5 files changed

+62
-3
lines changed

config/inspirecms.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
use SolutionForest\InspireCms\Commands\ExecuteImportCommand;
66
use SolutionForest\InspireCms\Content\DefaultPreviewProvider;
77
use SolutionForest\InspireCms\Content\DefaultSegmentProvider;
8+
use SolutionForest\InspireCms\Content\DefaultSlugGenerator;
89
use SolutionForest\InspireCms\Exports\Exporters\DocumentTypeExporter;
910
use SolutionForest\InspireCms\Exports\Exporters\FieldGroupExporter;
1011
use SolutionForest\InspireCms\Exports\Exporters\ImportUsedExporter;
@@ -444,6 +445,7 @@
444445
],
445446
'segment_provider' => DefaultSegmentProvider::class,
446447
'preview_provider' => DefaultPreviewProvider::class,
448+
'slug_generator' => DefaultSlugGenerator::class,
447449
],
448450

449451
'sitemap' => [
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
<?php
2+
3+
namespace SolutionForest\InspireCms\Content;
4+
5+
use Illuminate\Support\Str;
6+
7+
class DefaultSlugGenerator implements SlugGeneratorInterface
8+
{
9+
public function generate($text)
10+
{
11+
return Str::slug($text);
12+
}
13+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
namespace SolutionForest\InspireCms\Content;
4+
5+
interface SlugGeneratorInterface
6+
{
7+
/**
8+
* Generates a slug from the provided text.
9+
*
10+
* @param string $text The text to convert into a slug
11+
* @return string The generated slug
12+
*/
13+
public function generate($text);
14+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?php
2+
3+
namespace SolutionForest\InspireCms\Factories;
4+
5+
use SolutionForest\InspireCms\Content\DefaultSlugGenerator;
6+
use SolutionForest\InspireCms\Content\SlugGeneratorInterface;
7+
use SolutionForest\InspireCms\InspireCmsConfig;
8+
9+
class ContentSlugFactory
10+
{
11+
public static function create(): SlugGeneratorInterface
12+
{
13+
$class = InspireCmsConfig::get('frontend.slug_generator', DefaultSlugGenerator::class);
14+
15+
static::guardAgainstInvalidContentSlugGenerator($class);
16+
17+
return app($class);
18+
}
19+
20+
protected static function guardAgainstInvalidContentSlugGenerator(string $class): void
21+
{
22+
if (! in_array(SlugGeneratorInterface::class, class_implements($class))) {
23+
throw new \InvalidArgumentException('Must implement ' . SlugGeneratorInterface::class);
24+
}
25+
}
26+
}

src/Filament/Resources/ContentResource.php

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
use SolutionForest\InspireCms\DataTypes\Manifest\ContentStatusOption;
2727
use SolutionForest\InspireCms\Dtos\LanguageDto;
2828
use SolutionForest\InspireCms\Facades\InspireCms;
29+
use SolutionForest\InspireCms\Factories\ContentSlugFactory;
2930
use SolutionForest\InspireCms\Filament\Clusters\Content;
3031
use SolutionForest\InspireCms\Filament\Concerns\ClusterSectionResourceTrait;
3132
use SolutionForest\InspireCms\Filament\Contracts\ClusterSectionResource;
@@ -512,10 +513,10 @@ protected static function getTitleFormComponent()
512513
->validationAttribute(__('inspirecms::resources/content.title.validation_attribute'))
513514
->placeholder(__('inspirecms::resources/content.title.placeholder'))
514515
->helperText(__('inspirecms::resources/content.title.instructions'))
515-
->live(true, 500)->afterStateUpdated(function ($state, $get, $set, $operation, ContentForm $livewire) {
516+
->live(true, 5000)->afterStateUpdated(function ($state, $get, $set, $operation, ContentForm $livewire) {
516517
// Fill slug if empty / operation is create
517518
if ($operation === 'create' || empty($get('slug'))) {
518-
$set('slug', Str::slug($state));
519+
$set('slug', ContentSlugFactory::create()->generate($state));
519520
}
520521
$locale = $livewire->getActiveActionsLocale();
521522
$set("webSetting.seo.meta_title.{$locale}", $state);
@@ -536,7 +537,10 @@ protected static function getSlugFormComponent()
536537
->validationAttribute(__('inspirecms::resources/content.slug.validation_attribute'))
537538
->placeholder(__('inspirecms::resources/content.slug.placeholder'))
538539
->helperText(__('inspirecms::resources/content.slug.instructions'))
539-
->live(true, 500)->afterStateUpdated(fn ($component, $state) => $component->state(Str::slug($state)))
540+
->live(true, 5000)
541+
->afterStateUpdated(function ($component, $state) {
542+
return $component->state(ContentSlugFactory::create()->generate($state));
543+
})
540544
->unique(table: static::getModel(), column: 'slug', ignoreRecord: true, modifyRuleUsing: function (\Illuminate\Validation\Rules\Unique $rule, callable $get, ContentForm $livewire, string $operation) {
541545
$model = new (static::getModel());
542546

0 commit comments

Comments
 (0)