From 1152dcb995f593e22c2dca042d9a9b425cafbf73 Mon Sep 17 00:00:00 2001 From: Corentin Huet Date: Thu, 11 Jun 2026 17:04:36 +0200 Subject: [PATCH] feat: :sparkles: add global text administration --- app/Enums/StaticPageType.php | 8 + .../Controllers/Bo/StaticPageController.php | 15 +- .../Controllers/Fo/CommitmentController.php | 22 ++ app/Http/Controllers/Fo/HomeController.php | 6 +- .../Controllers/Fo/ProductsController.php | 6 +- .../StaticPages/UpdateStaticPageRequest.php | 40 ++- app/Models/StaticPage.php | 21 +- app/Providers/AppServiceProvider.php | 9 +- app/Traits/Models/MiniCrudModel.php | 17 ++ ..._06_11_105926_alter_static_pages_table.php | 29 ++ ...1_112856_add_data_to_static_pages_home.php | 154 ++++++++++ ...1348_add_data_to_static_pages_products.php | 119 ++++++++ ...3_add_data_to_static_pages_commitments.php | 162 +++++++++++ ...52435_add_data_to_static_pages_recipes.php | 110 ++++++++ .../bo/modules/minicrud-form-inputs.blade.php | 266 ++++++++++++++++++ .../bo/pages/static_pages/form.blade.php | 215 +++++++------- resources/views/fo/layouts/footer.blade.php | 23 +- resources/views/fo/pages/engagments.blade.php | 22 +- resources/views/fo/pages/home.blade.php | 32 ++- .../views/fo/pages/products/index.blade.php | 29 +- .../views/fo/partials/local-block.blade.php | 14 +- routes/web-bo.php | 2 +- routes/web-fo.php | 11 +- 23 files changed, 1168 insertions(+), 164 deletions(-) create mode 100644 app/Http/Controllers/Fo/CommitmentController.php create mode 100644 database/migrations/2026_06_11_105926_alter_static_pages_table.php create mode 100644 database/migrations/2026_06_11_112856_add_data_to_static_pages_home.php create mode 100644 database/migrations/2026_06_11_121348_add_data_to_static_pages_products.php create mode 100644 database/migrations/2026_06_11_142413_add_data_to_static_pages_commitments.php create mode 100644 database/migrations/2026_06_11_152435_add_data_to_static_pages_recipes.php create mode 100644 resources/views/bo/modules/minicrud-form-inputs.blade.php diff --git a/app/Enums/StaticPageType.php b/app/Enums/StaticPageType.php index 9a3d522..b804dbf 100644 --- a/app/Enums/StaticPageType.php +++ b/app/Enums/StaticPageType.php @@ -10,6 +10,10 @@ enum StaticPageType: int case legals = 1; case confidentiality = 2; + case homepage = 3; + case our_products = 4; + case our_commitments = 5; + case banner_section = 6; /** * Optionnal labels definition. @@ -19,5 +23,9 @@ enum StaticPageType: int private const LABELS = [ self::legals->name => 'Mentions légales', self::confidentiality->name => 'Confidentialité', + self::homepage->name => 'Accueil', + self::our_products->name => 'Nos produits', + self::our_commitments->name => 'Nos engagements', + self::banner_section->name => 'Section bannière', ]; } diff --git a/app/Http/Controllers/Bo/StaticPageController.php b/app/Http/Controllers/Bo/StaticPageController.php index 9b92073..8dca3ac 100644 --- a/app/Http/Controllers/Bo/StaticPageController.php +++ b/app/Http/Controllers/Bo/StaticPageController.php @@ -74,7 +74,20 @@ class StaticPageController extends Controller public function update(UpdateStaticPageRequest $request, StaticPage $static_page): \Illuminate\Http\RedirectResponse { return DB::transaction(function () use ($request, $static_page) { - $static_page->fill($request->validated()); + $validated = $request->validated(); + $data = $static_page->data; + + foreach ($validated['data'] as $key => $input) { + if (isset($input['value']) && is_array($input['value'])) { + $data[$key]['value'] = $input['value']; + } + } + + $static_page->data = $data; + $static_page->fill(array_replace_recursive( + $static_page->getFillableFields($static_page), + $validated + )); if ($static_page->saveOrFail()) { return redirect()->route('bo.static_pages.edit', $static_page) diff --git a/app/Http/Controllers/Fo/CommitmentController.php b/app/Http/Controllers/Fo/CommitmentController.php new file mode 100644 index 0000000..18b568e --- /dev/null +++ b/app/Http/Controllers/Fo/CommitmentController.php @@ -0,0 +1,22 @@ +where('type', StaticPageType::our_commitments)->first(); + + return view('fo.pages.engagments', compact('staticPageModel')); + } +} diff --git a/app/Http/Controllers/Fo/HomeController.php b/app/Http/Controllers/Fo/HomeController.php index 38b31e0..2dd077f 100644 --- a/app/Http/Controllers/Fo/HomeController.php +++ b/app/Http/Controllers/Fo/HomeController.php @@ -2,9 +2,11 @@ namespace App\Http\Controllers\Fo; +use App\Enums\StaticPageType; use App\Http\Controllers\Controller; use App\Models\Range; use App\Models\Recipe; +use App\Models\StaticPage; class HomeController extends Controller { @@ -15,6 +17,8 @@ class HomeController extends Controller */ public function index() { + $staticPageModel = StaticPage::query()->where('type', StaticPageType::homepage)->first(); + // Gammes. $ranges = Range::query()->where('status', true) ->get(); @@ -26,6 +30,6 @@ class HomeController extends Controller ->take(3) ->get(); - return view('fo.pages.home', compact('ranges', 'publishedRecipes')); + return view('fo.pages.home', compact('staticPageModel', 'ranges', 'publishedRecipes')); } } diff --git a/app/Http/Controllers/Fo/ProductsController.php b/app/Http/Controllers/Fo/ProductsController.php index 8cbc0d6..d9190ed 100644 --- a/app/Http/Controllers/Fo/ProductsController.php +++ b/app/Http/Controllers/Fo/ProductsController.php @@ -2,9 +2,11 @@ namespace App\Http\Controllers\Fo; +use App\Enums\StaticPageType; use App\Http\Controllers\Controller; use App\Models\Product; use App\Models\Range; +use App\Models\StaticPage; use Illuminate\Database\Eloquent\Builder; class ProductsController extends Controller @@ -16,11 +18,13 @@ class ProductsController extends Controller */ public function index() { + $staticPageModel = StaticPage::query()->where('type', StaticPageType::our_products)->first(); + // Gammes. $ranges = Range::query()->where('status', true) ->get(); - return view('fo.pages.products.index', compact('ranges')); + return view('fo.pages.products.index', compact('staticPageModel', 'ranges')); } /** diff --git a/app/Http/Requests/Bo/StaticPages/UpdateStaticPageRequest.php b/app/Http/Requests/Bo/StaticPages/UpdateStaticPageRequest.php index e7c999c..c484ee7 100644 --- a/app/Http/Requests/Bo/StaticPages/UpdateStaticPageRequest.php +++ b/app/Http/Requests/Bo/StaticPages/UpdateStaticPageRequest.php @@ -2,6 +2,7 @@ namespace App\Http\Requests\Bo\StaticPages; +use App\Enums\StaticPageType; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Support\Str; @@ -25,7 +26,7 @@ class UpdateStaticPageRequest extends FormRequest public function prepareForValidation(): void { $this->merge([ - 'content' => Str::of($this->post('content'))->value() + 'content' => $this->input('content') ? Str::of($this->input('content'))->value() : null ]); } @@ -36,11 +37,40 @@ class UpdateStaticPageRequest extends FormRequest */ public function rules(): array { - return [ - 'seo_title' => 'required|min:45|max:70', - 'seo_description' => 'required|min:50|max:160', + $rules = [ + 'seo_title' => 'nullable', + 'seo_description' => 'nullable', 'title' => 'required|min:3|max:255', - 'content' => 'present', + 'content' => 'nullable', + 'data' => 'present|array', + 'data.*' => 'required|array', ]; + + $staticPageModel = request()->route()->parameter('static_page'); + if ( + !$staticPageModel->type->equals(StaticPageType::banner_section) + ) { + $rules = \array_merge( + $rules, + [ + 'seo_title' => 'required|min:45|max:70', + 'seo_description' => 'required|min:50|max:160', + ], + ); + } + + if ( + !$staticPageModel->type->equals(StaticPageType::homepage) && + !$staticPageModel->type->equals(StaticPageType::our_products) && + !$staticPageModel->type->equals(StaticPageType::our_commitments) && + !$staticPageModel->type->equals(StaticPageType::banner_section) + ) { + $rules = \array_merge( + $rules, + ['content' => ['present']], + ); + } + + return $rules; } } diff --git a/app/Models/StaticPage.php b/app/Models/StaticPage.php index 204758e..4405adf 100644 --- a/app/Models/StaticPage.php +++ b/app/Models/StaticPage.php @@ -5,24 +5,27 @@ namespace App\Models; use App\Enums\StaticPageType; use App\Lib\Helpers\ToolboxHelper; use App\Traits\Models\ActivityLog; +use App\Traits\Models\MiniCrudModel; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Str; /** - * @property \App\Enums\StaticPageType $type Page type (StaticPageEnum). - * @property string $seo_title Seo title about 70 chars as recommended. - * @property string $seo_description Seo description about 160 chars as recommended. - * @property string $title Title for the page. - * @property string $slug Slug of the title for the page. - * @property string $content WYSIWYG text content using ckeditor. - * @property-read \Illuminate\Support\Carbon $created_at Created date. - * @property-read \Illuminate\Support\Carbon $updated_at Updated date. + * @property \App\Enums\StaticPageType $type Page type (StaticPageEnum). + * @property string $seo_title Seo title about 70 chars as recommended. + * @property string $seo_description Seo description about 160 chars as recommended. + * @property string $title Title for the page. + * @property string $slug Slug of the title for the page. + * @property string $content WYSIWYG text content using ckeditor. + * @property array> $data Static page json data. + * @property-read \Illuminate\Support\Carbon $created_at Created date. + * @property-read \Illuminate\Support\Carbon $updated_at Updated date. */ class StaticPage extends Model { use ActivityLog; use HasFactory; + use MiniCrudModel; /** * The attributes that are mass assignable. @@ -34,6 +37,7 @@ class StaticPage extends Model 'seo_description', 'title', 'content', + 'data' ]; /** @@ -43,6 +47,7 @@ class StaticPage extends Model */ protected $casts = [ 'type' => StaticPageType::class, + 'data' => 'object', ]; /** diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index e5c79ba..01b4482 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -2,14 +2,16 @@ namespace App\Providers; +use App\Enums\StaticPageType; use App\Models\Range; +use App\Models\StaticPage; use Illuminate\Pagination\Paginator; use Illuminate\Support\Carbon; use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\Schema; -use Illuminate\Support\ServiceProvider; use Illuminate\Support\Facades\URL; use Illuminate\Support\Facades\View; +use Illuminate\Support\ServiceProvider; class AppServiceProvider extends ServiceProvider { @@ -74,6 +76,11 @@ class AppServiceProvider extends ServiceProvider $ranges = Range::query()->where('status', true)->get(); View::share('PublishedRangesGlobal', $ranges); } + + if (Schema::hasTable('static_pages')) { + $bannerSection = StaticPage::query()->where('type', StaticPageType::banner_section->value())->get(); + View::share('bannerSection', $bannerSection); + } } } } diff --git a/app/Traits/Models/MiniCrudModel.php b/app/Traits/Models/MiniCrudModel.php index 09109f1..30f8e13 100644 --- a/app/Traits/Models/MiniCrudModel.php +++ b/app/Traits/Models/MiniCrudModel.php @@ -177,4 +177,21 @@ trait MiniCrudModel } //end foreach return $data; } + + /** + * Get fillable properties and their values from the model. + * + * @param self $model + * @return array + */ + public function getFillableFields(self $model): array + { + $datas = []; + foreach ($model->toArray() as $property => $value) { + if (in_array($property, $model->getFillable())) { + $datas = array_merge($datas, [$property => $value]); + } + } + return $datas; + } } diff --git a/database/migrations/2026_06_11_105926_alter_static_pages_table.php b/database/migrations/2026_06_11_105926_alter_static_pages_table.php new file mode 100644 index 0000000..5ec0458 --- /dev/null +++ b/database/migrations/2026_06_11_105926_alter_static_pages_table.php @@ -0,0 +1,29 @@ +text('seo_title')->nullable()->comment('Seo title about 70 chars as recommended')->change(); + $table->text('seo_description')->nullable()->comment('Seo description about 160 chars as recommended')->change(); + $table->text('content')->nullable()->comment('WYSIWYG text content using ckeditor')->change(); + $table->mediumText('data')->nullable()->after('content')->comment('Static page data.'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + + } +}; diff --git a/database/migrations/2026_06_11_112856_add_data_to_static_pages_home.php b/database/migrations/2026_06_11_112856_add_data_to_static_pages_home.php new file mode 100644 index 0000000..dada91a --- /dev/null +++ b/database/migrations/2026_06_11_112856_add_data_to_static_pages_home.php @@ -0,0 +1,154 @@ + [ + 'label' => 'Titre de la section de gauche', + 'inputType' => InputType::string->value, + 'value' => 'Des produits bien élevés qui ont le goût de la qualité', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'left_subtitle' => [ + 'label' => 'Sous-titre de la section de gauche', + 'inputType' => InputType::string->value, + 'value' => 'Garantis Poulet 100% local', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'left_button_text' => [ + 'label' => 'Texte du bouton de la section de gauche', + 'inputType' => InputType::string->value, + 'value' => 'Nous Découvrir >', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'right_title' => [ + 'label' => 'Titre de la section de droite', + 'inputType' => InputType::string->value, + 'value' => 'Des produits de qualité bons et accessibles', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'right_subtitle' => [ + 'label' => 'Sous-titre de la section de droite', + 'inputType' => InputType::string->value, + 'value' => 'Pour manger sain et régional', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'right_button_text' => [ + 'label' => 'Texte du bouton de la section de gauche', + 'inputType' => InputType::string->value, + 'value' => 'Voir nos recettes >', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'container_title' => [ + 'label' => 'Titre de la section n°2', + 'inputType' => InputType::string->value, + 'value' => 'Chez Lionor le', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'container_title_2' => [ + 'label' => 'Titre n°2 de la section n°2', + 'inputType' => InputType::string->value, + 'value' => 'Poulet 100% local', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'container_title_3' => [ + 'label' => 'Titre n°3 de la section n°2', + 'inputType' => InputType::string->value, + 'value' => 'C\'est...', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'container_item_1' => [ + 'label' => 'Texte n°1 de la section n°2', + 'inputType' => InputType::string->value, + 'value' => 'Des Volailles nées, élevées et préparées en Hauts-de-France.', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'container_item_2' => [ + 'label' => 'Texte n°2 de la section n°2', + 'inputType' => InputType::string->value, + 'value' => 'Des éleveurs animés par le développement de leur région.', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'container_item_3' => [ + 'label' => 'Texte n°3 de la section n°2', + 'inputType' => InputType::string->value, + 'value' => 'Des volailles bien élevées qui assurent des produits bons et accessibles.', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'container_item_4' => [ + 'label' => 'Texte n°4 de la section n°2', + 'inputType' => InputType::string->value, + 'value' => 'Une filière soucieuse de la santé des hommes, des animaux et de la terre.', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'product_title' => [ + 'label' => 'Titre de la section n°3', + 'inputType' => InputType::string->value, + 'value' => 'Découvrez nos volailles bien élevées', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'product_subtitle' => [ + 'label' => 'Titre n°2 de la section n°3', + 'inputType' => InputType::string->value, + 'value' => 'qui ont le goût de la qualité', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + ]; + + $staticPage = StaticPage::where('type', StaticPageType::homepage)->first(); + if ($staticPage) { + $staticPage->data = $data; + $staticPage->saveQuietly(); + } else { + StaticPage::query()->forceCreateQuietly( + [ + 'type' => StaticPageType::homepage->value(), + 'seo_title' => 'Lionor, des volailles en Nord', + 'seo_description' => '100% local, des produits bien élevés, de qualité et accessibles.', + 'title' => 'Accueil', + 'slug' => 'accueil', + 'data' => $data + ] + ); + } + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('static_pages', function () { + $staticPage = StaticPage::query()->where('type', StaticPageType::homepage)->first(); + $staticPage->data = []; + $staticPage->saveQuietly(); + }); + } +}; diff --git a/database/migrations/2026_06_11_121348_add_data_to_static_pages_products.php b/database/migrations/2026_06_11_121348_add_data_to_static_pages_products.php new file mode 100644 index 0000000..ac2a6fe --- /dev/null +++ b/database/migrations/2026_06_11_121348_add_data_to_static_pages_products.php @@ -0,0 +1,119 @@ + [ + 'label' => 'Titre de la section n°1', + 'inputType' => InputType::string->value, + 'value' => 'Nos volailles bien élevées', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'page_title_2' => [ + 'label' => 'Titre n°2 de la section n°1', + 'inputType' => InputType::string->value, + 'value' => 'qui ont le goût de la qualité', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'left_title_1' => [ + 'label' => 'Titre n°1 de la section de gauche', + 'inputType' => InputType::string->value, + 'value' => 'Trouvez l\'inspiration', + 'validate' => 'required|string|min:15', + 'required' => true + ], + 'left_title_2' => [ + 'label' => 'Titre n°2 de la section de gauche', + 'inputType' => InputType::string->value, + 'value' => 'avec nos recettes', + 'validate' => 'required|string|min:15', + 'required' => true + ], + 'left_title_3' => [ + 'label' => 'Titre n°3 de la section de gauche', + 'inputType' => InputType::string->value, + 'value' => 'de volailles bonnes', + 'validate' => 'required|string|min:15', + 'required' => true + ], + 'left_title_4' => [ + 'label' => 'Titre n°4 de la section de gauche', + 'inputType' => InputType::string->value, + 'value' => 'et accessibles', + 'validate' => 'required|string|min:15', + 'required' => true + ], + 'right_title_1' => [ + 'label' => 'Titre n°1 de la section de droite', + 'inputType' => InputType::string->value, + 'value' => 'Découvrez les engagements', + 'validate' => 'required|string|min:15', + 'required' => true + ], + 'right_title_2' => [ + 'label' => 'Titre n°2 de la section de droite', + 'inputType' => InputType::string->value, + 'value' => 'd\'une filière engagée', + 'validate' => 'required|string|min:15', + 'required' => true + ], + 'right_title_3' => [ + 'label' => 'Titre n°3 de la section de droite', + 'inputType' => InputType::string->value, + 'value' => 'pour manger bon, sain', + 'validate' => 'required|string|min:15', + 'required' => true + ], + 'right_title_4' => [ + 'label' => 'Titre n°4 de la section de droite', + 'inputType' => InputType::string->value, + 'value' => 'et Poulet 100% local', + 'validate' => 'required|string|min:15', + 'required' => true + ], + ]; + + $staticPage = StaticPage::where('type', StaticPageType::our_products)->first(); + if ($staticPage) { + $staticPage->data = $data; + $staticPage->saveQuietly(); + } else { + StaticPage::query()->forceCreateQuietly( + [ + 'type' => StaticPageType::our_products->value(), + 'seo_title' => 'Nos volailles bien élevées qui ont le goût de la qualité', + 'seo_description' => 'Liste de toutes nos gammes de produits.', + 'title' => 'Nos produits', + 'slug' => 'gammes', + 'data' => $data + ] + ); + } + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('static_pages', function () { + $staticPage = StaticPage::query()->where('type', StaticPageType::our_products)->first(); + $staticPage->data = []; + $staticPage->saveQuietly(); + }); + } +}; diff --git a/database/migrations/2026_06_11_142413_add_data_to_static_pages_commitments.php b/database/migrations/2026_06_11_142413_add_data_to_static_pages_commitments.php new file mode 100644 index 0000000..ceff58a --- /dev/null +++ b/database/migrations/2026_06_11_142413_add_data_to_static_pages_commitments.php @@ -0,0 +1,162 @@ + [ + 'label' => 'Titre de l\'engagement n°1', + 'inputType' => InputType::string->value, + 'value' => 'Des produits de qualité bons et accessibles', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'commitment_subtitle_1' => [ + 'label' => 'Sous-titre de l\'engagement n°1', + 'inputType' => InputType::string->value, + 'value' => 'Garantis Poulet 100% Hauts-De-France', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'commitment_text_1' => [ + 'label' => 'Texte de l\'engagement n°1', + 'inputType' => InputType::text->value, + 'value' => '

Avec notre label Poulet 100% LOCAL, certifié et contrôlé par un cahier des charges précis, nous garantissons l\'origine de nos produits issus de poulets nés, élevés et préparés en région des Hauts de France.

', + 'validate' => 'required|string|min:15', + 'required' => true + ], + 'commitment_title_2' => [ + 'label' => 'Titre de l\'engagement n°2', + 'inputType' => InputType::string->value, + 'value' => 'Une filière soucieuse de la santé', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'commitment_subtitle_2' => [ + 'label' => 'Sous-titre de l\'engagement n°2', + 'inputType' => InputType::string->value, + 'value' => 'Des hommes, des animaux et de la terre', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'commitment_text_2' => [ + 'label' => 'Texte de l\'engagement n°2', + 'inputType' => InputType::text->value, + 'value' => '

LIONOR, c\'est une filière qui s\'engage pour élever des volailles dans le respect du vivant et qui favorise l\'économie locale. Fiers de nos 70 éleveurs et de nos 235 salariés, unis par la passion de leur métier, nous participons activement à la vie sociale et économique de notre région.

', + 'validate' => 'required|string|min:15', + 'required' => true + ], + 'commitment_title_3' => [ + 'label' => 'Titre de l\'engagement n°3', + 'inputType' => InputType::string->value, + 'value' => 'Des femmes et des hommes', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'commitment_subtitle_3' => [ + 'label' => 'Sous-titre de l\'engagement n°3', + 'inputType' => InputType::string->value, + 'value' => 'Qui maîtrisent la filière du grain à l\'assiette', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'commitment_text_3' => [ + 'label' => 'Texte de l\'engagement n°3', + 'inputType' => InputType::text->value, + 'value' => '

Grâce à la maitrise totale de notre filière, allant de l\'alimentation aux produits régionaux de qualité, en passant pas nos élevages se situant dans un rayon de 50kms autour de notre entreprise, nous garantissons aux consommateurs finaux, une qualité et une traçabilité irréprochables. Notre crédo : "élever bien pour manger sain en région des Hauts de France."

', + 'validate' => 'required|string|min:15', + 'required' => true + ], + + 'container_title' => [ + 'label' => 'Titre de la section n°2', + 'inputType' => InputType::string->value, + 'value' => 'Chez Lionor le', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'container_title_2' => [ + 'label' => 'Titre n°2 de la section n°2', + 'inputType' => InputType::string->value, + 'value' => 'Poulet 100% local', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'container_title_3' => [ + 'label' => 'Titre n°3 de la section n°2', + 'inputType' => InputType::string->value, + 'value' => 'C\'est...', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'container_item_1' => [ + 'label' => 'Texte n°1 de la section n°2', + 'inputType' => InputType::string->value, + 'value' => 'Des Volailles nées, élevées et préparées en Hauts-de-France.', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'container_item_2' => [ + 'label' => 'Texte n°2 de la section n°2', + 'inputType' => InputType::string->value, + 'value' => 'Des éleveurs animés par le développement de leur région.', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'container_item_3' => [ + 'label' => 'Texte n°3 de la section n°2', + 'inputType' => InputType::string->value, + 'value' => 'Des volailles bien élevées qui assurent des produits bons et accessibles.', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'container_item_4' => [ + 'label' => 'Texte n°4 de la section n°2', + 'inputType' => InputType::string->value, + 'value' => 'Une filière soucieuse de la santé des hommes, des animaux et de la terre.', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + ]; + + $staticPage = StaticPage::where('type', StaticPageType::our_commitments)->first(); + if ($staticPage) { + $staticPage->data = $data; + $staticPage->saveQuietly(); + } else { + StaticPage::query()->forceCreateQuietly( + [ + 'type' => StaticPageType::our_commitments->value(), + 'seo_title' => 'Les engagements Lionor', + 'seo_description' => 'Des produits de qualité, une filière soucieuse de la santé, maîtrise la filière du grain à l\'assiette', + 'title' => 'Nos engagements', + 'slug' => 'nos-engagements', + 'data' => $data + ] + ); + } + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('static_pages', function () { + $staticPage = StaticPage::query()->where('type', StaticPageType::our_commitments)->first(); + $staticPage->data = []; + $staticPage->saveQuietly(); + }); + } +}; diff --git a/database/migrations/2026_06_11_152435_add_data_to_static_pages_recipes.php b/database/migrations/2026_06_11_152435_add_data_to_static_pages_recipes.php new file mode 100644 index 0000000..b2e80bc --- /dev/null +++ b/database/migrations/2026_06_11_152435_add_data_to_static_pages_recipes.php @@ -0,0 +1,110 @@ + [ + 'label' => 'Titre n°1 du bandeau', + 'inputType' => InputType::string->value, + 'value' => 'Choisir', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'banner_title_2' => [ + 'label' => 'Titre n°2 du bandeau', + 'inputType' => InputType::string->value, + 'value' => 'les volailles', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'banner_title_3' => [ + 'label' => 'Titre n°3 du bandeau', + 'inputType' => InputType::string->value, + 'value' => 'Lionor, c\'est...', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'banner_item_title_1' => [ + 'label' => 'Titre de l\'élément n°1', + 'inputType' => InputType::string->value, + 'value' => 'Soutenir', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'banner_item_text_1' => [ + 'label' => 'Texte de l\'élément n°1', + 'inputType' => InputType::string->value, + 'value' => 'L\'emploi local et les éleveurs régionaux', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'banner_item_title_2' => [ + 'label' => 'Titre de l\'élément n°2', + 'inputType' => InputType::string->value, + 'value' => 'Choisir la fraîcheur', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'banner_item_text_2' => [ + 'label' => 'Texte de l\'élément n°2', + 'inputType' => InputType::string->value, + 'value' => 'Et consommer des produits de proximité', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'banner_item_title_3' => [ + 'label' => 'Titre de l\'élément n°3', + 'inputType' => InputType::string->value, + 'value' => 'Goûter la qualité', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'banner_item_text_3' => [ + 'label' => 'Texte de l\'élément n°3', + 'inputType' => InputType::string->value, + 'value' => 'D\'un bout à l\'autre de la filière', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + ]; + + $staticPage = StaticPage::where('type', StaticPageType::banner_section)->first(); + if ($staticPage) { + $staticPage->data = $data; + $staticPage->saveQuietly(); + } else { + StaticPage::query()->forceCreateQuietly( + [ + 'type' => StaticPageType::banner_section->value(), + 'title' => 'Bannière', + 'slug' => 'banner', + 'data' => $data + ] + ); + } + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('static_pages', function () { + $staticPage = StaticPage::query()->where('type', StaticPageType::banner_section)->first(); + $staticPage->data = []; + $staticPage->saveQuietly(); + }); + } +}; diff --git a/resources/views/bo/modules/minicrud-form-inputs.blade.php b/resources/views/bo/modules/minicrud-form-inputs.blade.php new file mode 100644 index 0000000..d905e55 --- /dev/null +++ b/resources/views/bo/modules/minicrud-form-inputs.blade.php @@ -0,0 +1,266 @@ +{{-- MINI CRUD EDIT WHEN JSON IS TRANSLATABLE --}} +@php + $lastPrefix = null; +@endphp +@foreach ($data as $k => $input) + @if (!isset($input['inputType'])) + @continue + @endif + + @php + $prefix = str_contains($k, '_') ? explode('_', $k)[0] : null; + $displaySeparator = $lastPrefix !== null && $prefix !== $lastPrefix; + $lastPrefix = $prefix; + @endphp + + @if ($displaySeparator) +
+ @endif + + @switch(intval($input['inputType'])) + @case(intval(\App\Enums\InputType::string->value)) +
+
+ {{ $input['label'] }} * +
+
+ @include('bo.partials.inputs.varchar', [ + 'id' => str($input['label'])->slug(), + 'label' => $input['label'], + 'hasWordCounter' => true, + 'name' => 'data[' . $k . '][value]', + 'value' => old("data.{$k}.value", $input['value'] ?? null), + 'required' => isset($input['required']) ? !empty($input['required']) : true, + 'model' => $model ?? null, + 'helper' => __('validation.between.string', [ + 'attribute' => $input['label'], + 'min' => 3, + 'max' => 255, + ]), + ]) + @include('modules.input-error', [ + 'inputName' => "data.{$k}.value", + ]) +
+
+
+
+ @break + + @case(intval(\App\Enums\InputType::number->value)) +
+
+
+ + + + @if (!empty($input['tooltip'])) + + + + @endif +
+
+
+ + @include('modules.input-error', [ + 'inputName' => "data.{$k}.value", + 'helperId' => "NumberHelp{$k}", + 'helper' => $input['helper'] ?? '', + ]) +
+
+
+
+ @break + + @case(intval(\App\Enums\InputType::text->value)) +
+
+ {{ $input['label'] }} * +
+
+ @include('bo.partials.inputs.text-html', [ + 'id' => str($input['label'])->slug(), + 'name' => "data[{$k}][value]", + 'value' => old("data.{$k}.value", $input['value'] ?? null), + 'model' => $model ?? null, + 'helper' => + __('crud.minicrud.text_warning') . + '. ' . + __('validation.min.string', [ + 'attribute' => $input['label'], + 'min' => 3, + ]), + ]) + @include('modules.input-error', [ + 'inputName' => "data.{$k}.value", + ]) +
+
+
+
+ @break + + @case(intval(\App\Enums\InputType::boolean->value)) +
+
+ {{ $input['label'] }} * +
+
+ +
+ +
+ @include('modules.input-error', [ + 'inputName' => "data.{$k}.value", + 'helperId' => str($input['label'])->slug() . 'Help', + 'helper' => __('crud.minicrud.visibility_helper'), + ]) +
+
+
+
+ @break + + @case(intval(\App\Enums\InputType::image->value)) +
+
+ {{ $input['label'] }} * +
+ {{-- PICTURE_ALT --}} +
+ @include('bo.partials.inputs.varchar', [ + 'id' => str($input['label'])->slug() . '-alt', + 'label' => __('crud.minicrud.picture_alt_label'), + 'hasWordCounter' => true, + 'name' => 'data[' . $k . '][alt]', + 'value' => old("data.{$k}.alt", $input['alt'] ?? null), + 'required' => is_bool($input['required'] ?? null) ? $input['required'] : true, + 'model' => $model ?? null, + 'helper' => + __('crud.minicrud.picture_alt_helper') . + '. ' . + __('validation.min.string', [ + 'attribute' => __('crud.minicrud.picture_alt_label'), + 'min' => 3, + ]), + ]) + @include('modules.input-error', [ + 'inputName' => "data.{$k}.alt", + ]) +
+ {{-- PICTURE_TITLE --}} +
+ @include('bo.partials.inputs.varchar', [ + 'id' => str($input['label'])->slug() . '-title', + 'label' => __('crud.minicrud.picture_title_label'), + 'hasWordCounter' => true, + 'name' => 'data[' . $k . '][title]', + 'value' => old("data.{$k}.title", $input['title'] ?? null), + 'required' => is_bool($input['required'] ?? null) ? $input['required'] : true, + 'model' => $model ?? null, + 'helper' => + __('crud.minicrud.picture_title_helper') . + '. ' . + __('validation.min.string', [ + 'attribute' => __('crud.minicrud.picture_title_label'), + 'min' => 3, + ]), + ]) + @include('modules.input-error', [ + 'inputName' => "data.{$k}.title", + ]) +
+ {{-- PICTURE --}} +
+ @include('bo.partials.inputs.varchar-picture', [ + 'id' => str($input['label'])->slug(), + 'name' => "data[{$k}][value]", + 'width' => $input['dimensions']['width'], + 'height' => $input['dimensions']['height'], + 'model' => $model ?? null, + 'value' => old("data.{$k}.value", $input['value'] ?? null), + 'required' => is_bool($input['required'] ?? null) ? $input['required'] : true, + 'preview' => true, + ]) + @include('modules.input-error', [ + 'inputName' => "data.{$k}.value", + ]) +
+
+
+
+ @break + + @case(\App\Enums\InputType::email->value) +
+
+
+ + + + @if (!empty($input['tooltip'])) + + + + @endif +
+
+
+ + @include('modules.input-error', [ + 'inputName' => "data.{$k}.value", + 'helperId' => "{$k}StringHelp", + 'helper' => $input['helper'] ?? '', + ]) +
+
+
+
+ @break + + @case(intval(\App\Enums\InputType::url->value)) +
+
+ {{ $input['label'] }} * +
+
+ @include('bo.partials.inputs.varchar', [ + 'id' => str($input['label'])->slug(), + 'label' => $input['label'], + 'hasWordCounter' => true, + 'name' => 'data[' . $k . '][value]', + 'value' => old("data.{$k}.value", $input['value'] ?? null), + 'required' => isset($input['required']) ? !empty($input['required']) : true, + 'model' => $model ?? null, + 'helper' => __('validation.between.string', [ + 'attribute' => $input['label'], + 'min' => 3, + 'max' => 255, + ]), + ]) + @include('modules.input-error', [ + 'inputName' => "data.{$k}.value", + ]) +
+
+
+
+ @break + + @default + @php throw new Exception('Input type not handled'); @endphp + @endswitch +@endforeach diff --git a/resources/views/bo/pages/static_pages/form.blade.php b/resources/views/bo/pages/static_pages/form.blade.php index ee3beb7..11e8d51 100644 --- a/resources/views/bo/pages/static_pages/form.blade.php +++ b/resources/views/bo/pages/static_pages/form.blade.php @@ -45,109 +45,128 @@ -
- {{-- SEO_TITLE --}} -
-
- {{ Str::ucfirst(__('validation.custom.seo_title')) }} -
-
- @include('bo.partials.inputs.varchar', [ - 'id' => 'staticPagesSeoTitle', - 'label' => __(':field :inter:model', [ - 'field' => Str::ucfirst(__('validation.custom.seo_title')), - 'inter' => __('validation.custom.of_the.female'), - 'model' => trans_choice('models.classes.static_page', 1), - ]), - 'hasWordCounter' => true, - 'name' => 'seo_title', - 'required' => true, - 'model' => $staticPageModel ?? 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' => trans_choice('models.classes.static_page', 1), - ]), - 'min' => 45, - 'max' => 70, - ])), - 'placeholder' => __(':field :inter:model', [ - 'field' => Str::ucfirst(__('validation.custom.seo_title')), - 'inter' => __('validation.custom.of_the.female'), - 'model' => trans_choice('models.classes.static_page', 1), - ]), - ]) +@if ( + !$staticPageModel->type->equals(\App\Enums\StaticPageType::banner_section) +) +
+ {{-- SEO_TITLE --}} +
+
+ {{ Str::ucfirst(__('validation.custom.seo_title')) }} +
+
+ @include('bo.partials.inputs.varchar', [ + 'id' => 'staticPagesSeoTitle', + 'label' => __(':field :inter:model', [ + 'field' => Str::ucfirst(__('validation.custom.seo_title')), + 'inter' => __('validation.custom.of_the.female'), + 'model' => trans_choice('models.classes.static_page', 1), + ]), + 'hasWordCounter' => true, + 'name' => 'seo_title', + 'required' => true, + 'model' => $staticPageModel ?? 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' => trans_choice('models.classes.static_page', 1), + ]), + 'min' => 45, + 'max' => 70, + ])), + 'placeholder' => __(':field :inter:model', [ + 'field' => Str::ucfirst(__('validation.custom.seo_title')), + 'inter' => __('validation.custom.of_the.female'), + 'model' => trans_choice('models.classes.static_page', 1), + ]), + ]) +
-
-
-
- {{-- SEO_DESCRIPTION --}} -
-
- {{ Str::ucfirst(__('validation.custom.seo_description')) }} -
-
- @include('bo.partials.inputs.varchar-multiline', [ - 'id' => 'staticPagesSeoDescription', - 'label' => __(':field :inter:model', [ - 'field' => Str::ucfirst(__('validation.custom.seo_description')), - 'inter' => __('validation.custom.of_the.female'), - 'model' => trans_choice('models.classes.static_page', 1), - ]), - 'name' => 'seo_description', - 'model' => $staticPageModel ?? null, - 'required' => true, - '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' => trans_choice('models.classes.static_page', 1), - ]), - 'min' => 50, - 'max' => 160, - ])), - 'placeholder' => __(':field :inter:model', [ - 'field' => Str::ucfirst(__('validation.custom.seo_description')), - 'inter' => __('validation.custom.of_the.female'), - 'model' => trans_choice('models.classes.static_page', 1), - ]), - ]) +
+
+ {{-- SEO_DESCRIPTION --}} +
+
+ {{ Str::ucfirst(__('validation.custom.seo_description')) }} +
+
+ @include('bo.partials.inputs.varchar-multiline', [ + 'id' => 'staticPagesSeoDescription', + 'label' => __(':field :inter:model', [ + 'field' => Str::ucfirst(__('validation.custom.seo_description')), + 'inter' => __('validation.custom.of_the.female'), + 'model' => trans_choice('models.classes.static_page', 1), + ]), + 'name' => 'seo_description', + 'model' => $staticPageModel ?? null, + 'required' => true, + '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' => trans_choice('models.classes.static_page', 1), + ]), + 'min' => 50, + 'max' => 160, + ])), + 'placeholder' => __(':field :inter:model', [ + 'field' => Str::ucfirst(__('validation.custom.seo_description')), + 'inter' => __('validation.custom.of_the.female'), + 'model' => trans_choice('models.classes.static_page', 1), + ]), + ]) +
-
- + +
- +@endif + +@if ( + !$staticPageModel->type->equals(\App\Enums\StaticPageType::homepage) && + !$staticPageModel->type->equals(\App\Enums\StaticPageType::our_products) && + !$staticPageModel->type->equals(\App\Enums\StaticPageType::our_commitments) && + !$staticPageModel->type->equals(\App\Enums\StaticPageType::banner_section) +) +
+ {{-- CONTENT --}} +
+
+ {{ Str::ucfirst(__('validation.attributes.content')) }} +
+
+ @include('bo.partials.inputs.text-html', [ + 'id' => 'articleContent', + 'label' => __(':field :inter:model', [ + 'field' => Str::ucfirst(__('validation.attributes.content')), + 'inter' => __('validation.custom.of_the.female'), + 'model' => trans_choice('models.classes.static_page', 1), + ]), + 'name' => 'content', + 'model' => $staticPageModel ?? null, + 'required' => true, + 'helper' => __('validation.custom.text_proofread'), + ]) +
+
+
+
+
+@endif
- {{-- CONTENT --}} -
-
- {{ Str::ucfirst(__('validation.attributes.content')) }} -
-
- @include('bo.partials.inputs.text-html', [ - 'id' => 'articleContent', - 'label' => __(':field :inter:model', [ - 'field' => Str::ucfirst(__('validation.attributes.content')), - 'inter' => __('validation.custom.of_the.female'), - 'model' => trans_choice('models.classes.static_page', 1), - ]), - 'name' => 'content', - 'model' => $staticPageModel ?? null, - 'required' => true, - 'helper' => __('validation.custom.text_proofread'), - ]) -
-
-
-
+ {{-- DATA --}} + @include('bo.modules.minicrud-form-inputs', [ + 'data' => json_decode(json_encode($staticPageModel->data), true), + 'model' => $staticPageModel, + ])
diff --git a/resources/views/fo/layouts/footer.blade.php b/resources/views/fo/layouts/footer.blade.php index a3b423f..6e62ae1 100644 --- a/resources/views/fo/layouts/footer.blade.php +++ b/resources/views/fo/layouts/footer.blade.php @@ -3,27 +3,34 @@
-

{{ __('Choisir') }}{{ __('les volailles') }}{{ __('Lionor, c\'est...') }}

+

+ {{ $bannerSection[0]->data['banner_title_1']['value'] }} + + {{ $bannerSection[0]->data['banner_title_2']['value'] }} + + + {{ $bannerSection[0]->data['banner_title_3']['value'] }} + +

Une case cochée surmontée d'une crète de poulet -

{{ __('Soutenir') }}

-

{{ __('L\'emploi local et les éleveurs régionaux') }}

+

{{ $bannerSection[0]->data['banner_item_title_1']['value'] }}

+

{{ $bannerSection[0]->data['banner_item_text_1']['value'] }}

Une case cochée surmontée d'une crète de poulet -

{{ __('Choisir la fraîcheur') }}

-

{{ __('Et consommer des produits de proximité') }}

+

{{ $bannerSection[0]->data['banner_item_title_2']['value'] }}

+

{{ $bannerSection[0]->data['banner_item_text_2']['value'] }}

Une case cochée surmontée d'une crète de poulet -

{{ __('Goûter la qualité') }}

-

{{ __('D\'un bout à l\'autre de la filière') }}

+

{{ $bannerSection[0]->data['banner_item_title_3']['value'] }}

+

{{ $bannerSection[0]->data['banner_item_text_3']['value'] }}

diff --git a/resources/views/fo/pages/engagments.blade.php b/resources/views/fo/pages/engagments.blade.php index dc3e2c9..ca442d1 100644 --- a/resources/views/fo/pages/engagments.blade.php +++ b/resources/views/fo/pages/engagments.blade.php @@ -34,29 +34,25 @@
-

{{ __('Des produits de qualité bons et accessibles') }}

-

{{ __('Garantis Poulet 100% Hauts-De-France') }}

-

{{ __('Avec notre label Poulet 100% LOCAL, certifié et contrôlé par un cahier des charges précis, nous garantissons l\'origine de nos produits issus de poulets nés, élevés et préparés en région des Hauts de France.') }} -

+

{{ $staticPageModel->data['commitment_title_1']['value'] }}

+

{{ $staticPageModel->data['commitment_subtitle_1']['value'] }}

+

{!! clean($staticPageModel->data['commitment_text_1']['value']) !!}

-

{{ __('Une filière soucieuse de la santé') }}

-

{{ __('Des hommes, des animaux et de la terre') }}

-

{{ __('LIONOR, c\'est une filière qui s\'engage pour élever des volailles dans le respect du vivant et qui favorise l\'économie locale. Fiers de nos 70 éleveurs et de nos 235 salariés, unis par la passion de leur métier, nous participons activement à la vie sociale et économique de notre région.') }} -

+

{{ $staticPageModel->data['commitment_title_2']['value'] }}

+

{{ $staticPageModel->data['commitment_subtitle_2']['value'] }}

+

{!! $staticPageModel->data['commitment_text_2']['value'] !!}

-

{{ __('Des femmes et des hommes') }}

-

{{ __('Qui maîtrisent la filière du grain à l\'assiette') }}

-

{{ __('Grâce à la maitrise totale de notre filière, allant de l\'alimentation aux produits régionaux de qualité, en passant pas nos élevages se situant dans un rayon de 50kms autour de notre entreprise, nous garantissons aux consommateurs finaux, une qualité et une traçabilité irréprochables. - Notre crédo : "élever bien pour manger sain en région des Hauts de France."') }} -

+

{{ $staticPageModel->data['commitment_title_3']['value'] }}

+

{{ $staticPageModel->data['commitment_subtitle_3']['value'] }}

+

{!! clean($staticPageModel->data['commitment_text_3']['value']) !!}

diff --git a/resources/views/fo/pages/home.blade.php b/resources/views/fo/pages/home.blade.php index 88fd913..ddd9ad1 100644 --- a/resources/views/fo/pages/home.blade.php +++ b/resources/views/fo/pages/home.blade.php @@ -10,23 +10,33 @@
Un éleveur posant avec un poulet
-

{{ __('Des produits bien élevés qui ont le goût de la qualité') }}

-

{{ __('Garantis Poulet 100% local') }}

- {{ __('Nous Découvrir >') }} +

{{ $staticPageModel->data['left_title']['value'] }}

+

{{ $staticPageModel->data['left_subtitle']['value'] }}

+ + {!! clean($staticPageModel->data['left_button_text']['value']) !!} +
Une assiette de brochette de volaille prise en gros plan
-

{{ __('Des produits de qualité bons et accessibles') }}

-

{{ __('Pour manger sain et régional') }}

- {{ __('Voir nos recettes >') }} +

{{ $staticPageModel->data['right_title']['value'] }}

+

{{ $staticPageModel->data['right_subtitle']['value'] }}

+ + {!! clean($staticPageModel->data['right_button_text']['value']) !!} +
- @include('fo.partials.local-block') @@ -34,8 +44,10 @@
-

{{ __('Découvrez nos volailles bien élevées') }}{{ __('qui ont le goût de la qualité') }}

+

+ {{ $staticPageModel->data['product_title']['value'] }} + {{ $staticPageModel->data['product_subtitle']['value'] }} +

diff --git a/resources/views/fo/pages/products/index.blade.php b/resources/views/fo/pages/products/index.blade.php index 9dba460..c21bced 100644 --- a/resources/views/fo/pages/products/index.blade.php +++ b/resources/views/fo/pages/products/index.blade.php @@ -30,8 +30,10 @@
-

{{ __('Nos volailles bien élevées') }}{{ __('qui ont le goût de la qualité') }}

+

+ {{ $staticPageModel->data['page_title']['value'] }} + {{ $staticPageModel->data['page_title_2']['value'] }} +

@@ -56,8 +58,16 @@
Une illustration d'une toque de cuisinier -

{{ __('Trouvez l\'inspiration') }}
{{ __('avec nos recettes') }}{{ __('de volailles bonnes') }}
{{ __('et accessibles') }}

+

+ {{ $staticPageModel->data['left_title_1']['value'] }} +
+ {{ $staticPageModel->data['left_title_2']['value'] }} + + {{ $staticPageModel->data['left_title_3']['value'] }} +
+ {{ $staticPageModel->data['left_title_4']['value'] }} +
+

{{ __('Voir les recettes >') }}
@@ -65,8 +75,15 @@
Une illustration d'une tour dans un soleil

- {{ __('Découvrez les engagements') }}
{{ __('d\'une filière engagée') }}{{ __('pour manger bon, sain') }}
{{ __('et Poulet 100% local') }}

+ {{ $staticPageModel->data['right_title_1']['value'] }} +
+ {{ $staticPageModel->data['right_title_2']['value'] }} + + {{ $staticPageModel->data['right_title_3']['value'] }} +
+ {{ $staticPageModel->data['right_title_4']['value'] }} +
+ {{ __('En savoir plus >') }}
diff --git a/resources/views/fo/partials/local-block.blade.php b/resources/views/fo/partials/local-block.blade.php index 65a1b6e..1a37ee8 100644 --- a/resources/views/fo/partials/local-block.blade.php +++ b/resources/views/fo/partials/local-block.blade.php @@ -5,24 +5,28 @@ Logo 100% local
-

{{ __('Chez Lionor le') }}{{ __('Poulet 100% local') }}{{ __('C\'est...') }}

+

+ {{ $staticPageModel->data['container_title']['value'] }} + {{ $staticPageModel->data['container_title_2']['value'] }} + {{ $staticPageModel->data['container_title_3']['value'] }} +

Une illustration d'un poussin sorant de sa coquille -

{{ __('Des Volailles nées, élevées et préparées en Hauts-de-France.') }}

+

{{ $staticPageModel->data['container_item_1']['value'] }}

Une illustration d'une tour dans un soleil -

{{ __('Des éleveurs animés par le développement de leur région.') }}

+

{{ $staticPageModel->data['container_item_2']['value'] }}

Une illustration d'une assiette souriant -

{{ __('Des volailles bien élevées qui assurent des produits bons et accessibles.') }}

+

{{ $staticPageModel->data['container_item_3']['value'] }}

Une illustration d'une main portant un poulet -

{{ __('Une filière soucieuse de la santé des hommes, des animaux et de la terre.') }}

+

{{ $staticPageModel->data['container_item_4']['value'] }}

diff --git a/routes/web-bo.php b/routes/web-bo.php index 6b7a486..1674c18 100644 --- a/routes/web-bo.php +++ b/routes/web-bo.php @@ -64,6 +64,6 @@ Route::prefix('bo')->name('bo.')->middleware(['admin-secure', 'throttle:credenti ])->parameters(['pages' => 'static_page']) ->only(['index', 'edit', 'update']) ->withoutMiddleware('htmlsanitize') - ->middleware('htmlsanitize:content'); + ->middleware('htmlsanitize:content,data'); }); }); diff --git a/routes/web-fo.php b/routes/web-fo.php index 04998e2..d0cbae4 100644 --- a/routes/web-fo.php +++ b/routes/web-fo.php @@ -1,21 +1,20 @@ middleware(['throttle:credentials'])->group(function () { Route::get('/', [HomeController::class, 'index'])->name('home'); - Route::prefix('/nos-engagements') - ->group(function () { - Route::view('/', 'fo.pages.engagments')->name('engagments'); - }); + Route::get('/nos-engagements', [CommitmentController::class, 'index'])->name('engagments'); + Route::view('/100-pour-100-local', 'fo.pages.local')->name('local'); Route::get('/recettes', [RecipesController::class, 'index'])->name('recipes.index');