feat: ✨ add global text administration

This commit is contained in:
Corentin Huet 2026-06-11 17:04:36 +02:00
parent 5f72787e37
commit 1152dcb995
23 changed files with 1168 additions and 164 deletions

View file

@ -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',
];
}

View file

@ -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)

View file

@ -0,0 +1,22 @@
<?php
namespace App\Http\Controllers\Fo;
use App\Enums\StaticPageType;
use App\Http\Controllers\Controller;
use App\Models\StaticPage;
class CommitmentController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Contracts\View\View
*/
public function index()
{
$staticPageModel = StaticPage::query()->where('type', StaticPageType::our_commitments)->first();
return view('fo.pages.engagments', compact('staticPageModel'));
}
}

View file

@ -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'));
}
}

View file

@ -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'));
}
/**

View file

@ -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;
}
}

View file

@ -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<string, array<string, mixed>> $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',
];
/**

View file

@ -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);
}
}
}
}

View file

@ -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;
}
}

View file

@ -0,0 +1,29 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('static_pages', function (Blueprint $table) {
$table->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
{
}
};

View file

@ -0,0 +1,154 @@
<?php
use App\Enums\InputType;
use App\Enums\StaticPageType;
use App\Models\StaticPage;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
// HOMEPAGE
$data = [
'left_title' => [
'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();
});
}
};

View file

@ -0,0 +1,119 @@
<?php
use App\Enums\InputType;
use App\Enums\StaticPageType;
use App\Models\StaticPage;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
// OUR PRODUCTS
$data = [
'page_title' => [
'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();
});
}
};

View file

@ -0,0 +1,162 @@
<?php
use App\Enums\InputType;
use App\Enums\StaticPageType;
use App\Models\StaticPage;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
// OUR PRODUCTS
$data = [
'commitment_title_1' => [
'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' => '<p>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.</p>',
'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' => '<p>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.</p>',
'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' => '<p>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."</p>',
'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();
});
}
};

View file

@ -0,0 +1,110 @@
<?php
use App\Enums\InputType;
use App\Enums\StaticPageType;
use App\Models\StaticPage;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
// BANNER SECTION
$data = [
'banner_title_1' => [
'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();
});
}
};

View file

@ -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)
<div class="my-4"></div>
@endif
@switch(intval($input['inputType']))
@case(intval(\App\Enums\InputType::string->value))
<div class="minicrud-input col-12 col-md-6 mb-3">
<fieldset class="h-100 border p-3">
<legend>{{ $input['label'] }} *</legend>
<div class="row">
<div class="col-12 mb-3">
@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",
])
</div>
</div>
</fieldset>
</div>
@break
@case(intval(\App\Enums\InputType::number->value))
<div class="minicrud-input col-12 mb-3">
<fieldset class="mb-3 border p-3">
<div class="d-flex justify-content-start align-items-center mb-2 flex-row">
<legend class="m-0 w-auto">
<label class="col-form-label" for="number{{ $k }}">
<b>{{ $input['label'] }}</b>
</label>
</legend>
@if (!empty($input['tooltip']))
<span class="ms-1" data-bs-toggle="tooltip" data-bs-html="true" title="{{ $input['tooltip'] }}">
<i class="fa fa-question-circle"></i>
</span>
@endif
</div>
<div class="row mb-3">
<div class="form-group">
<input class="form-control" id="number{{ $k }}" name="data[{{ $k }}][value]" type="number"
value="{{ old("data.{$k}.value") ?? ($input['value'] ?? '') }}" aria-describedby="NumberHelp{{ $k }}"
step="0.01" placeholder="{{ $input['label'] }}" @if (!isset($input['required']) or $input['required']) required @endif>
@include('modules.input-error', [
'inputName' => "data.{$k}.value",
'helperId' => "NumberHelp{$k}",
'helper' => $input['helper'] ?? '',
])
</div>
</div>
</fieldset>
</div>
@break
@case(intval(\App\Enums\InputType::text->value))
<div class="minicrud-input col-12 mb-3">
<fieldset class="border p-3">
<legend>{{ $input['label'] }} *</legend>
<div class="row mb-3">
<div class="col-12">
@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",
])
</div>
</div>
</fieldset>
</div>
@break
@case(intval(\App\Enums\InputType::boolean->value))
<div class="minicrud-input col-12 col-md-6 mb-3">
<fieldset class="border p-3">
<legend>{{ $input['label'] }} *</legend>
<div class="row mb-3">
<div class="col-12">
<label class="col-form-label"
for="{{ str($input['label'])->slug() }}"><b>{{ __('crud.minicrud.visibility_label') }}</b></label>
<div class="form-check form-switch ms-2">
<input class="form-check-input ml-2" id="{{ str($input['label'])->slug() }}" name="data[{{ $k }}][value]"
type="checkbox" value="1" aria-describedby="{{ str($input['label'])->slug() }}Help"
@if (old("data.{$k}.value", old('_token') ? false : $input['value'] ?? (null ?? false))) checked @endif>
</div>
@include('modules.input-error', [
'inputName' => "data.{$k}.value",
'helperId' => str($input['label'])->slug() . 'Help',
'helper' => __('crud.minicrud.visibility_helper'),
])
</div>
</div>
</fieldset>
</div>
@break
@case(intval(\App\Enums\InputType::image->value))
<div class="minicrud-input col-12 mb-3">
<fieldset class="h-100 border p-3">
<legend>{{ $input['label'] }} *</legend>
<div class="row">
{{-- PICTURE_ALT --}}
<div class="col-12 col-md-6 mb-3">
@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",
])
</div>
{{-- PICTURE_TITLE --}}
<div class="col-12 col-md-6 mb-3">
@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",
])
</div>
{{-- PICTURE --}}
<div class="col-12 mb-3">
@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",
])
</div>
</div>
</fieldset>
</div>
@break
@case(\App\Enums\InputType::email->value)
<div class="minicrud-input col-12 col-md-6 mb-3">
<fieldset class="mb-3 border p-3">
<div class="d-flex justify-content-start align-items-center mb-2 flex-row">
<legend class="m-0 w-auto">
<label class="col-form-label" for="title{{ $k }}">
<b>{{ $input['label'] }}</b>
</label>
</legend>
@if (!empty($input['tooltip']))
<span class="ms-1" data-bs-toggle="tooltip" data-bs-html="true" title="{{ $input['tooltip'] }}">
<i class="fa fa-question-circle"></i>
</span>
@endif
</div>
<div class="row mb-3">
<div class="form-group">
<input class="form-control" id="title{{ $k }}" name="data[{{ $k }}][value]" type="email"
value="{{ old("data.{$k}.value") ?? ($input['value'] ?? '') }}" placeholder="{{ $input['label'] }}"
@if (!isset($input['required']) or $input['required']) required @endif>
@include('modules.input-error', [
'inputName' => "data.{$k}.value",
'helperId' => "{$k}StringHelp",
'helper' => $input['helper'] ?? '',
])
</div>
</div>
</fieldset>
</div>
@break
@case(intval(\App\Enums\InputType::url->value))
<div class="minicrud-input col-12 col-md-6 mb-3">
<fieldset class="h-100 border p-3">
<legend>{{ $input['label'] }} *</legend>
<div class="row">
<div class="col-12 mb-3">
@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",
])
</div>
</div>
</fieldset>
</div>
@break
@default
@php throw new Exception('Input type not handled'); @endphp
@endswitch
@endforeach

View file

@ -45,109 +45,128 @@
</div>
</div>
<div class="row">
{{-- SEO_TITLE --}}
<div class="col-12 col-md-6 mb-3">
<fieldset class="h-100 border p-3">
<legend>{{ Str::ucfirst(__('validation.custom.seo_title')) }}</legend>
<div class="row">
<div class="col-12 mb-3">
@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)
)
<div class="row">
{{-- SEO_TITLE --}}
<div class="col-12 col-md-6 mb-3">
<fieldset class="h-100 border p-3">
<legend>{{ Str::ucfirst(__('validation.custom.seo_title')) }}</legend>
<div class="row">
<div class="col-12 mb-3">
@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),
]),
])
</div>
</div>
</div>
</fieldset>
</div>
{{-- SEO_DESCRIPTION --}}
<div class="col-12 col-md-6 mb-3">
<fieldset class="h-100 border p-3">
<legend>{{ Str::ucfirst(__('validation.custom.seo_description')) }}</legend>
<div class="row">
<div class="col-12">
@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),
]),
])
</fieldset>
</div>
{{-- SEO_DESCRIPTION --}}
<div class="col-12 col-md-6 mb-3">
<fieldset class="h-100 border p-3">
<legend>{{ Str::ucfirst(__('validation.custom.seo_description')) }}</legend>
<div class="row">
<div class="col-12">
@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),
]),
])
</div>
</div>
</div>
</fieldset>
</fieldset>
</div>
</div>
</div>
@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)
)
<div class="row">
{{-- CONTENT --}}
<div class="col-12 mb-3">
<fieldset class="border p-3">
<legend>{{ Str::ucfirst(__('validation.attributes.content')) }}</legend>
<div class="row mb-3">
<div class="col-12">
@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'),
])
</div>
</div>
</fieldset>
</div>
</div>
@endif
<div class="row">
{{-- CONTENT --}}
<div class="col-12 mb-3">
<fieldset class="border p-3">
<legend>{{ Str::ucfirst(__('validation.attributes.content')) }}</legend>
<div class="row mb-3">
<div class="col-12">
@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'),
])
</div>
</div>
</fieldset>
</div>
{{-- DATA --}}
@include('bo.modules.minicrud-form-inputs', [
'data' => json_decode(json_encode($staticPageModel->data), true),
'model' => $staticPageModel,
])
</div>
<div class="row">

View file

@ -3,27 +3,34 @@
<div class="bckg-red reassurances position-relative py-4">
<div class="d-md-flex align-items-center container">
<div class="offset-lg-2 text-uppercase flex-shrink-0">
<p class="font-amatic font-amatic-45">{{ __('Choisir') }}<span class="d-block">{{ __('les volailles') }}</span><span
class="d-block">{{ __('Lionor, c\'est...') }}</span></p>
<p class="font-amatic font-amatic-45">
{{ $bannerSection[0]->data['banner_title_1']['value'] }}
<span class="d-block">
{{ $bannerSection[0]->data['banner_title_2']['value'] }}
</span>
<span class="d-block">
{{ $bannerSection[0]->data['banner_title_3']['value'] }}
</span>
</p>
</div>
<div class="d-md-flex flex-grow-1 text-center">
<div class="col reassurance-item mx-4">
<img class="img-fluid" src="{{ Vite::asset('resources/assets/images/Check.svg') }}"
alt="Une case cochée surmontée d'une crète de poulet">
<p class="font-amatic font-amatic-40">{{ __('Soutenir') }}</p>
<p>{{ __('L\'emploi local et les éleveurs régionaux') }}</p>
<p class="font-amatic font-amatic-40">{{ $bannerSection[0]->data['banner_item_title_1']['value'] }}</p>
<p>{{ $bannerSection[0]->data['banner_item_text_1']['value'] }}</p>
</div>
<div class="col reassurance-item mx-4">
<img class="img-fluid" src="{{ Vite::asset('resources/assets/images/Check.svg') }}"
alt="Une case cochée surmontée d'une crète de poulet">
<p class="font-amatic font-amatic-40">{{ __('Choisir la fraîcheur') }}</p>
<p>{{ __('Et consommer des produits de proximité') }}</p>
<p class="font-amatic font-amatic-40">{{ $bannerSection[0]->data['banner_item_title_2']['value'] }}</p>
<p>{{ $bannerSection[0]->data['banner_item_text_2']['value'] }}</p>
</div>
<div class="col reassurance-item mx-4">
<img class="img-fluid" src="{{ Vite::asset('resources/assets/images/Check.svg') }}"
alt="Une case cochée surmontée d'une crète de poulet">
<p class="font-amatic font-amatic-40">{{ __('Goûter la qualité') }}</p>
<p>{{ __('D\'un bout à l\'autre de la filière') }}</p>
<p class="font-amatic font-amatic-40">{{ $bannerSection[0]->data['banner_item_title_3']['value'] }}</p>
<p>{{ $bannerSection[0]->data['banner_item_text_3']['value'] }}</p>
</div>
</div>
</div>

View file

@ -34,29 +34,25 @@
<div class="about mt-4 text-center">
<div class="row about-one position-relative mb-5">
<div class="col-lg-8 offset-lg-2 bckg-red opacity position-relative p-5">
<h2 class="fw-bold text-uppercase">{{ __('Des produits de qualité bons et accessibles') }}</h2>
<h3 class="text-uppercase">{{ __('Garantis Poulet 100% Hauts-De-France') }}</h3>
<p>{{ __('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.') }}
</p>
<h2 class="fw-bold text-uppercase">{{ $staticPageModel->data['commitment_title_1']['value'] }}</h2>
<h3 class="text-uppercase">{{ $staticPageModel->data['commitment_subtitle_1']['value'] }}</h3>
<p>{!! clean($staticPageModel->data['commitment_text_1']['value']) !!}</p>
</div>
</div>
<div class="row about-two position-relative mb-5">
<div class="col-lg-8 offset-lg-2 bckg-yellow opacity position-relative pe-5 ps-5 pt-5">
<h2 class="fw-bold text-uppercase">{{ __('Une filière soucieuse de la santé') }}</h2>
<h3 class="text-uppercase">{{ __('Des hommes, des animaux et de la terre') }}</h3>
<p>{{ __('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.') }}
</p>
<h2 class="fw-bold text-uppercase">{{ $staticPageModel->data['commitment_title_2']['value'] }}</h2>
<h3 class="text-uppercase">{{ $staticPageModel->data['commitment_subtitle_2']['value'] }}</h3>
<p>{!! $staticPageModel->data['commitment_text_2']['value'] !!}</p>
</div>
</div>
<div class="row about-three position-relative mb-5">
<div class="col-lg-8 offset-lg-2 bckg-red opacity position-relative pe-5 ps-5 pt-5">
<h2 class="fw-bold text-uppercase">{{ __('Des femmes et des hommes') }}</h2>
<h3 class="text-uppercase">{{ __('Qui maîtrisent la filière du grain à l\'assiette') }}</h3>
<p>{{ __('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."') }}
</p>
<h2 class="fw-bold text-uppercase">{{ $staticPageModel->data['commitment_title_3']['value'] }}</h2>
<h3 class="text-uppercase">{{ $staticPageModel->data['commitment_subtitle_3']['value'] }}</h3>
<p>{!! clean($staticPageModel->data['commitment_text_3']['value']) !!}</p>
</div>
</div>
</div>

View file

@ -10,23 +10,33 @@
<div class="hero-left bckg-yellow col-md-6 position-relative text-uppercase">
<img class="img-fluid" src="{{ Vite::asset('resources/assets/images/Eleveur.jpg') }}" alt="Un éleveur posant avec un poulet">
<section class="hero-content bckg-yellow opacity hero_content hero_left bottom-0 end-0 start-0">
<h2>{{ __('Des produits bien élevés qui ont le goût de la qualité') }}</h2>
<h3>{{ __('Garantis Poulet 100% local') }}</h3>
<a class="btn btn-light mb-5 mt-2" href="{{ route('engagments') }}" title="Nous découvrir">{{ __('Nous Découvrir >') }}</a>
<h2>{{ $staticPageModel->data['left_title']['value'] }}</h2>
<h3>{{ $staticPageModel->data['left_subtitle']['value'] }}</h3>
<a
class="btn btn-light mb-5 mt-2"
href="{{ route('engagments') }}"
title="{!! clean($staticPageModel->data['left_button_text']['value']) !!}"
>
{!! clean($staticPageModel->data['left_button_text']['value']) !!}
</a>
</section>
</div>
<div class="hero-right bckg-red col-md-6 position-relative text-uppercase">
<img class="img-fluid" src="{{ Vite::asset('resources/assets/images/Brochette.jpg') }}"
alt="Une assiette de brochette de volaille prise en gros plan">
<section class="hero-content bckg-red opacity hero_content hero_right bottom-0 end-0 start-0">
<h2>{{ __('Des produits de qualité bons et accessibles') }}</h2>
<h3>{{ __('Pour manger sain et régional') }}</h3>
<a class="btn btn-light mb-5 mt-2" href="{{ route('recipes.index') }}"
title="Voir nos recettes">{{ __('Voir nos recettes >') }}</a>
<h2>{{ $staticPageModel->data['right_title']['value'] }}</h2>
<h3>{{ $staticPageModel->data['right_subtitle']['value'] }}</h3>
<a
class="btn btn-light mb-5 mt-2"
href="{{ route('recipes.index') }}"
title="{!! clean($staticPageModel->data['right_button_text']['value']) !!}"
>
{!! clean($staticPageModel->data['right_button_text']['value']) !!}
</a>
</section>
</div>
</div>
<!-- LOCAL BLOCK -->
@include('fo.partials.local-block')
@ -34,8 +44,10 @@
<div class="container-fluid pt-5 text-center">
<div class="row">
<section class="col-md-8 offset-md-2 stripes">
<h2 class="text-uppercase font-amatic font-amatic-48">{{ __('Découvrez nos volailles bien élevées') }}<span
class="font-amatic-red">{{ __('qui ont le goût de la qualité') }}</span></h2>
<h2 class="text-uppercase font-amatic font-amatic-48">
{{ $staticPageModel->data['product_title']['value'] }}
<span class="font-amatic-red">{{ $staticPageModel->data['product_subtitle']['value'] }}</span>
</h2>
</section>
</div>
<div class="row mt-4 overflow-hidden">

View file

@ -30,8 +30,10 @@
<div class="position-relative container pt-5">
<div class="row">
<section class="col-md-8 offset-md-2 stripes">
<h1 class="text-uppercase font-amatic font-amatic-48">{{ __('Nos volailles bien élevées') }}<span
class="font-amatic-red">{{ __('qui ont le goût de la qualité') }}</span></h1>
<h1 class="text-uppercase font-amatic font-amatic-48">
{{ $staticPageModel->data['page_title']['value'] }}
<span class="font-amatic-red">{{ $staticPageModel->data['page_title_2']['value'] }}</span>
</h1>
</section>
</div>
@ -56,8 +58,16 @@
<div class="row img-110 text-center">
<section class="col-md-5">
<img src="{{ Vite::asset('resources/assets/images/Toque.svg') }}" alt="Une illustration d'une toque de cuisinier">
<h2 class="text-uppercase font-amatic font-amatic-60">{{ __('Trouvez l\'inspiration') }}<br>{{ __('avec nos recettes') }}<span
class="font-amatic-red">{{ __('de volailles bonnes') }}<br>{{ __('et accessibles') }}</span></h2>
<h2 class="text-uppercase font-amatic font-amatic-60">
{{ $staticPageModel->data['left_title_1']['value'] }}
<br />
{{ $staticPageModel->data['left_title_2']['value'] }}
<span class="font-amatic-red">
{{ $staticPageModel->data['left_title_3']['value'] }}
<br />
{{ $staticPageModel->data['left_title_4']['value'] }}
</span>
</h2>
<a class="btn btn-primary text-uppercase mt-3" href="{{ route('recipes.index') }}"
title="{{ __('Voir toutes nos recettes') }}">{{ __('Voir les recettes >') }}</a>
</section>
@ -65,8 +75,15 @@
<section class="col-md-5">
<img src="{{ Vite::asset('resources/assets/images/Region.svg') }}" alt="Une illustration d'une tour dans un soleil">
<h2 class="text-uppercase font-amatic font-amatic-60">
{{ __('Découvrez les engagements') }}<br>{{ __('d\'une filière engagée') }}<span
class="font-amatic-red">{{ __('pour manger bon, sain') }}<br>{{ __('et Poulet 100% local') }}</span></h2>
{{ $staticPageModel->data['right_title_1']['value'] }}
<br />
{{ $staticPageModel->data['right_title_2']['value'] }}
<span class="font-amatic-red">
{{ $staticPageModel->data['right_title_3']['value'] }}
<br />
{{ $staticPageModel->data['right_title_4']['value'] }}
</span>
</h2>
<a class="btn btn-primary text-uppercase mt-3" href="{{ route('local') }}"
title="{{ __('En savoir plus sur le 100% local') }}">{{ __('En savoir plus >') }}</a>
</section>

View file

@ -5,24 +5,28 @@
<img src="{{ Vite::asset('resources/assets/images/logo-poulet-100-local-big.png') }}" alt="Logo 100% local" class="img-fluid">
</div>
<div class="flex-shrink-0 text-uppercase ms-3 me-5">
<h2 class="position-relative font-amatic"><span class="font-amatic-50">{{ __('Chez Lionor le') }}</span><span class="d-block font-amatic-60 font-amatic-red">{{ __('Poulet 100% local') }}</span><span class="d-block font-amatic-50 font-amatic-red">{{ __('C\'est...') }}</span></h2>
<h2 class="position-relative font-amatic">
<span class="font-amatic-50">{{ $staticPageModel->data['container_title']['value'] }}</span>
<span class="d-block font-amatic-60 font-amatic-red">{{ $staticPageModel->data['container_title_2']['value'] }}</span>
<span class="d-block font-amatic-50 font-amatic-red">{{ $staticPageModel->data['container_title_3']['value'] }}</span>
</h2>
</div>
<div class="d-lg-flex flex-grow-1 text-center">
<div class="local-item mx-2 mb-sm-5 position-relative">
<img src="{{ Vite::asset('resources/assets/images/Couvoir.svg') }}" alt="Une illustration d'un poussin sorant de sa coquille" class="img-fluid">
<p class="mt-3">{{ __('Des Volailles nées, élevées et préparées en Hauts-de-France.') }}</p>
<p class="mt-3">{{ $staticPageModel->data['container_item_1']['value'] }}</p>
</div>
<div class="local-item mx-2 mb-sm-5 position-relative">
<img src="{{ Vite::asset('resources/assets/images/Poulailler.svg') }}" alt="Une illustration d'une tour dans un soleil" class="img-fluid">
<p class="mt-3">{{ __('Des éleveurs animés par le développement de leur région.') }}</p>
<p class="mt-3">{{ $staticPageModel->data['container_item_2']['value'] }}</p>
</div>
<div class="local-item mx-2 mb-sm-5 position-relative">
<img src="{{ Vite::asset('resources/assets/images/Smile.svg') }}" alt="Une illustration d'une assiette souriant" class="img-fluid">
<p class="mt-3">{{ __('Des volailles bien élevées qui assurent des produits bons et accessibles.') }}</p>
<p class="mt-3">{{ $staticPageModel->data['container_item_3']['value'] }}</p>
</div>
<div class="local-item mx-2 mb-sm-5 position-relative">
<img src="{{ Vite::asset('resources/assets/images/Transport.svg') }}" alt="Une illustration d'une main portant un poulet" class="img-fluid">
<p class="mt-3">{{ __('Une filière soucieuse de la santé des hommes, des animaux et de la terre.') }}</p>
<p class="mt-3">{{ $staticPageModel->data['container_item_4']['value'] }}</p>
</div>
</div>
</div>

View file

@ -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');
});
});

View file

@ -1,21 +1,20 @@
<?php
use App\Http\Controllers\Fo\StaticPageController;
use App\Http\Controllers\Fo\ShopController;
use App\Http\Controllers\Fo\CommitmentController;
use App\Http\Controllers\Fo\ContactController;
use App\Http\Controllers\Fo\HomeController;
use App\Http\Controllers\Fo\ProductsController;
use App\Http\Controllers\Fo\RecipesController;
use App\Http\Controllers\Fo\ShopController;
use App\Http\Controllers\Fo\StaticPageController;
use Illuminate\Support\Facades\Route;
Route::namespace('\App\Http\Controllers\Fo')->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');