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