diff --git a/app/Enums/StaticPageType.php b/app/Enums/StaticPageType.php index b68d41f..f82a442 100644 --- a/app/Enums/StaticPageType.php +++ b/app/Enums/StaticPageType.php @@ -13,7 +13,6 @@ enum StaticPageType: int case confidentiality = 3; case home = 4; case ranges = 5; - case range = 6; case klub = 7; case klub_register = 8; case history = 9; @@ -29,7 +28,6 @@ enum StaticPageType: int self::confidentiality->name => 'Confidentialité', self::home->name => 'Accueil', self::ranges->name => 'Nos gammes', - self::range->name => 'Une gamme', self::klub->name => 'Le Klub', self::klub_register->name => 'Le Klub - Inscription', self::history->name => 'Notre Histoire', diff --git a/app/Http/Controllers/Fo/RangeController.php b/app/Http/Controllers/Fo/RangeController.php index e38e85b..3687098 100644 --- a/app/Http/Controllers/Fo/RangeController.php +++ b/app/Http/Controllers/Fo/RangeController.php @@ -38,7 +38,6 @@ class RangeController extends Controller ->where('published', true) ->orderBy('order', 'asc') ->paginate(9); - $staticPageModel = StaticPage::query()->where('type', StaticPageType::range)->first(); $newsModels = News::query() ->where('published', true) ->orderBy('created_at', 'desc') @@ -49,7 +48,6 @@ class RangeController extends Controller 'rangeModel', 'rangeModels', 'productModels', - 'staticPageModel', 'newsModels' )); } diff --git a/app/Http/Requests/Bo/Ranges/StoreRangeRequest.php b/app/Http/Requests/Bo/Ranges/StoreRangeRequest.php index fa11f63..1aac9b0 100644 --- a/app/Http/Requests/Bo/Ranges/StoreRangeRequest.php +++ b/app/Http/Requests/Bo/Ranges/StoreRangeRequest.php @@ -40,6 +40,8 @@ class StoreRangeRequest extends FormRequest public function rules(): array { $rules = [ + 'seo_title' => 'required|between:45,70', + 'seo_description' => 'required|between:50,160', 'label' => 'required|string|between:3,255', 'picture_alt' => 'required|string|between:3,255', 'picture_title' => 'required|string|between:3,255', @@ -71,6 +73,8 @@ class StoreRangeRequest extends FormRequest public function attributes(): array { return [ + 'seo_title' => trans('validation.custom.seo_title'), + 'seo_description' => trans('validation.custom.seo_description'), 'label' => trans('validation.custom.label'), 'picture_alt' => trans('validation.custom.attribute_alt'), 'picture_title' => trans('validation.attributes.attribute_title'), diff --git a/app/Models/Range.php b/app/Models/Range.php index 045d83f..cba2cd6 100644 --- a/app/Models/Range.php +++ b/app/Models/Range.php @@ -11,6 +11,8 @@ use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Str; /** + * @property string $seo_title Utilisé pour la balise title de la page. + * @property string $seo_description Utilisé pour la balise meta description * @property string $label Label de la gamme. * @property string $slug Slug à partir du label de la gamme. * @property string $picture Path de l'image de la gamme (579px * 579px). @@ -46,6 +48,8 @@ class Range extends Model * @var array */ protected $fillable = [ + 'seo_title', + 'seo_description', 'label', 'picture', 'picture_alt', diff --git a/database/factories/RangeFactory.php b/database/factories/RangeFactory.php index 26b9266..fc31b93 100644 --- a/database/factories/RangeFactory.php +++ b/database/factories/RangeFactory.php @@ -16,6 +16,8 @@ class RangeFactory extends Factory { $label = fake()->text(15); return [ + 'seo_title' => fake()->sentence(), + 'seo_description' => fake()->sentence(), 'label' => $label, 'slug' => Str::slug($label), 'picture_alt' => fake()->sentence(), diff --git a/database/migrations/2024_01_05_154910_add_seo_title_and_description_to_ranges_table.php b/database/migrations/2024_01_05_154910_add_seo_title_and_description_to_ranges_table.php new file mode 100644 index 0000000..c286c27 --- /dev/null +++ b/database/migrations/2024_01_05_154910_add_seo_title_and_description_to_ranges_table.php @@ -0,0 +1,41 @@ +get(); + Schema::table('ranges', function (Blueprint $table) { + $table->string('seo_title')->after('id') + ->comment('Utilisé pour la balise title de la page de gamme'); + $table->string('seo_description')->after('seo_title') + ->comment('Utilisé pour la balise meta description de la page de gamme'); + }); + $ranges->each(function (object $range) { + DB::table('ranges')->where('id', $range->id) + ->update([ + 'seo_title' => $range->label, + 'seo_description' => $range->label, + ]); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('ranges', function (Blueprint $table) { + $table->dropColumn('seo_title'); + $table->dropColumn('seo_description'); + }); + } +}; diff --git a/resources/views/bo/pages/ranges/form.blade.php b/resources/views/bo/pages/ranges/form.blade.php index eb430a7..b33be96 100644 --- a/resources/views/bo/pages/ranges/form.blade.php +++ b/resources/views/bo/pages/ranges/form.blade.php @@ -1,4 +1,76 @@
+ {{-- SEO --}} +
+
+ {{ Str::ucfirst(__('validation.custom.seo')) }} +
+ {{-- SEO_TITLE --}} +
+ @include('bo.partials.inputs.varchar', [ + 'id' => 'rangeSeoTitle', + 'label' => __(':field :inter:model', [ + 'field' => Str::ucfirst(__('validation.custom.seo_title')), + 'inter' => __('validation.custom.of_the.male'), + 'model' => __('models.classes.range'), + ]), + 'hasWordCounter' => true, + 'name' => 'seo_title', + 'required' => true, + 'model' => $rangeModel ?? null, + 'helper' => sprintf( + '%s %s', + __('crud.helpers.seo_title'), + __('validation.between.string', [ + 'attribute' => __(':field :inter:model', [ + 'field' => __('validation.custom.seo_title'), + 'inter' => __('validation.custom.of_the.female'), + 'model' => __('models.classes.range'), + ]), + 'min' => 45, + 'max' => 70, + ])), + 'placeholder' => __(':field :inter:model', [ + 'field' => Str::ucfirst(__('validation.custom.seo_title')), + 'inter' => __('validation.custom.of_the.male'), + 'model' => __('models.classes.range'), + ]), + ]) +
+ {{-- SEO_DESCRIPTION --}} +
+ @include('bo.partials.inputs.varchar-multiline', [ + 'id' => 'rangeSeoDescription', + 'label' => __(':field :inter:model', [ + 'field' => Str::ucfirst(__('validation.custom.seo_description')), + 'inter' => __('validation.custom.of_the.male'), + 'model' => __('models.classes.range'), + ]), + 'hasWordCounter' => true, + 'name' => 'seo_description', + 'required' => true, + 'model' => $rangeModel ?? null, + 'helper' => sprintf( + '%s %s', + __('crud.helpers.seo_description'), + __('validation.between.string', [ + 'attribute' => __(':field :inter:model', [ + 'field' => __('validation.custom.seo_description'), + 'inter' => __('validation.custom.of_the.female'), + 'model' => __('models.classes.range'), + ]), + 'min' => 50, + 'max' => 160, + ])), + 'placeholder' => __(':field :inter:model', [ + 'field' => Str::ucfirst(__('validation.custom.seo_description')), + 'inter' => __('validation.custom.of_the.male'), + 'model' => __('models.classes.range'), + ]), + ]) +
+
+
+
{{-- LABEL --}}
diff --git a/resources/views/fo/pages/ranges/show.blade.php b/resources/views/fo/pages/ranges/show.blade.php index d84ae91..fa90993 100644 --- a/resources/views/fo/pages/ranges/show.blade.php +++ b/resources/views/fo/pages/ranges/show.blade.php @@ -1,7 +1,7 @@ @extends('fo.layout') -@section('title', __($staticPageModel->seo_title)) -@section('description', __($staticPageModel->seo_description)) +@section('title', __($rangeModel->seo_title)) +@section('description', __($rangeModel->seo_description)) @section('breadcrumb', request()->route()->getName())