Générer des slugs à partir d’un titre dans Filament

Générer des slugs à partir d’un titre dans Filament

Le filament Documentation offre une belle solution de copier-coller pour générer des slugs à partir d’un titre.

Cet exemple définit le champ de titre comme étant un champ Livewire Live, puis, lorsque vous saisissez des caractères, il génère un slug et le définit sur un autre champ de formulaire.

use FilamentFormsComponentsTextInput;

use FilamentFormsSet;

use IlluminateSupportStr;

 

TextInput::make('title')

->live()

->afterStateUpdated(fn (Set $set, ?string $state) => $set('slug', Str::slug($state)))

 

TextInput::make('slug')

Cela fonctionne très bien dans la plupart des situations, mais je voulais aller plus loin et modifier dynamiquement le slug uniquement s’il s’agit d’une nouvelle entrée ou s’il n’a pas encore été publié. Sinon, si un slug est modifié, cela provoquera un 404 puisque l’ancien n’existe pas.

Pour résoudre ce problème, voici une version mise à jour qui n’est mise à jour que s’il s’agit d’un nouvel enregistrement ou s’il n’a pas été publié :

TextInput::make('title')

->live()

->afterStateUpdated(function (Get $get, Set $set, ?string $operation, ?string $old, ?string $state, ?Model $record) {

 

if ($operation == 'edit' && $record->isPublished()) {

return;

}

 

if (($get('slug') ?? '') !== Str::slug($old)) {

return;

}

 

$set('slug', Str::slug($state));

})

Pour expliquer le code, le afterStateUpdated dans Filament vous permet d’injecter à la fois l’opération (créer ou modifier) ​​et le modèle, que vous pouvez ensuite utiliser pour déterminer si le slug doit être mis à jour ou laissé seul. C’est ce que fait l’instruction if :

if ($operation == 'edit' && $record->isPublished())

Cela signifie que si nous sommes sur la page d’édition et que le modèle est publié, ignorez la configuration dynamique du slug.

Vous pouvez également désactiver le champ slug si l’enregistrement est déjà publié, et cela peut être réalisé facilement :

TextInput::make('slug')

->required()

->maxLength(255)

->unique(Article::class, 'slug', fn ($record) => $record)

->disabled(fn (?string $operation, ?Model $record) => $operation == 'edit' && $record->isPublished())

Grâce à Alex Six pour m’avoir aidé à configurer cela et à travailler.


2024-01-01 22:04:09
1704136713


#Générer #des #slugs #partir #dun #titre #dans #Filament

Facebook
Twitter
LinkedIn
Pinterest

Leave a Comment

This site uses Akismet to reduce spam. Learn how your comment data is processed.