add expertise pages to static pages - issue #195

This commit is contained in:
Alexis Gousseau 2024-01-25 16:55:55 +01:00
parent 82539c4a0d
commit b747d482d4
9 changed files with 213 additions and 154 deletions

View file

@ -8,16 +8,26 @@ enum StaticPageType: int
{
use BaseEnum;
case contact = 1;
case legals = 2;
case confidentiality = 3;
case contact = 1;
case legals = 2;
case confidentiality = 3;
case expertise_guineafowl = 4;
case expertise_turkey = 5;
case expertise_chicken = 6;
case expertise_duck = 7;
case expertise_rabbit = 8;
/**
* Optionnal labels definition.
*/
private const LABELS = [
self::contact->name => 'Contact',
self::legals->name => 'Mentions légales',
self::confidentiality->name => 'Confidentialité',
self::contact->name => 'Contact',
self::legals->name => 'Mentions légales',
self::confidentiality->name => 'Confidentialité',
self::expertise_guineafowl->name => 'Expertise pintade',
self::expertise_turkey->name => 'Expertise dinde',
self::expertise_chicken->name => 'Expertise poulet',
self::expertise_duck->name => 'Expertise canard',
self::expertise_rabbit->name => 'Expertise lapin',
];
}

View file

@ -5,121 +5,124 @@ namespace App\Http\Controllers\Fo;
use App\Enums\Advices\AdviceTypeEnum;
use App\Enums\ExpertiseProducts\ExpertiseProductPageEnum;
use App\Enums\Products\ProductSpeciesEnum;
use App\Enums\StaticPageType;
use App\Http\Controllers\Controller;
use App\Models\Advice;
use App\Models\ExpertiseProduct;
use App\Models\Product;
use App\Models\StaticPage;
class ExpertiseController extends Controller
{
/**
* Undocumented function
* Show expertise page (duck).
*
* @return \Illuminate\Contracts\View\View
*
*/
public function canard(): \Illuminate\Contracts\View\View
{
// Get VIP Products for this page.
$vip = ExpertiseProduct::query()->where('page', ExpertiseProductPageEnum::duck->value())->get();
$products = Product::query()->where('status', true)
->where('species', ProductSpeciesEnum::canard->value())
->inRandomOrder()
->limit(3)
->with('subrange.range')
->get();
$recipes = Advice::query()->whereHas('products', function ($query) {
return $query->where('species', ProductSpeciesEnum::canard->value());
})->where('type', AdviceTypeEnum::recipes)->limit(3)->get();
return view('fo.pages.expertise.canard', compact('vip', 'products', 'recipes'));
return view('fo.pages.expertise.canard', $this->getExpertiseData(
StaticPageType::expertise_duck,
ExpertiseProductPageEnum::duck,
ProductSpeciesEnum::canard
));
}
/**
* Undocumented function
* Show expertise page (turkey).
*
* @return \Illuminate\Contracts\View\View
*/
public function dinde(): \Illuminate\Contracts\View\View
{
// Get VIP Products for this page.
$vip = ExpertiseProduct::query()->where('page', ExpertiseProductPageEnum::turkey->value())->get();
$products = Product::query()->where('status', true)
->where('species', ProductSpeciesEnum::dinde->value())
->inRandomOrder()
->limit(3)
->with('subrange.range')
->get();
$recipes = Advice::query()->whereHas('products', function ($query) {
return $query->where('species', ProductSpeciesEnum::dinde->value());
})->where('type', AdviceTypeEnum::recipes)->limit(3)->get();
return view('fo.pages.expertise.dinde', compact('vip', 'products', 'recipes'));
return view('fo.pages.expertise.dinde', $this->getExpertiseData(
StaticPageType::expertise_turkey,
ExpertiseProductPageEnum::turkey,
ProductSpeciesEnum::dinde
));
}
/**
* Undocumented function
* Show expertise page (rabbit).
*
* @return \Illuminate\Contracts\View\View
*/
public function lapin(): \Illuminate\Contracts\View\View
{
// Get VIP Products for this page.
$vip = ExpertiseProduct::query()->where('page', ExpertiseProductPageEnum::rabbit->value())->get();
$products = Product::query()->where('status', true)
->where('species', ProductSpeciesEnum::lapin->value())
->inRandomOrder()
->limit(3)
->with('subrange.range')
->get();
$recipes = Advice::query()->whereHas('products', function ($query) {
return $query->where('species', ProductSpeciesEnum::lapin->value());
})->where('type', AdviceTypeEnum::recipes)->limit(3)->get();
return view('fo.pages.expertise.lapin', compact('vip', 'products', 'recipes'));
return view('fo.pages.expertise.lapin', $this->getExpertiseData(
StaticPageType::expertise_rabbit,
ExpertiseProductPageEnum::rabbit,
ProductSpeciesEnum::lapin
));
}
/**
* Undocumented function
* Show expertise page (guineafowl).
*
* @return \Illuminate\Contracts\View\View
*/
public function pintade(): \Illuminate\Contracts\View\View
{
// Get VIP Products for this page.
$vip = ExpertiseProduct::query()->where('page', ExpertiseProductPageEnum::guineafowl->value())->get();
$products = Product::query()->where('status', true)
->where('species', ProductSpeciesEnum::pintade->value())
->inRandomOrder()
->limit(3)
->with('subrange.range')
->get();
$recipes = Advice::query()->whereHas('products', function ($query) {
return $query->where('species', ProductSpeciesEnum::pintade->value());
})->where('type', AdviceTypeEnum::recipes)->limit(3)->get();
return view('fo.pages.expertise.pintade', compact('vip', 'products', 'recipes'));
return view('fo.pages.expertise.pintade', $this->getExpertiseData(
StaticPageType::expertise_guineafowl,
ExpertiseProductPageEnum::guineafowl,
ProductSpeciesEnum::pintade
));
}
/**
* Undocumented function
* Show expertise page (chicken).
*
* @return \Illuminate\Contracts\View\View
*/
public function poulet(): \Illuminate\Contracts\View\View
{
// Get VIP Products for this page.
$vip = ExpertiseProduct::query()->where('page', ExpertiseProductPageEnum::chicken->value())->get();
$products = Product::query()->where('status', true)
->where('species', ProductSpeciesEnum::poulet->value())
return view('fo.pages.expertise.poulet', $this->getExpertiseData(
StaticPageType::expertise_chicken,
ExpertiseProductPageEnum::chicken,
ProductSpeciesEnum::poulet
));
}
/**
* Get all expertise data needed.
*
* @param \App\Enums\StaticPageType $enumStaticPageType
* @param \App\Enums\ExpertiseProducts\ExpertiseProductPageEnum $enumExpertiseProductPage
* @param \App\Enums\Products\ProductSpeciesEnum $enumProductSpecies
*
* @return array
*/
public function getExpertiseData(
StaticPageType $enumStaticPageType,
ExpertiseProductPageEnum $enumExpertiseProductPage,
ProductSpeciesEnum $enumProductSpecies
): array {
/** @var \App\Models\StaticPage $staticPageModel */
$staticPageModel = StaticPage::query()->where('type', $enumStaticPageType->value())->first();
/** @var \App\Models\ExpertiseProduct $productVipModels */
$productVipModels = ExpertiseProduct::query()->where('page', $enumExpertiseProductPage->value())->get();
/** @var \App\Models\Product $productModels */
$productModels = Product::query()->where('status', true)
->where('species', $enumProductSpecies->value())
->inRandomOrder()
->limit(3)
->with('subrange.range')
->get();
$recipes = Advice::query()->whereHas('products', function ($query) {
return $query->where('species', ProductSpeciesEnum::poulet->value());
/** @var \App\Models\Recipe $recipeModels */
$recipeModels = Advice::query()->whereHas('products', function ($query) use ($enumProductSpecies) {
return $query->where('species', $enumProductSpecies->value());
})->where('type', AdviceTypeEnum::recipes)->limit(3)->get();
return view('fo.pages.expertise.poulet', compact('vip', 'products', 'recipes'));
return [
'staticPageModel' => $staticPageModel,
'productVipModels' => $productVipModels,
'productModels' => $productModels,
'recipeModels' => $recipeModels
];
}
}

View file

@ -15,12 +15,13 @@ class StaticPageSeeder extends Seeder
*/
public function run()
{
// Contact.
StaticPage::query()->updateOrCreate(
[
'type' => StaticPageType::contact,
],
[
'seo_title' => 'Contact - À votre écoute - Le Gaulois Professionnel',
'seo_title' => 'Contact - À votre écoute',
'seo_description' => 'Notre force de vente, composée d\'une trentaine de commerciaux,
est disponible pour répondre à vos questions.',
'title' => 'À votre écoute',
@ -32,12 +33,13 @@ class StaticPageSeeder extends Seeder
pour plus de renseignements, remplissez le formulaire de contact.</p>',
]
);
// Legals.
StaticPage::query()->updateOrCreate(
[
'type' => StaticPageType::legals,
],
[
'seo_title' => 'Mentions légales et CGU - Le Gaulois Professionnel',
'seo_title' => 'Mentions légales et CGU',
'seo_description' => 'Mentions légales et conditions générales d\'utilisation du site internet Le
Gaulois Professionnel',
'title' => 'Mentions légales',
@ -158,12 +160,13 @@ class StaticPageSeeder extends Seeder
',
]
);
// Policies.
StaticPage::query()->updateOrCreate(
[
'type' => StaticPageType::confidentiality,
],
[
'seo_title' => 'Politique des données personnelles - Le Gaulois Professionnel',
'seo_title' => 'Politique des données personnelles',
'seo_description' => 'Le Gaulois Professionnel vous informe sur les données que nous collectons,
comment nous les traitons, dans quelles finalités.',
'title' => 'Politique des données personnelles',
@ -561,5 +564,88 @@ class StaticPageSeeder extends Seeder
',
]
);
// Expertise guineafowl.
StaticPage::query()->updateOrCreate(
[
'type' => StaticPageType::expertise_guineafowl,
],
[
'seo_title' => 'Notre expertise volaillère - Pintade',
'seo_description' => 'Le Gaulois Professionnel propose une large gamme de volailles entières, découpées
et élaborées, source d\'inspiration, pour des recettes variées et inventives au quotidien.',
'title' => 'L\'anatomie de la pintade',
'type' => StaticPageType::expertise_guineafowl,
'content' => '<p>Sa saveur douce et racée fait de la pintade un produit différent, à mi-chemin
entre la volaille et le gibier. Les pintades sont garanties 100% françaises : nées, élevées et
préparées en France.</p>',
]
);
// Expertise turkey.
StaticPage::query()->updateOrCreate(
[
'type' => StaticPageType::expertise_turkey,
],
[
'seo_title' => 'Notre expertise volaillère - Dinde',
'seo_description' => 'Grâce à son goût apprécié de tous, la dinde se met au service du talent des
chefs qui pourront créer des recettes à leur image.',
'title' => 'L\'anatomie de la dinde',
'type' => StaticPageType::expertise_turkey,
'content' => '<p>La dinde est peu calorique, riche en protéines et en vitamines, faible en
lipides, rassasiante... elle assure également une très bonne digestibilité.</p>
<p>Grâce à son goût apprécié de tous, elle se met au service du talent des chefs qui pourront créer
des recettes à leur image.</p>
<p>Toutes nos dindes sont nées, élevées et préparées en France.</p>',
]
);
// Expertise chicken.
StaticPage::query()->updateOrCreate(
[
'type' => StaticPageType::expertise_chicken,
],
[
'seo_title' => 'Notre expertise volaillère - Poulet',
'seo_description' => 'Le poulet se décline en différentes découpes calibrées pour s\'adapter
aux besoins de la restauration commerciale et de la restauration collective.',
'title' => 'L\'anatomie du poulet',
'type' => StaticPageType::expertise_chicken,
'content' => '<p>Le poulet est la volaille la plus consommée en France. Il se décline en
différentes découpes calibrées pour s\'adapter aux besoins de la restauration commerciale et
de la restauration collective.</p>
<p>Nos poulets sont garantis 100% français : nés, élevés et préparés en France.</p>',
]
);
// Expertise duck.
StaticPage::query()->updateOrCreate(
[
'type' => StaticPageType::expertise_duck,
],
[
'seo_title' => 'Notre expertise volaillère - Canard',
'seo_description' => 'Plébiscité en restauration commerciale, le canard Le Gaulois Professionnel
est un canard de Barbarie élevé pour sa chair et moins gras que le canard Mulard.',
'title' => 'L\'anatomie du canard',
'type' => StaticPageType::expertise_duck,
'content' => '<p>Volaille à chair brune, le canard se distingue par sa couleur et par son goût.
Plébiscité en restauration commerciale, le canard Le Gaulois Professionnel est un canard de Barbarie
élevé pour sa chair et beaucoup moins gras que son cousin le canard Mulard.</p>',
]
);
// Expertise rabbit.
StaticPage::query()->updateOrCreate(
[
'type' => StaticPageType::expertise_rabbit,
],
[
'seo_title' => 'Notre expertise volaillère - Lapin',
'seo_description' => 'Grâce à son goût apprécié de tous, le lapin se met au service du talent des
chefs qui pourront créer des recettes à leur image.',
'title' => 'L\'anatomie du lapin',
'type' => StaticPageType::expertise_rabbit,
'content' => '<p>Seule volaille sans plume, le lapin a une chair fine et claire. Nous proposons
des morceaux de râble sans os pour vous faciliter les services et vos convives apprécieront cette
viande désossée et goûteuse, aux atouts nutritionnels indiscutables.</p>',
]
);
}
}

View file

@ -1,4 +1,4 @@
<nav class="navbar navbar-expand-xl navbar-light position-fixed fixed-top bg-white shadow-sm">
<nav class="navbar navbar-expand-xxl navbar-light position-fixed fixed-top bg-white shadow-sm">
<div class="container">
<a class="btn btn-light fw-bold" data-bs-toggle="tooltip" data-bs-placement="bottom" href="{{ route('fo.homepage') }}"
title="{{ __('Accéder au front du projet') }}" role="button" target="_blank">

View file

@ -1,13 +1,11 @@
@extends('fo.layout', ['page' => 'breeder'])
@section('title', sprintf('%s - %s', __('Notre expertise volaillere - Canard'), config('app.name')))
@section('description',
'Plébiscité en restauration commerciale, le canard Le Gaulois Professionnel est un canard de Barbarie élevé pour sa
chair et moins gras que le canard Mulard.')
@section('title', $staticPageModel->seo_title)
@section('description', $staticPageModel->seo_description)
@section('bannerHeader')
@include('fo.partials.banner-header', [
'title' => _('Notre expertise volaillère'),
'title' => __('Notre expertise volaillère'),
'description' => __(
'Le Gaulois Professionnel propose une large gamme de volailles entières, découpées et élaborées, source d\'inspiration, pour des recettes variées et inventives au quotidien. Chaque volaille a ses propres caractéristiques et vous permettent de trouver la solution idéale à votre recette.'),
])
@ -20,13 +18,10 @@
@include('fo.partials.nav-expertise')
<div class="row my-md-5 my-4 text-center">
<div class="text-wrapper paragraph-format mx-auto">
<h2 class="h2">L'anatomie du canard</h2>
<p>Volaille à chair brune, le canard se distingue par sa couleur et par son goût. Plébiscité en restauration
commerciale, le canard Le Gaulois Professionnel est un canard de Barbarie élevé pour sa chair et beaucoup moins gras
que son cousin le canard Mulard.</p>
<h2 class="h2">{{ $staticPageModel->title }}</h2>
{!! clean($staticPageModel->seo_description) !!}
</div>
</div>
<div class="row wrapper-xl my-md-5 my-4">
<div class="col-12 col-md-6 py-md-0 ps-sm-3 pe-sm-5 px-0 pb-4">
<div class="row">
@ -137,15 +132,11 @@
--}}
</div>
</div>
@include('fo.partials.expertise-products-vip')
@include('fo.partials.expertise-products-vip', ['vip' => $productVipModels])
@include('fo.partials.expertise-products', [
'products' => $productModels,
'specie' => \App\Enums\ExpertiseProducts\ExpertiseProductPageEnum::duck->label(),
])
@include('fo.partials.expertise-recipes')
@include('fo.partials.expertise-recipes', ['recipes' => $recipeModels])
</div>
@endsection

View file

@ -1,9 +1,7 @@
@extends('fo.layout', ['page' => 'breeder'])
@section('title', sprintf('%s - %s', __('Notre expertise volaillere - Dinde'), config('app.name')))
@section('description',
'Grâce à son goût apprécié de tous, elle se met au service du talent des chefs qui pourront créer des recettes à
leur image.')
@section('title', $staticPageModel->seo_title)
@section('description', $staticPageModel->seo_description)
@section('bannerHeader')
@include('fo.partials.banner-header', [
@ -20,15 +18,10 @@
@include('fo.partials.nav-expertise')
<div class="row my-md-5 my-4 text-center">
<div class="text-wrapper paragraph-format mx-auto">
<h2 class="h2">L'anatomie de la dinde</h2>
<p>La dinde est peu calorique, riche en protéines et en vitamines, faible en lipides, rassasiante... elle assure
également une très bonne digestibilité.<br>
Grâce à son goût apprécié de tous, elle se met au service du talent des chefs qui pourront créer des recettes à leur
image.<br>
Toutes nos dindes sont nées, élevées et préparées en France.</p>
<h2 class="h2">{{ $staticPageModel->title }}</h2>
{!! clean($staticPageModel->seo_description) !!}
</div>
</div>
<div class="row wrapper-xl my-md-5 my-4">
<div class="col-12 col-md-6 py-md-0 ps-sm-3 pe-sm-5 px-0 pb-4">
<div class="row">
@ -154,15 +147,11 @@
--}}
</div>
</div>
@include('fo.partials.expertise-products-vip')
@include('fo.partials.expertise-products-vip', ['vip' => $productVipModels])
@include('fo.partials.expertise-products', [
'products' => $productModels,
'specie' => \App\Enums\ExpertiseProducts\ExpertiseProductPageEnum::turkey->label(),
])
@include('fo.partials.expertise-recipes')
@include('fo.partials.expertise-recipes', ['recipes' => $recipeModels])
</div>
@endsection

View file

@ -1,14 +1,13 @@
@extends('fo.layout', ['page' => 'breeder'])
@section('title', sprintf('%s - %s', __('Notre expertise volaillere - Lapin'), config('app.name')))
@section('description', 'description de la page expertise')
@section('title', $staticPageModel->seo_title)
@section('description', $staticPageModel->seo_description)
@section('bannerHeader')
@include('fo.partials.banner-header', [
'title' => __('Notre expertise volaillère'),
'description' => __('Le Gaulois Professionnel propose une large gamme de volailles entières, découpées et élaborées, source d\'inspiration,
pour des recettes variées et inventives au quotidien. Chaque volaille a ses propres caractéristiques et vous permettent de trouver la
solution idéale à votre recette.'),
'description' => __(
'Le Gaulois Professionnel propose une large gamme de volailles entières, découpées et élaborées, source d\'inspiration, pour des recettes variées et inventives au quotidien. Chaque volaille a ses propres caractéristiques et vous permettent de trouver la solution idéale à votre recette.'),
])
@endsection
@ -19,13 +18,10 @@
@include('fo.partials.nav-expertise')
<div class="row my-md-5 my-4 text-center">
<div class="text-wrapper paragraph-format mx-auto">
<h2 class="h2">L'anatomie du lapin</h2>
<p>Seule volaille sans plume, le lapin a une chair fine et claire. Nous proposons des morceaux de râble sans os pour
vous faciliter les services et vos convives apprécieront cette viande désossée et goûteuse, aux atouts nutritionnels
indiscutables.</p>
<h2 class="h2">{{ $staticPageModel->title }}</h2>
{!! clean($staticPageModel->seo_description) !!}
</div>
</div>
<div class="row wrapper-xl my-md-5 my-4">
<div class="col-12 col-md-6 py-md-0 ps-sm-3 pe-sm-5 px-0 pb-4">
<div class="row">
@ -134,15 +130,11 @@
--}}
</div>
</div>
@include('fo.partials.expertise-products-vip')
@include('fo.partials.expertise-products-vip', ['vip' => $productVipModels])
@include('fo.partials.expertise-products', [
'products' => $productModels,
'specie' => \App\Enums\ExpertiseProducts\ExpertiseProductPageEnum::rabbit->label(),
])
@include('fo.partials.expertise-recipes')
@include('fo.partials.expertise-recipes', ['recipes' => $recipeModels])
</div>
@endsection

View file

@ -1,14 +1,13 @@
@extends('fo.layout', ['page' => 'breeder'])
@section('title', sprintf('%s - %s', __('Notre expertise volaillere - Pintade'), config('app.name')))
@section('description', 'Sa saveur douce et racée fait de la pintade un produit différent, à mi-chemin entre la volaille et le gibier.')
@section('title', $staticPageModel->seo_title)
@section('description', $staticPageModel->seo_description)
@section('bannerHeader')
@include('fo.partials.banner-header', [
'title' => __('Notre expertise volaillère'),
'description' => __('Le Gaulois Professionnel propose une large gamme de volailles entières, découpées et élaborées, source d\'inspiration,
pour des recettes variées et inventives au quotidien. Chaque volaille a ses propres caractéristiques et vous permettent de trouver la solution
idéale à votre recette.'),
'description' => __(
'Le Gaulois Professionnel propose une large gamme de volailles entières, découpées et élaborées, source d\'inspiration, pour des recettes variées et inventives au quotidien. Chaque volaille a ses propres caractéristiques et vous permettent de trouver la solution idéale à votre recette.'),
])
@endsection
@ -19,9 +18,8 @@
@include('fo.partials.nav-expertise')
<div class="row my-md-5 my-4 text-center">
<div class="text-wrapper paragraph-format mx-auto">
<h2 class="h2">L'anatomie de la pintade</h2>
<p>Sa saveur douce et racée fait de la pintade un produit différent, à mi-chemin entre la volaille et le gibier. Les
pintades sont garanties 100% françaises : nées, élevées et préparées en France.</p>
<h2 class="h2">{{ $staticPageModel->title }}</h2>
{!! clean($staticPageModel->seo_description) !!}
</div>
</div>
@ -118,15 +116,11 @@
--}}
</div>
</div>
@include('fo.partials.expertise-products-vip')
@include('fo.partials.expertise-products-vip', ['vip' => $productVipModels])
@include('fo.partials.expertise-products', [
'products' => $productModels,
'specie' => \App\Enums\ExpertiseProducts\ExpertiseProductPageEnum::guineafowl->label(),
])
@include('fo.partials.expertise-recipes')
@include('fo.partials.expertise-recipes', ['recipes' => $recipeModels])
</div>
@endsection

View file

@ -1,9 +1,7 @@
@extends('fo.layout', ['page' => 'breeder'])
@section('title', sprintf('%s - %s', __('Notre expertise volaillere - Poulet'), config('app.name')))
@section('description',
"Le poulet se décline en différentes découpes calibrées pour s'adapter aux besoins de la restauration commerciale et
de la restauration collective.")
@section('title', $staticPageModel->seo_title)
@section('description', $staticPageModel->seo_description)
@section('bannerHeader')
@include('fo.partials.banner-header', [
@ -20,13 +18,10 @@
@include('fo.partials.nav-expertise')
<div class="row my-md-5 my-4 text-center">
<div class="text-wrapper paragraph-format mx-auto">
<h2 class="h2">L'anatomie du poulet</h2>
<p>Le poulet est la volaille la plus consommée en France. Il se décline en différentes découpes calibrées pour s'adapter
aux besoins de la restauration commerciale et de la restauration collective.<br>
Nos poulets sont garantis 100% français : nés, élevés et préparés en France.</p>
<h2 class="h2">{{ $staticPageModel->title }}</h2>
{!! clean($staticPageModel->seo_description) !!}
</div>
</div>
<div class="row wrapper-xl my-md-5 my-4">
<div class="col-12 col-md-6 py-md-0 ps-sm-3 pe-sm-5 px-0 pb-4">
<div class="row">
@ -273,12 +268,11 @@
</div>
</div>
@include('fo.partials.expertise-products-vip')
@include('fo.partials.expertise-products-vip', ['vip' => $productVipModels])
@include('fo.partials.expertise-products', [
'products' => $productModels,
'specie' => \App\Enums\ExpertiseProducts\ExpertiseProductPageEnum::chicken->label(),
])
@include('fo.partials.expertise-recipes')
@include('fo.partials.expertise-recipes', ['recipes' => $recipeModels])
</div>
@endsection