Merge branch 'trunk'
39
app/Console/Commands/MigrateOldMessage.php
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
<?php
|
||||
|
||||
namespace App\Console\Commands;
|
||||
|
||||
use App\Models\Message;
|
||||
use Illuminate\Console\Command;
|
||||
use Illuminate\Support\Facades\Crypt;
|
||||
|
||||
class MigrateOldMessage extends Command
|
||||
{
|
||||
/**
|
||||
* The name and signature of the console command.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $signature = 'app:migrate-old-message';
|
||||
|
||||
/**
|
||||
* The console command description.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $description = 'Command description';
|
||||
|
||||
/**
|
||||
* Execute the console command.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
// Comment casting before run this command.
|
||||
$messages = Message::all();
|
||||
foreach ($messages as $message) {
|
||||
$message->setAttribute('message', Crypt::encryptString($message->getRawOriginal('message')));
|
||||
$message->save();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -71,7 +71,7 @@ class NewsController extends Controller
|
|||
*/
|
||||
public function create(News $news): \Illuminate\Contracts\View\View
|
||||
{
|
||||
$newsCategoryModels = NewsCategory::query()->where('published', true)->orderBy('order')->get();
|
||||
$newsCategoryModels = NewsCategory::getPublishedOrdered();
|
||||
return view('bo.pages.news.create', ['newsModel' => $news, 'newsCategoryModels' => $newsCategoryModels]);
|
||||
}
|
||||
|
||||
|
|
@ -118,7 +118,7 @@ class NewsController extends Controller
|
|||
*/
|
||||
public function edit(News $news): \Illuminate\Contracts\View\View
|
||||
{
|
||||
$newsCategoryModels = NewsCategory::query()->where('published', true)->orderBy('order')->get();
|
||||
$newsCategoryModels = NewsCategory::getPublishedOrdered();
|
||||
return view('bo.pages.news.edit', ['newsModel' => $news, 'newsCategoryModels' => $newsCategoryModels]);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -54,18 +54,10 @@ class ProductController extends Controller
|
|||
$search,
|
||||
null,
|
||||
'label',
|
||||
'description',
|
||||
'details',
|
||||
'preparation',
|
||||
'ingredients',
|
||||
);
|
||||
}
|
||||
$searchFields = \implode(', ', [
|
||||
trans('validation.custom.label'),
|
||||
trans('validation.attributes.description'),
|
||||
trans('validation.custom.details'),
|
||||
trans('validation.custom.preparation'),
|
||||
str(trans('validation.custom.ingredient'))->plural()->value(),
|
||||
trans('validation.custom.label')
|
||||
]);
|
||||
|
||||
/** Sort columns with a query */
|
||||
|
|
|
|||
|
|
@ -6,18 +6,19 @@ use App\Enums\Club\NewsClubTypeEnum;
|
|||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Requests\Bo\SurveysAnswers\StoreSurveysAnswerRequest;
|
||||
use App\Http\Requests\Bo\SurveysAnswers\UpdateSurveysAnswerRequest;
|
||||
use App\Http\Requests\Bo\UpdateChangeOrderRequest;
|
||||
use App\Models\NewsClub;
|
||||
use App\Models\SurveysAnswer;
|
||||
use App\Traits\Controllers\UpdateModelPublished;
|
||||
use App\Traits\Controllers\ChangesModelOrder;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Arr;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
class SurveysAnswerController extends Controller
|
||||
{
|
||||
use UpdateModelPublished;
|
||||
use ChangesModelOrder;
|
||||
|
||||
/**
|
||||
* Create the controller instance.
|
||||
|
|
@ -204,4 +205,61 @@ class SurveysAnswerController extends Controller
|
|||
{
|
||||
return $this->create($surveysAnswer->replicate());
|
||||
}
|
||||
|
||||
/**
|
||||
* Change order.
|
||||
*
|
||||
* @param \App\Http\Requests\Bo\UpdateChangeOrderRequest $request
|
||||
* @param mixed ...$params
|
||||
* @return \Illuminate\Http\RedirectResponse
|
||||
* @throws \RuntimeException Si le nom du parametre de la route ne correspond pas au params utilisé.
|
||||
*/
|
||||
public function changeOrder(UpdateChangeOrderRequest $request, mixed ...$params): \Illuminate\Http\RedirectResponse
|
||||
{
|
||||
$paramNames = collect(request()->route()->parameterNames);
|
||||
$className = Str::of($paramNames->get($paramNames->count() - 3))->lower()->studly();
|
||||
$className = "\\App\\Models\\{$className}";
|
||||
$model = Arr::get($params, $paramNames->count() - 3);
|
||||
|
||||
if (!class_exists($className)) {
|
||||
throw new \RuntimeException("The {$className} class doesn't exist.");
|
||||
}
|
||||
|
||||
if (!\is_object($model)) {
|
||||
throw new \RuntimeException("The second last param isn't an object.");
|
||||
}
|
||||
|
||||
if (get_class($model) !== (string)Str::of($className)->replaceStart('\\', '')) {
|
||||
throw new \RuntimeException("The {$className} doesn't match second last binded param.");
|
||||
}
|
||||
|
||||
/** @var \Illuminate\Database\Eloquent\Model|null */
|
||||
$model = $className::query()
|
||||
->where($model->getRouteKeyName(), $model->getRouteKey())
|
||||
->first();
|
||||
|
||||
if (!$model) {
|
||||
return back()->with('error', trans('crud.messages.order_not_changed'));
|
||||
}
|
||||
return DB::transaction(function () use ($request, $className, $model) {
|
||||
/** @var \Illuminate\Database\Eloquent\Model|null */
|
||||
$tmp = $className::query()
|
||||
->when(request()->route()->parameter('news_club'), function (Builder $q) {
|
||||
$q->where('news_club_id', request()->route()->parameter('news_club')->getKey());
|
||||
})
|
||||
->where('order', $request->direction ? '<' : '>', $model->getOriginal('order'))
|
||||
->orderBy('order', $request->direction ? 'DESC' : 'ASC')
|
||||
->first();
|
||||
|
||||
if (!$tmp) {
|
||||
return back()->with('error', trans('crud.messages.order_not_changed'));
|
||||
}
|
||||
|
||||
$newOrder = $tmp->getOriginal('order');
|
||||
$tmp->update(['order' => $model->getOriginal('order')]);
|
||||
$model->update(['order' => $newOrder]);
|
||||
|
||||
return redirect()->back()->with('success', trans('crud.messages.order_changed'));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -24,9 +24,10 @@ class SurveyController extends Controller
|
|||
->where('published', true)
|
||||
->where('slug', $request->news_club_slug)
|
||||
->first();
|
||||
$customerSurveyAnswers = $customerModel->surveyAnswers->filter(function ($surveyAnswer) use ($newsClubModel) {
|
||||
return $surveyAnswer->newsClub->getKey() === $newsClubModel->getKey();
|
||||
});
|
||||
$customerSurveyAnswers = $customerModel->surveyAnswers
|
||||
->filter(function ($surveyAnswer) use ($newsClubModel) {
|
||||
return $surveyAnswer->newsClub->getKey() === $newsClubModel->getKey();
|
||||
});
|
||||
return view('club.pages.surveys.show', compact('newsClubModel', 'customerSurveyAnswers'));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -16,11 +16,7 @@ class BreedingController extends Controller
|
|||
*/
|
||||
public function breedingPage(StaticPage $staticPage): \Illuminate\Contracts\View\View
|
||||
{
|
||||
$newsBreedingModels = NewsBreeding::query()
|
||||
->where('associated_page', $staticPage->type)
|
||||
->where('published', true)
|
||||
->orderBy('order')
|
||||
->get();
|
||||
$newsBreedingModels = NewsBreeding::getPublishedOrderedForType($staticPage->type);
|
||||
return view('fo.pages.breeding.show', [
|
||||
'staticPageModel' => $staticPage,
|
||||
'newsBreedingModels' => $newsBreedingModels,
|
||||
|
|
|
|||
|
|
@ -31,22 +31,15 @@ class HomeController extends Controller
|
|||
*/
|
||||
public function index(): \Illuminate\Contracts\View\View
|
||||
{
|
||||
$staticPageModel = StaticPage::query()->where('type', StaticPageType::home)->first();
|
||||
$mainSlideModels = MainSlide::query()->where('published', true)->orderBy('order', 'ASC')
|
||||
->with('approach')->get();
|
||||
$demarcheSlideModels = DemarcheSlide::query()->where('published', true)->orderBy('order', 'ASC')->get();
|
||||
$rangeModels = Range::query()->where('published', true)->orderBy('slug', 'ASC')->get();
|
||||
$staticPageModel = StaticPage::getCachedStaticPage(StaticPageType::home);
|
||||
$mainSlideModels = MainSlide::getPublishedOrderedWithApproaches();
|
||||
$demarcheSlideModels = DemarcheSlide::getPublishedOrdered();
|
||||
$rangeModels = Range::getPublishedOrderedBySlug();
|
||||
$productViews = Product::getProductsViewsByRange();
|
||||
$hotNewsSettings = GeneralSetting::query()->where('type', SettingsType::hotNews)->first();
|
||||
$newsModels = News::query()->where('published', true)->with('newsCategory')->get();
|
||||
$recipeModels = Recipe::query()->where('published', true)->with([
|
||||
'products',
|
||||
'products.meat',
|
||||
'products.submeat',
|
||||
'consumptionMoment'
|
||||
])->limit(9)->get();
|
||||
$videoModels = Video::query()->where('published', true)->where('is_on_homepage', true)
|
||||
->orderBy('order')->with('product')->limit(9)->get();
|
||||
$hotNewsSettings = GeneralSetting::getCachedGeneralSetting(SettingsType::hotNews);
|
||||
$newsModels = News::getPublishedWithNewsCategory();
|
||||
$recipeModels = Recipe::get9PublishedWithProducts();
|
||||
$videoModels = Video::get9PublishedHomeVideosOrderedWithProducts();
|
||||
$discountsTotal = Discount::query()->get()->sum('value');
|
||||
return view('fo.pages.home', compact(
|
||||
'staticPageModel',
|
||||
|
|
|
|||
|
|
@ -18,8 +18,8 @@ class NewsController extends Controller
|
|||
*/
|
||||
public function index(): \Illuminate\Contracts\View\View
|
||||
{
|
||||
$staticPageModel = StaticPage::query()->where('type', StaticPageType::news)->first();
|
||||
$newsCategories = NewsCategory::query()->where('published', true)->orderByDesc('order')->get();
|
||||
$staticPageModel = StaticPage::getCachedStaticPage(StaticPageType::news);
|
||||
$newsCategories = NewsCategory::getPublishedOrdered();
|
||||
|
||||
return view('fo.pages.news.index', [
|
||||
'newsViews' => News::getNewsViewsByNewsCategory(),
|
||||
|
|
@ -43,7 +43,7 @@ class NewsController extends Controller
|
|||
->where([
|
||||
['published', '=', true],
|
||||
['id', '!=', $newsModel->id],
|
||||
])
|
||||
])
|
||||
->inRandomOrder()
|
||||
->take(3)
|
||||
->get();
|
||||
|
|
@ -51,7 +51,7 @@ class NewsController extends Controller
|
|||
return view('fo.pages.news.show', [
|
||||
'newsModel' => $newsModel,
|
||||
'asideNewsModels' => $asideNewsModels
|
||||
]);
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -46,14 +46,12 @@ class ProductController extends Controller
|
|||
->where('published', true)
|
||||
->orderBy('slug')
|
||||
->paginate($this->productModelsPerPage);
|
||||
$productDiscoverModels = Product::query()->where('published', true)->where('discover', true)->get();
|
||||
$staticPageModel = StaticPage::query()->where('type', StaticPageType::products)->first();
|
||||
$rangeModels = Range::query()->where('published', true)->with('subranges')->orderBy('order')->get();
|
||||
$subrangeModels = $subrangeModelsFiltered ?? Subrange::query()->where('published', true)
|
||||
->orderBy('order')->get();
|
||||
$meatModels = Meat::query()->where('published', true)->with('submeats')->orderBy('order')->get();
|
||||
$submeatModels = $submeatModelsFiltered ?? Submeat::query()->where('published', true)
|
||||
->orderBy('order')->get();
|
||||
$productDiscoverModels = Product::getPublishedDiscovered();
|
||||
$staticPageModel = StaticPage::getCachedStaticPage(StaticPageType::products);
|
||||
$rangeModels = Range::getPublishedOrderedWithSubranges();
|
||||
$subrangeModels = $subrangeModelsFiltered ?? Subrange::getPublishedOrdered();
|
||||
$meatModels = Meat::getPublishedOrderedWithSubmeats();
|
||||
$submeatModels = $submeatModelsFiltered ?? Submeat::getPublishedOrdered();
|
||||
|
||||
return view('fo.pages.products.index', [
|
||||
'viewsPaginate' => $this->getViewsFromPaginateModels($productModels),
|
||||
|
|
@ -82,17 +80,24 @@ class ProductController extends Controller
|
|||
}
|
||||
$productModelSibling = $this->getSiblingModels($productModel);
|
||||
|
||||
$staticPageModel = StaticPage::query()->where('type', StaticPageType::product)->first();
|
||||
$staticPageModel = StaticPage::getCachedStaticPage(StaticPageType::product);
|
||||
|
||||
/** @var \App\Models\Recipe|null $recipeModel */
|
||||
$recipeModel = ((count($productModel->recipes))
|
||||
? Recipe::query()->where('id', $productModel->recipes->first()->getKey())->first()
|
||||
$recipeModel = $productModel->recipes->isNotEmpty()
|
||||
? $productModel->recipes()->with(['products', 'consumptionMoment'])->first()
|
||||
: Recipe::query()->whereHas('products', function (Builder $q) use ($productModel) {
|
||||
$q->where('id', $productModel->getKey());
|
||||
})->first());
|
||||
|
||||
$q->when($productModel->subrange, function (Builder $q) use ($productModel) {
|
||||
$q->whereHas('subrange', function (Builder $q) use ($productModel) {
|
||||
$q->where('id', $productModel->subrange->getKey());
|
||||
});
|
||||
})->when($productModel->range, function (Builder $q) use ($productModel) {
|
||||
$q->whereHas('range', function (Builder $q) use ($productModel) {
|
||||
$q->where('id', $productModel->range->getKey());
|
||||
});
|
||||
});
|
||||
})->with(['products', 'consumptionMoment'])->first();
|
||||
/** @var \App\Models\Video $videoModel */
|
||||
$videoModel = Video::query()->first();
|
||||
$videoModel = $productModel->videos->sortByDesc('created_at')->first();
|
||||
|
||||
return view('fo.pages.products.show', [
|
||||
'productModel' => $productModel,
|
||||
|
|
|
|||
|
|
@ -43,12 +43,12 @@ class RecipeController extends Controller
|
|||
->where('published', true)
|
||||
->orderBy('slug')
|
||||
->paginate($this->recipeModelsPerPage);
|
||||
$recipeModel = Recipe::query()->where('published', true)->where('highlight', true)->first();
|
||||
$staticPageModel = StaticPage::query()->where('type', StaticPageType::recipes)->first();
|
||||
$consumptionMomentModels = ConsumptionMoment::query()->orderBy('slug')->get();
|
||||
$meatModels = Meat::query()->where('published', true)->with('submeats')->orderBy('order')->get();
|
||||
$recipeModel = Recipe::getFirstHighlighted();
|
||||
$staticPageModel = StaticPage::getCachedStaticPage(StaticPageType::recipes);
|
||||
$consumptionMomentModels = ConsumptionMoment::getOrderedBySlug();
|
||||
$meatModels = Meat::getPublishedOrderedWithSubmeats();
|
||||
$submeatModels = $submeatModelsFiltered ??
|
||||
Submeat::query()->where('published', true)->orderBy('order')->get();
|
||||
Submeat::publishedSubmeatsOrderedByOrder();
|
||||
|
||||
return view('fo.pages.recipes.index', [
|
||||
'viewsPaginate' => $this->getViewsFromPaginateModels($recipeModels),
|
||||
|
|
@ -79,7 +79,7 @@ class RecipeController extends Controller
|
|||
abort(404);
|
||||
}
|
||||
|
||||
$staticPageModel = StaticPage::query()->where('type', StaticPageType::recipe)->first();
|
||||
$staticPageModel = StaticPage::getCachedStaticPage(StaticPageType::recipe);
|
||||
|
||||
return view('fo.pages.recipes.show', [
|
||||
'recipeModel' => $recipeModel,
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ class StaticPageController extends Controller
|
|||
*/
|
||||
public function contact(StaticPage $staticPageModel): \Illuminate\Contracts\View\View
|
||||
{
|
||||
$staticPageModel = StaticPage::query()->where('type', StaticPageType::contact)->first();
|
||||
$staticPageModel = StaticPage::getCachedStaticPage(StaticPageType::contact);
|
||||
return view('fo.pages.legals', ['staticPageModel' => $staticPageModel]);
|
||||
}
|
||||
|
||||
|
|
@ -40,7 +40,7 @@ class StaticPageController extends Controller
|
|||
*/
|
||||
public function legals(StaticPage $staticPageModel): \Illuminate\Contracts\View\View
|
||||
{
|
||||
$staticPageModel = StaticPage::query()->where('type', StaticPageType::legals)->first();
|
||||
$staticPageModel = StaticPage::getCachedStaticPage(StaticPageType::legals);
|
||||
return view('fo.pages.legals', ['staticPageModel' => $staticPageModel]);
|
||||
}
|
||||
|
||||
|
|
@ -52,7 +52,7 @@ class StaticPageController extends Controller
|
|||
*/
|
||||
public function policies(StaticPage $staticPageModel): \Illuminate\Contracts\View\View
|
||||
{
|
||||
$staticPageModel = StaticPage::query()->where('type', StaticPageType::confidentiality)->first();
|
||||
$staticPageModel = StaticPage::getCachedStaticPage(StaticPageType::confidentiality);
|
||||
return view('fo.pages.legals', ['staticPageModel' => $staticPageModel]);
|
||||
}
|
||||
|
||||
|
|
@ -64,7 +64,7 @@ class StaticPageController extends Controller
|
|||
*/
|
||||
public function selling(StaticPage $staticPageModel): \Illuminate\Contracts\View\View
|
||||
{
|
||||
$staticPageModel = StaticPage::query()->where('type', StaticPageType::selling)->first();
|
||||
$staticPageModel = StaticPage::getCachedStaticPage(StaticPageType::selling);
|
||||
return view('fo.pages.legals', ['staticPageModel' => $staticPageModel]);
|
||||
}
|
||||
|
||||
|
|
@ -76,7 +76,7 @@ class StaticPageController extends Controller
|
|||
*/
|
||||
public function accessibility(StaticPage $staticPageModel): \Illuminate\Contracts\View\View
|
||||
{
|
||||
$staticPageModel = StaticPage::query()->where('type', StaticPageType::accessibility)->first();
|
||||
$staticPageModel = StaticPage::getCachedStaticPage(StaticPageType::accessibility);
|
||||
return view('fo.pages.legals', ['staticPageModel' => $staticPageModel]);
|
||||
}
|
||||
|
||||
|
|
@ -89,23 +89,22 @@ class StaticPageController extends Controller
|
|||
public function recruitment(StaticPage $staticPageModel): \Illuminate\Contracts\View\View
|
||||
{
|
||||
$detect = new MobileDetect();
|
||||
$staticPageModel = StaticPage::query()->where('type', StaticPageType::recruitment)->first();
|
||||
$staticPageModel = StaticPage::getCachedStaticPage(StaticPageType::recruitment);
|
||||
$offerModels = Cache::rememberForever(
|
||||
config('services.digital_recruiter.url'),
|
||||
fn() => Offer::query()->where('published', true)->orderBy('publish_at', 'DESC')->take(6)->get()
|
||||
);
|
||||
$professionModels = Profession::query()->where('published', true)->take(5)->get();
|
||||
$brandAdvantageModels = BrandAdvantage::query()->where('published', true)->orderBy('order')->get();
|
||||
$newsCorporateModels = NewsCorporate::query()
|
||||
->where('published', true)
|
||||
->orderByDesc('updated_at')
|
||||
->limit($detect->isMobile() ? 3 : 9)
|
||||
->get();
|
||||
$professionModels = Profession::get5Published();
|
||||
$brandAdvantageModels = BrandAdvantage::getPublishedOrdered();
|
||||
$newsCorporateModels = NewsCorporate::get9PublishedOrderedByUpdatedAt();
|
||||
if ($detect->isMobile()) {
|
||||
$newsCorporateModels = $newsCorporateModels->take(3);
|
||||
}
|
||||
$digitalRecruiterCount = Cache::rememberForever(
|
||||
sprintf('%s-count', config('services.digital_recruiter.url')),
|
||||
fn() => GeneralSetting::query()->where('type', SettingsType::offersCount)->firstOrFail()->value['count']
|
||||
);
|
||||
$testimonialModels = Testimonial::query()->where('published', true)->get();
|
||||
$testimonialModels = Testimonial::getPublishedOrdered();
|
||||
return view('fo.pages.recruitment', compact(
|
||||
'staticPageModel',
|
||||
'offerModels',
|
||||
|
|
@ -126,9 +125,9 @@ class StaticPageController extends Controller
|
|||
*/
|
||||
public function story(StaticPage $staticPageModel): \Illuminate\Contracts\View\View
|
||||
{
|
||||
$staticPageModel = StaticPage::query()->where('type', StaticPageType::story)->first();
|
||||
$keyNumberModels = KeyNumber::query()->where('published', true)->orderBy('order')->take(5)->get();
|
||||
$historicalMilestoneModels = HistoricalMilestone::query()->where('published', true)->orderBy('year')->get();
|
||||
$staticPageModel = StaticPage::getCachedStaticPage(StaticPageType::story);
|
||||
$keyNumberModels = KeyNumber::get5PublishedOrdered();
|
||||
$historicalMilestoneModels = HistoricalMilestone::getPublishedOrderedByYear();
|
||||
return view('fo.pages.story', compact('staticPageModel', 'keyNumberModels', 'historicalMilestoneModels'));
|
||||
}
|
||||
|
||||
|
|
@ -140,8 +139,8 @@ class StaticPageController extends Controller
|
|||
*/
|
||||
public function saga(StaticPage $staticPageModel)
|
||||
{
|
||||
$staticPageModel = StaticPage::query()->where('type', StaticPageType::saga)->first();
|
||||
$videoModels = Video::query()->where('published', true)->orderBy('order')->with('product')->take(6)->get();
|
||||
$staticPageModel = StaticPage::getCachedStaticPage(StaticPageType::saga);
|
||||
$videoModels = Video::get6PublishedVideosOrderedWithProducts();
|
||||
return view('fo.pages.saga', compact('staticPageModel', 'videoModels'));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -56,6 +56,7 @@ class StoreProductRequest extends FormRequest
|
|||
'seo_title' => 'required|min:45|max:70',
|
||||
'seo_description' => 'required|min:50|max:160',
|
||||
'label' => 'required|string|between:3,255',
|
||||
'claim_title' => "sometimes|nullable|string|between:3,255",
|
||||
'picture_alt' => 'required_with:picture|nullable|string|between:3,255',
|
||||
'picture_title' => 'required_with:picture|nullable|string|between:3,255',
|
||||
'banner_alt' => 'required_with:banner|nullable|string|between:3,255',
|
||||
|
|
@ -177,7 +178,7 @@ class StoreProductRequest extends FormRequest
|
|||
];
|
||||
return \array_merge(
|
||||
$rules,
|
||||
$this->pictureRules('picture', 300, 200, 300, 200),
|
||||
$this->pictureRules('picture', 300, 200, 300, 200, true),
|
||||
$this->pictureRules('banner', 1440, 420, 1440, 420, true),
|
||||
$this->pictureRules('packaging', 315, 450, 315, 450),
|
||||
);
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ use App\Lib\Helpers\FileStorageHelper;
|
|||
use App\Traits\Models\ActivityLog;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
|
||||
/**
|
||||
* @property string $title Title.
|
||||
|
|
@ -63,14 +64,19 @@ class BrandAdvantage extends Model
|
|||
self::setOrder($model);
|
||||
self::manageFields($model);
|
||||
});
|
||||
static::created(function (self $model) {
|
||||
self::resetCache();
|
||||
});
|
||||
static::updating(function (self $model) {
|
||||
self::manageFields($model);
|
||||
});
|
||||
static::updated(function (self $model) {
|
||||
FileStorageHelper::removeOldFile($model, 'picto');
|
||||
self::resetCache();
|
||||
});
|
||||
static::deleted(function (self $model) {
|
||||
FileStorageHelper::removeFile($model, 'picto');
|
||||
self::resetCache();
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -124,4 +130,25 @@ class BrandAdvantage extends Model
|
|||
{
|
||||
return \boolval($this->getOriginal('published')) !== $this->published ? true : false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset all cache elements related to this model.
|
||||
* @return void
|
||||
*/
|
||||
private static function resetCache()
|
||||
{
|
||||
Cache::forget('publishedBrandAdvantagesOrderedByOrder');
|
||||
self::getPublishedOrdered();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all published BrandAdvantages ordered by order.
|
||||
* @return \Illuminate\Database\Eloquent\Collection
|
||||
*/
|
||||
public static function getPublishedOrdered(): \Illuminate\Database\Eloquent\Collection
|
||||
{
|
||||
return Cache::rememberForever('publishedBrandAdvantagesOrderedByOrder', function () {
|
||||
return self::query()->where('published', true)->orderBy('order')->get();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ use App\Lib\Helpers\FileStorageHelper;
|
|||
use App\Traits\Models\ActivityLog;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
|
||||
/**
|
||||
* @property string $title Consumption moment title.
|
||||
|
|
@ -50,6 +51,9 @@ class ConsumptionMoment extends Model
|
|||
$model->slug = str($model->title)->slug();
|
||||
$model->picture = FileStorageHelper::storeFile($model, $model->picture, true);
|
||||
});
|
||||
static::created(function (self $model) {
|
||||
self::resetCache();
|
||||
});
|
||||
static::updating(function (self $model) {
|
||||
self::assertTitleIsUnique($model->title, $model->getKey());
|
||||
$model->slug = str($model->title)->slug();
|
||||
|
|
@ -57,9 +61,11 @@ class ConsumptionMoment extends Model
|
|||
});
|
||||
static::updated(function (self $model) {
|
||||
FileStorageHelper::removeOldFile($model, 'picture');
|
||||
self::resetCache();
|
||||
});
|
||||
static::deleted(function (self $model) {
|
||||
FileStorageHelper::removeFile($model, 'picture');
|
||||
self::resetCache();
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -79,4 +85,25 @@ class ConsumptionMoment extends Model
|
|||
ToolboxHelper::assertFieldIsUnique($table, 'title', $title, $id);
|
||||
ToolboxHelper::assertFieldIsUnique($table, 'slug', str($title)->slug(), $id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset all cache elements related to this model.
|
||||
* @return void
|
||||
*/
|
||||
private static function resetCache()
|
||||
{
|
||||
Cache::forget('consumptionMomentsOrderedBySlug');
|
||||
self::getOrderedBySlug();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all consumption moments ordered by slug.
|
||||
* @return \Illuminate\Database\Eloquent\Collection
|
||||
*/
|
||||
public static function getOrderedBySlug(): \Illuminate\Database\Eloquent\Collection
|
||||
{
|
||||
return Cache::rememberForever('consumptionMomentsOrderedBySlug', function () {
|
||||
return self::query()->orderBy('slug')->get();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ use App\Lib\Helpers\FileStorageHelper;
|
|||
use App\Traits\Models\ActivityLog;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
|
||||
/**
|
||||
* @property string $title Slide title.
|
||||
|
|
@ -85,6 +86,9 @@ class DemarcheSlide extends Model
|
|||
self::setButtons($demarcheSlide);
|
||||
$demarcheSlide->picture = FileStorageHelper::storeFile($demarcheSlide, $demarcheSlide->picture, true);
|
||||
});
|
||||
static::created(function (self $demarcheSlide) {
|
||||
self::resetCache();
|
||||
});
|
||||
static::updating(function (self $demarcheSlide) {
|
||||
self::makeStatusSense($demarcheSlide);
|
||||
self::setButtons($demarcheSlide);
|
||||
|
|
@ -92,9 +96,11 @@ class DemarcheSlide extends Model
|
|||
});
|
||||
static::updated(function (self $demarcheSlide) {
|
||||
FileStorageHelper::removeOldFile($demarcheSlide, 'picture');
|
||||
self::resetCache();
|
||||
});
|
||||
static::deleted(function (self $demarcheSlide) {
|
||||
FileStorageHelper::removeFile($demarcheSlide, 'picture');
|
||||
self::resetCache();
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -177,4 +183,28 @@ class DemarcheSlide extends Model
|
|||
{
|
||||
$demarcheSlide->order = \intval(self::query()->max('order')) + 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset all cache elements related to this model.
|
||||
* @return void
|
||||
*/
|
||||
private static function resetCache()
|
||||
{
|
||||
Cache::forget('publishedDemarcheSlidesOrderedByOrder');
|
||||
self::getPublishedOrdered();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all published demarche slides ordered by order.
|
||||
* @return \Illuminate\Database\Eloquent\Collection
|
||||
*/
|
||||
public static function getPublishedOrdered(): \Illuminate\Database\Eloquent\Collection
|
||||
{
|
||||
return Cache::rememberForever('publishedDemarcheSlidesOrderedByOrder', function () {
|
||||
return self::query()
|
||||
->where('published', true)
|
||||
->orderBy('order')
|
||||
->get();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -11,6 +11,7 @@ use App\Traits\Models\IsCachedAsCollection;
|
|||
use Illuminate\Database\Eloquent\Casts\Attribute;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Support\Arr;
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
|
||||
/**
|
||||
* @property-read \App\Enums\Settings\SettingsType $type Enum SettingsType.
|
||||
|
|
@ -80,6 +81,7 @@ class GeneralSetting extends Model
|
|||
);
|
||||
}
|
||||
self::removeCached();
|
||||
self::resetCache($model->type);
|
||||
});
|
||||
static::deleting(fn() => throw new \ErrorException('Not allowed to create an instance of this'));
|
||||
}
|
||||
|
|
@ -188,4 +190,27 @@ class GeneralSetting extends Model
|
|||
default => throw new \ErrorException("No instruction to unserialize setting type '{$type->label()}'")
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset all cache elements related to this model.
|
||||
* @return void
|
||||
*/
|
||||
private static function resetCache(SettingsType $type)
|
||||
{
|
||||
Cache::forget(sprintf('%sStaticPage', $type->name));
|
||||
self::getCachedGeneralSetting($type);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get cached general setting associated to a given type.
|
||||
* @param \App\Enums\Settings\SettingsType $type
|
||||
* @return \App\Models\StaticPage
|
||||
*/
|
||||
public static function getCachedGeneralSetting(SettingsType $type)
|
||||
{
|
||||
return Cache::rememberForever(
|
||||
sprintf('%sGeneralSetting', $type->name),
|
||||
fn() => self::query()->where('type', $type)->first()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ use App\Lib\Helpers\FileStorageHelper;
|
|||
use App\Traits\Models\ActivityLog;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
|
||||
/**
|
||||
* @property \Carbon\Carbon $year Historical milestone year.
|
||||
|
|
@ -67,6 +68,9 @@ class HistoricalMilestone extends Model
|
|||
self::setImage($historicalMilestone, 'picture');
|
||||
self::setImage($historicalMilestone, 'picto');
|
||||
});
|
||||
static::created(function (self $historicalMilestone) {
|
||||
self::resetCache();
|
||||
});
|
||||
static::updating(function (self $historicalMilestone) {
|
||||
self::setImage($historicalMilestone, 'picture');
|
||||
self::setImage($historicalMilestone, 'picto');
|
||||
|
|
@ -74,10 +78,12 @@ class HistoricalMilestone extends Model
|
|||
static::updated(function (self $historicalMilestone) {
|
||||
FileStorageHelper::removeOldFile($historicalMilestone, 'picture');
|
||||
FileStorageHelper::removeOldFile($historicalMilestone, 'picto');
|
||||
self::resetCache();
|
||||
});
|
||||
static::deleted(function (self $historicalMilestone) {
|
||||
FileStorageHelper::removeFile($historicalMilestone, 'picture');
|
||||
FileStorageHelper::removeFile($historicalMilestone, 'picto');
|
||||
self::resetCache();
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -103,4 +109,25 @@ class HistoricalMilestone extends Model
|
|||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset all cache elements related to this model.
|
||||
* @return void
|
||||
*/
|
||||
private static function resetCache()
|
||||
{
|
||||
Cache::forget('publishedHistoricalMilestonesOrderedByYear');
|
||||
self::getPublishedOrderedByYear();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all published HistoricalMilestones ordered by year.
|
||||
* @return \Illuminate\Database\Eloquent\Collection
|
||||
*/
|
||||
public static function getPublishedOrderedByYear(): \Illuminate\Database\Eloquent\Collection
|
||||
{
|
||||
return Cache::rememberForever('publishedHistoricalMilestonesOrderedByYear', function () {
|
||||
return self::query()->where('published', true)->orderBy('year')->get();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ use App\Lib\Helpers\FileStorageHelper;
|
|||
use App\Traits\Models\ActivityLog;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
|
||||
/**
|
||||
* @property string $picto Picto path.
|
||||
|
|
@ -49,14 +50,19 @@ class KeyNumber extends Model
|
|||
self::setOrder($keyNumber);
|
||||
$keyNumber->picto = FileStorageHelper::storeFile($keyNumber, $keyNumber->picto, true);
|
||||
});
|
||||
static::created(function (self $keyNumber) {
|
||||
self::resetCache();
|
||||
});
|
||||
static::updating(function (self $keyNumber) {
|
||||
$keyNumber->picto = FileStorageHelper::storeFile($keyNumber, $keyNumber->picto, true);
|
||||
});
|
||||
static::updated(function (self $keyNumber) {
|
||||
FileStorageHelper::removeOldFile($keyNumber, 'picto');
|
||||
self::resetCache();
|
||||
});
|
||||
static::deleted(function (self $keyNumber) {
|
||||
FileStorageHelper::removeFile($keyNumber, 'picto');
|
||||
self::resetCache();
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -72,4 +78,25 @@ class KeyNumber extends Model
|
|||
{
|
||||
$model->order = \intval(self::query()->max('order')) + 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset all cache elements related to this model.
|
||||
* @return void
|
||||
*/
|
||||
private static function resetCache()
|
||||
{
|
||||
Cache::forget('5publishedKeyNumbersOrderedByOrder');
|
||||
self::get5PublishedOrdered();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get 5 published key numbers ordered by order.
|
||||
* @return \Illuminate\Database\Eloquent\Collection
|
||||
*/
|
||||
public static function get5PublishedOrdered(): \Illuminate\Database\Eloquent\Collection
|
||||
{
|
||||
return Cache::rememberForever('5publishedKeyNumbersOrderedByOrder', function () {
|
||||
return self::query()->where('published', true)->orderBy('order')->take(5)->get();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ use App\Lib\Helpers\FileStorageHelper;
|
|||
use App\Traits\Models\ActivityLog;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
|
||||
/**
|
||||
* @property string $title Slide title.
|
||||
|
|
@ -112,6 +113,9 @@ class MainSlide extends Model
|
|||
self::setImage($mainSlide);
|
||||
$mainSlide->background = FileStorageHelper::storeFile($mainSlide, $mainSlide->background, true);
|
||||
});
|
||||
static::created(function (self $mainSlide) {
|
||||
self::resetCache();
|
||||
});
|
||||
static::updating(function (self $mainSlide) {
|
||||
self::makeStatusSense($mainSlide);
|
||||
self::setButtons($mainSlide);
|
||||
|
|
@ -121,10 +125,12 @@ class MainSlide extends Model
|
|||
static::updated(function (self $mainSlide) {
|
||||
FileStorageHelper::removeOldFile($mainSlide, 'background');
|
||||
FileStorageHelper::removeOldFile($mainSlide, 'picture');
|
||||
self::resetCache();
|
||||
});
|
||||
static::deleted(function (self $mainSlide) {
|
||||
FileStorageHelper::removeFile($mainSlide, 'background');
|
||||
FileStorageHelper::removeFile($mainSlide, 'picture');
|
||||
self::resetCache();
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -228,6 +234,31 @@ class MainSlide extends Model
|
|||
$mainSlide->order = \intval(self::query()->max('order')) + 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset all cache elements related to this model.
|
||||
* @return void
|
||||
*/
|
||||
private static function resetCache()
|
||||
{
|
||||
Cache::forget('publishedMainSlidesOrderedByOrderWithApproaches');
|
||||
self::getPublishedOrderedWithApproaches();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all published main slides ordered by order with approaches.
|
||||
* @return \Illuminate\Database\Eloquent\Collection
|
||||
*/
|
||||
public static function getPublishedOrderedWithApproaches(): \Illuminate\Database\Eloquent\Collection
|
||||
{
|
||||
return Cache::rememberForever('publishedMainSlidesOrderedByOrderWithApproaches', function () {
|
||||
return self::query()
|
||||
->where('published', true)
|
||||
->orderBy('order')
|
||||
->with('approach')
|
||||
->get();
|
||||
});
|
||||
}
|
||||
|
||||
// * RELATIONSHIPS
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ use App\Lib\Helpers\ToolboxHelper;
|
|||
use App\Traits\Models\ActivityLog;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
/**
|
||||
|
|
@ -80,6 +81,9 @@ class Meat extends Model
|
|||
self::setOrder($model);
|
||||
self::manageFields($model);
|
||||
});
|
||||
static::created(function (self $model) {
|
||||
self::resetCache();
|
||||
});
|
||||
static::updating(function (self $model) {
|
||||
// * ASSERTIONS
|
||||
self::assertLabelIsUnique($model->label, $model->getKey());
|
||||
|
|
@ -89,6 +93,7 @@ class Meat extends Model
|
|||
static::updated(function (self $model) {
|
||||
FileStorageHelper::removeOldFile($model, 'banner');
|
||||
FileStorageHelper::removeOldFile($model, 'picture');
|
||||
self::resetCache();
|
||||
});
|
||||
static::deleting(function (self $model) {
|
||||
/** @var \Illuminate\Database\Eloquent\Collection $submeats */
|
||||
|
|
@ -102,6 +107,7 @@ class Meat extends Model
|
|||
static::deleted(function (self $model) {
|
||||
FileStorageHelper::removeFile($model, 'banner');
|
||||
FileStorageHelper::removeFile($model, 'picture');
|
||||
self::resetCache();
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -146,6 +152,44 @@ class Meat extends Model
|
|||
$model->order = \intval(self::query()->max('order')) + 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset all cache elements related to this model.
|
||||
* @return void
|
||||
*/
|
||||
private static function resetCache()
|
||||
{
|
||||
Cache::forget('publishedMeatsOrderedByOrder');
|
||||
self::getPublishedOrdered();
|
||||
Cache::forget('publishedMeatsOrderedByOrderWithSubmeats');
|
||||
self::getPublishedOrderedWithSubmeats();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all published Meats ordered by order.
|
||||
* @return \Illuminate\Database\Eloquent\Collection
|
||||
*/
|
||||
public static function getPublishedOrdered(): \Illuminate\Database\Eloquent\Collection
|
||||
{
|
||||
return Cache::rememberForever('publishedMeatsOrderedByOrder', function () {
|
||||
return self::query()->where('published', true)->orderBy('order')->get();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all published Meats ordered by order with submeats.
|
||||
* @return \Illuminate\Database\Eloquent\Collection
|
||||
*/
|
||||
public static function getPublishedOrderedWithSubmeats(): \Illuminate\Database\Eloquent\Collection
|
||||
{
|
||||
return Cache::rememberForever('publishedMeatsOrderedByOrderWithSubmeats', function () {
|
||||
return self::query()
|
||||
->where('published', true)
|
||||
->with('submeats')
|
||||
->orderBy('order')
|
||||
->get();
|
||||
});
|
||||
}
|
||||
|
||||
// * RELATIONSHIPS
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ use Detection\MobileDetect;
|
|||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
use Illuminate\Support\Facades\Session;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
|
|
@ -88,6 +89,9 @@ class News extends Model
|
|||
self::assertTitleIsUnique($news->title);
|
||||
self::manageFields($news);
|
||||
});
|
||||
static::created(function (self $news) {
|
||||
self::resetCache();
|
||||
});
|
||||
static::updating(function (self $news) {
|
||||
self::makeStatusSense($news);
|
||||
self::checkHighlightField($news);
|
||||
|
|
@ -97,11 +101,13 @@ class News extends Model
|
|||
FileStorageHelper::removeOldFile($news, 'picture');
|
||||
FileStorageHelper::removeOldFile($news, 'thumbnail');
|
||||
FileStorageHelper::removeOldModelFilesFromHtml($news->content, $news->getOriginal("content"));
|
||||
self::resetCache();
|
||||
});
|
||||
static::deleted(function (self $news) {
|
||||
FileStorageHelper::removeFile($news, 'picture');
|
||||
FileStorageHelper::removeFile($news, 'thumbnail');
|
||||
FileStorageHelper::removeOldModelFilesFromHtml($news->content, $news->getOriginal("content"));
|
||||
self::resetCache();
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -211,6 +217,27 @@ class News extends Model
|
|||
ToolboxHelper::assertFieldIsUnique($table, 'slug', str($title)->slug(), $id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset all cache elements related to this model.
|
||||
* @return void
|
||||
*/
|
||||
private static function resetCache()
|
||||
{
|
||||
Cache::forget('publishedNewsWithCategories');
|
||||
self::getPublishedWithNewsCategory();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all published news with categories relations.
|
||||
* @return \Illuminate\Database\Eloquent\Collection
|
||||
*/
|
||||
public static function getPublishedWithNewsCategory(): \Illuminate\Database\Eloquent\Collection
|
||||
{
|
||||
return Cache::rememberForever('publishedNewsWithCategories', function () {
|
||||
return self::query()->where('published', true)->with('newsCategory')->get();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Get News views by News category.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ use App\Lib\Helpers\ToolboxHelper;
|
|||
use App\Traits\Models\ActivityLog;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
/**
|
||||
|
|
@ -76,14 +77,19 @@ class NewsBreeding extends Model
|
|||
self::setOrder($model);
|
||||
self::manageFields($model);
|
||||
});
|
||||
static::created(function (self $model) {
|
||||
self::resetCache($model->associated_page);
|
||||
});
|
||||
static::updating(function (self $model) {
|
||||
self::manageFields($model);
|
||||
});
|
||||
static::updated(function (self $model) {
|
||||
FileStorageHelper::removeOldFile($model, 'picture');
|
||||
self::resetCache($model->associated_page);
|
||||
});
|
||||
static::deleted(function (self $model) {
|
||||
FileStorageHelper::removeFile($model, 'picture');
|
||||
self::resetCache($model->associated_page);
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -177,6 +183,33 @@ class NewsBreeding extends Model
|
|||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset all cache elements related to this model.
|
||||
* @return void
|
||||
*/
|
||||
private static function resetCache(StaticPageType $type)
|
||||
{
|
||||
Cache::forget(sprintf('%sPublishedNewsBreedingOrderedByOrder', $type->name));
|
||||
self::getPublishedOrderedForType($type);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all published news breeding ordered by order associated to a given static page type.
|
||||
* @return \Illuminate\Database\Eloquent\Collection
|
||||
*/
|
||||
public static function getPublishedOrderedForType(StaticPageType $type): \Illuminate\Database\Eloquent\Collection
|
||||
{
|
||||
return Cache::rememberForever(
|
||||
sprintf('%sPublishedNewsBreedingOrderedByOrder', $type->name),
|
||||
fn() =>
|
||||
self::query()
|
||||
->where('associated_page', $type)
|
||||
->where('published', true)
|
||||
->orderBy('order')
|
||||
->get()
|
||||
);
|
||||
}
|
||||
|
||||
// * RELATIONSHIPS
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ use Illuminate\Database\Eloquent\Factories\HasFactory;
|
|||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Support\Str;
|
||||
use App\Lib\Helpers\ToolboxHelper;
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
|
||||
/**
|
||||
* @property string $title The title of the news.
|
||||
|
|
@ -56,10 +57,19 @@ class NewsCategory extends Model
|
|||
self::setOrder($newsCategory);
|
||||
self::manageFields($newsCategory);
|
||||
});
|
||||
static::created(function (self $newsCategory) {
|
||||
self::resetCache();
|
||||
});
|
||||
static::updating(function (self $newsCategory) {
|
||||
self::assertTitleIsUnique($newsCategory->title, $newsCategory->getKey());
|
||||
self::manageFields($newsCategory);
|
||||
});
|
||||
static::updated(function (self $newsCategory) {
|
||||
self::resetCache();
|
||||
});
|
||||
static::deleted(function (self $newsCategory) {
|
||||
self::resetCache();
|
||||
});
|
||||
}
|
||||
|
||||
// * METHODS
|
||||
|
|
@ -100,4 +110,25 @@ class NewsCategory extends Model
|
|||
ToolboxHelper::assertFieldIsUnique($table, 'title', $title, $id);
|
||||
ToolboxHelper::assertFieldIsUnique($table, 'slug', Str::slug($title), $id);
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset all cache elements related to this model.
|
||||
* @return void
|
||||
*/
|
||||
private static function resetCache()
|
||||
{
|
||||
Cache::forget('publishedNewsCategoriesOrderedByOrder');
|
||||
self::getPublishedOrdered();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all published NewsCategories ordered by order.
|
||||
* @return \Illuminate\Database\Eloquent\Collection
|
||||
*/
|
||||
public static function getPublishedOrdered(): \Illuminate\Database\Eloquent\Collection
|
||||
{
|
||||
return Cache::rememberForever('publishedNewsCategoriesOrderedByOrder', function () {
|
||||
return self::query()->where('published', true)->orderBy('order')->get();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ use App\Lib\Helpers\FileStorageHelper;
|
|||
use App\Traits\Models\ActivityLog;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
|
||||
/**
|
||||
* @property string $title The title of the news.
|
||||
|
|
@ -64,15 +65,20 @@ class NewsCorporate extends Model
|
|||
self::makeStatusSense($newsCorporate);
|
||||
$newsCorporate->picture = FileStorageHelper::storeFile($newsCorporate, $newsCorporate->picture, true);
|
||||
});
|
||||
static::created(function (self $newsCorporate) {
|
||||
self::resetCache();
|
||||
});
|
||||
static::updating(function (self $newsCorporate) {
|
||||
self::makeStatusSense($newsCorporate);
|
||||
$newsCorporate->picture = FileStorageHelper::storeFile($newsCorporate, $newsCorporate->picture, true);
|
||||
});
|
||||
static::updated(function (self $newsCorporate) {
|
||||
FileStorageHelper::removeOldFile($newsCorporate, 'picture');
|
||||
self::resetCache();
|
||||
});
|
||||
static::deleted(function (self $newsCorporate) {
|
||||
FileStorageHelper::removeFile($newsCorporate, 'picture');
|
||||
self::resetCache();
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -124,4 +130,29 @@ class NewsCorporate extends Model
|
|||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset all cache elements related to this model.
|
||||
* @return void
|
||||
*/
|
||||
private static function resetCache()
|
||||
{
|
||||
Cache::forget('9publishedNewsCorporateOrderedByUpdatedAt');
|
||||
self::get9PublishedOrderedByUpdatedAt();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get 9 published news corporate ordered by updated_at.
|
||||
* @return \Illuminate\Database\Eloquent\Collection
|
||||
*/
|
||||
public static function get9PublishedOrderedByUpdatedAt(): \Illuminate\Database\Eloquent\Collection
|
||||
{
|
||||
return Cache::rememberForever('9publishedNewsCorporateOrderedByUpdatedAt', function () {
|
||||
return self::query()
|
||||
->where('published', true)
|
||||
->orderByDesc('updated_at')
|
||||
->limit(9)
|
||||
->get();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ use Illuminate\Database\Eloquent\Factories\HasFactory;
|
|||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Support\Str;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
use Uwil\Seo\Laravel\Interfaces\SeoInterface;
|
||||
use Uwil\Seo\Laravel\Traits\SeoTrait;
|
||||
use Uwil\Seo\Laravel\Objects\SeoItem;
|
||||
|
|
@ -58,6 +59,7 @@ class Product extends Model implements SeoInterface
|
|||
'seo_description',
|
||||
'label',
|
||||
'slug',
|
||||
'claim_title',
|
||||
'picture',
|
||||
'picture_alt',
|
||||
'picture_title',
|
||||
|
|
@ -103,6 +105,9 @@ class Product extends Model implements SeoInterface
|
|||
self::assertLabelIsUnique($product->label);
|
||||
self::manageFields($product);
|
||||
});
|
||||
static::created(function (self $product) {
|
||||
self::resetCache();
|
||||
});
|
||||
static::updating(function (self $product) {
|
||||
self::assertLabelIsUnique($product->label, $product->getKey());
|
||||
self::manageFields($product);
|
||||
|
|
@ -111,11 +116,13 @@ class Product extends Model implements SeoInterface
|
|||
FileStorageHelper::removeOldFile($product, 'picture');
|
||||
FileStorageHelper::removeOldFile($product, 'banner');
|
||||
FileStorageHelper::removeOldFile($product, 'packaging');
|
||||
self::resetCache();
|
||||
});
|
||||
static::deleted(function (self $product) {
|
||||
FileStorageHelper::removeFile($product, 'picture');
|
||||
FileStorageHelper::removeFile($product, 'banner');
|
||||
FileStorageHelper::removeFile($product, 'packaging');
|
||||
self::resetCache();
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -188,10 +195,31 @@ class Product extends Model implements SeoInterface
|
|||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset all cache elements related to this model.
|
||||
* @return void
|
||||
*/
|
||||
private static function resetCache()
|
||||
{
|
||||
Cache::forget('publishedDiscoveredProducts');
|
||||
self::getPublishedDiscovered();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all published products with discover === true.
|
||||
* @return \Illuminate\Database\Eloquent\Collection
|
||||
*/
|
||||
public static function getPublishedDiscovered(): \Illuminate\Database\Eloquent\Collection
|
||||
{
|
||||
return Cache::rememberForever('publishedDiscoveredProducts', function () {
|
||||
return self::query()->where('published', true)->where('discover', true)->get();
|
||||
});
|
||||
}
|
||||
|
||||
// * RELATIONSHIPS
|
||||
|
||||
/**
|
||||
* Get all of the ranges that are assigned this product.
|
||||
* Get the range that are assigned this product.
|
||||
*
|
||||
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
|
||||
*/
|
||||
|
|
@ -201,7 +229,7 @@ class Product extends Model implements SeoInterface
|
|||
}
|
||||
|
||||
/**
|
||||
* Get all of the subranges that are assigned this product.
|
||||
* Get the subrange that are assigned this product.
|
||||
*
|
||||
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
|
||||
*/
|
||||
|
|
@ -211,7 +239,7 @@ class Product extends Model implements SeoInterface
|
|||
}
|
||||
|
||||
/**
|
||||
* Get all of the meats that are assigned this product.
|
||||
* Get the meat that are assigned this product.
|
||||
*
|
||||
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
|
||||
*/
|
||||
|
|
@ -221,7 +249,7 @@ class Product extends Model implements SeoInterface
|
|||
}
|
||||
|
||||
/**
|
||||
* Get all of the submeats that are assigned this product.
|
||||
* Get the submeat that are assigned this product.
|
||||
*
|
||||
* @return \Illuminate\Database\Eloquent\Relations\BelongsTo
|
||||
*/
|
||||
|
|
@ -279,4 +307,14 @@ class Product extends Model implements SeoInterface
|
|||
{
|
||||
return $this->morphedByMany(Claim::class, 'productable');
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the videos for the product.
|
||||
*
|
||||
* @return \Illuminate\Database\Eloquent\Relations\HasMany
|
||||
*/
|
||||
public function videos(): \Illuminate\Database\Eloquent\Relations\HasMany
|
||||
{
|
||||
return $this->hasMany(Video::class);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ use App\Lib\Helpers\FileStorageHelper;
|
|||
use App\Traits\Models\ActivityLog;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
|
||||
/**
|
||||
* @property string $title Profession title.
|
||||
|
|
@ -58,14 +59,42 @@ class Profession extends Model
|
|||
static::creating(function (self $profession) {
|
||||
$profession->picture = FileStorageHelper::storeFile($profession, $profession->picture, true);
|
||||
});
|
||||
static::created(function (self $profession) {
|
||||
self::resetCache();
|
||||
});
|
||||
static::updating(function (self $profession) {
|
||||
$profession->picture = FileStorageHelper::storeFile($profession, $profession->picture, true);
|
||||
});
|
||||
static::updated(function (self $profession) {
|
||||
FileStorageHelper::removeOldFile($profession, 'picture');
|
||||
self::resetCache();
|
||||
});
|
||||
static::deleted(function (self $profession) {
|
||||
FileStorageHelper::removeFile($profession, 'picture');
|
||||
self::resetCache();
|
||||
});
|
||||
}
|
||||
|
||||
// * METHODS
|
||||
|
||||
/**
|
||||
* Reset all cache elements related to this model.
|
||||
* @return void
|
||||
*/
|
||||
private static function resetCache()
|
||||
{
|
||||
Cache::forget('5publishedProfessions');
|
||||
self::get5Published();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get 5 published professions.
|
||||
* @return \Illuminate\Database\Eloquent\Collection
|
||||
*/
|
||||
public static function get5Published(): \Illuminate\Database\Eloquent\Collection
|
||||
{
|
||||
return Cache::rememberForever('5publishedProfessions', function () {
|
||||
return self::query()->where('published', true)->take(5)->get();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ use App\Lib\Helpers\ToolboxHelper;
|
|||
use App\Traits\Models\ActivityLog;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
/**
|
||||
|
|
@ -84,6 +85,9 @@ class Range extends Model
|
|||
self::setOrder($model);
|
||||
self::manageFields($model);
|
||||
});
|
||||
static::created(function (self $model) {
|
||||
self::resetCache();
|
||||
});
|
||||
static::updating(function (self $model) {
|
||||
self::assertLabelIsUnique($model->label, $model->getKey());
|
||||
self::manageFields($model);
|
||||
|
|
@ -92,6 +96,7 @@ class Range extends Model
|
|||
FileStorageHelper::removeOldFile($model, 'banner');
|
||||
FileStorageHelper::removeOldFile($model, 'banner_ambiance');
|
||||
FileStorageHelper::removeOldFile($model, 'picture');
|
||||
self::resetCache();
|
||||
});
|
||||
static::deleting(function (self $model) {
|
||||
/** @var \Illuminate\Database\Eloquent\Collection $subranges */
|
||||
|
|
@ -106,6 +111,7 @@ class Range extends Model
|
|||
FileStorageHelper::removeFile($model, 'banner');
|
||||
FileStorageHelper::removeFile($model, 'banner_ambiance');
|
||||
FileStorageHelper::removeFile($model, 'picture');
|
||||
self::resetCache();
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -151,6 +157,57 @@ class Range extends Model
|
|||
$model->order = \intval(self::query()->max('order')) + 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset all cache elements related to this model.
|
||||
* @return void
|
||||
*/
|
||||
private static function resetCache()
|
||||
{
|
||||
Cache::forget('publishedRangesOrderedByOrder');
|
||||
self::getPublishedOrdered();
|
||||
Cache::forget('publishedRangesOrderedBySlug');
|
||||
self::getPublishedOrderedBySlug();
|
||||
Cache::forget('publishedRangesOrderedByOrderWithSubranges');
|
||||
self::getPublishedOrderedWithSubranges();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all published Ranges ordered by order.
|
||||
* @return \Illuminate\Database\Eloquent\Collection
|
||||
*/
|
||||
public static function getPublishedOrdered(): \Illuminate\Database\Eloquent\Collection
|
||||
{
|
||||
return Cache::rememberForever('publishedRangesOrderedByOrder', function () {
|
||||
return self::query()->where('published', true)->orderBy('order')->get();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all published Ranges ordered by slug.
|
||||
* @return \Illuminate\Database\Eloquent\Collection
|
||||
*/
|
||||
public static function getPublishedOrderedBySlug(): \Illuminate\Database\Eloquent\Collection
|
||||
{
|
||||
return Cache::rememberForever('publishedRangesOrderedBySlug', function () {
|
||||
return self::query()->where('published', true)->orderBy('slug')->get();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all published Ranges ordered by order with subranges.
|
||||
* @return \Illuminate\Database\Eloquent\Collection
|
||||
*/
|
||||
public static function getPublishedOrderedWithSubranges(): \Illuminate\Database\Eloquent\Collection
|
||||
{
|
||||
return Cache::rememberForever('publishedRangesOrderedByOrderWithSubranges', function () {
|
||||
return self::query()
|
||||
->where('published', true)
|
||||
->with('subranges')
|
||||
->orderBy('order')
|
||||
->get();
|
||||
});
|
||||
}
|
||||
|
||||
// * RELATIONSHIPS
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ use App\Lib\Helpers\ToolboxHelper;
|
|||
use App\Traits\Models\ActivityLog;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
use Illuminate\Support\Str;
|
||||
use Uwil\Seo\Laravel\Interfaces\SeoInterface;
|
||||
use Uwil\Seo\Laravel\Traits\SeoTrait;
|
||||
|
|
@ -93,6 +94,9 @@ class Recipe extends Model implements SeoInterface
|
|||
self::setHighlightValue($model);
|
||||
self::manageFields($model);
|
||||
});
|
||||
static::created(function (self $model) {
|
||||
self::resetCache();
|
||||
});
|
||||
static::updating(function (self $model) {
|
||||
self::assertTitleIsUnique($model->title, $model->getKey());
|
||||
self::setHighlightValue($model);
|
||||
|
|
@ -100,9 +104,11 @@ class Recipe extends Model implements SeoInterface
|
|||
});
|
||||
static::updated(function (self $model) {
|
||||
FileStorageHelper::removeOldFile($model, 'picture');
|
||||
self::resetCache();
|
||||
});
|
||||
static::deleted(function (self $model) {
|
||||
FileStorageHelper::removeFile($model, 'picture');
|
||||
self::resetCache();
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -187,6 +193,45 @@ class Recipe extends Model implements SeoInterface
|
|||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset all cache elements related to this model.
|
||||
* @return void
|
||||
*/
|
||||
private static function resetCache()
|
||||
{
|
||||
Cache::forget('publishedFirstHighlightedRecipe');
|
||||
self::getFirstHighlighted();
|
||||
Cache::forget('9publishedRecipesWithProducts');
|
||||
self::get9PublishedWithProducts();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get first published and highlighted recipe.
|
||||
* @return \Illuminate\Database\Eloquent\Collection
|
||||
*/
|
||||
public static function getFirstHighlighted(): \Illuminate\Database\Eloquent\Collection
|
||||
{
|
||||
return Cache::rememberForever('publishedFirstHighlightedRecipe', function () {
|
||||
return self::query()->where('published', true)->where('highlight', true)->first();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Get 9 published recipes with products relations.
|
||||
* @return \Illuminate\Database\Eloquent\Collection
|
||||
*/
|
||||
public static function get9PublishedWithProducts(): \Illuminate\Database\Eloquent\Collection
|
||||
{
|
||||
return Cache::rememberForever('9publishedRecipesWithProducts', function () {
|
||||
return self::query()->where('published', true)->with([
|
||||
'products',
|
||||
'products.meat',
|
||||
'products.submeat',
|
||||
'consumptionMoment'
|
||||
])->limit(9)->get();
|
||||
});
|
||||
}
|
||||
|
||||
// * RELATIONSHIPS
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -9,6 +9,7 @@ use App\Traits\Models\ActivityLog;
|
|||
use App\Traits\Models\MiniCrudModel;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
/**
|
||||
|
|
@ -79,6 +80,8 @@ class StaticPage extends Model
|
|||
});
|
||||
static::updated(function (self $model) {
|
||||
FileStorageHelper::removeOldFile($model, 'picture');
|
||||
|
||||
self::resetCache($model->type);
|
||||
});
|
||||
static::deleted(function () {
|
||||
throw new \RuntimeException('Deleting a page is not authorized');
|
||||
|
|
@ -129,4 +132,44 @@ class StaticPage extends Model
|
|||
ToolboxHelper::assertFieldIsUnique($table, 'slug', Str::slug($seo_title), $id);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset all cache elements related to this model.
|
||||
* @return void
|
||||
*/
|
||||
private static function resetCache(StaticPageType $type)
|
||||
{
|
||||
Cache::forget(sprintf('%sStaticPage', $type->name));
|
||||
self::getCachedStaticPage($type);
|
||||
|
||||
// Breeding pages.
|
||||
Cache::forget('breedingStaticPages');
|
||||
self::getCachedBreedingStaticPages();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get cached static page associated to a given type.
|
||||
* @param \App\Enums\StaticPageType $type
|
||||
* @return \App\Models\StaticPage
|
||||
*/
|
||||
public static function getCachedStaticPage(StaticPageType $type)
|
||||
{
|
||||
return Cache::rememberForever(
|
||||
sprintf('%sStaticPage', $type->name),
|
||||
fn() => self::query()->where('type', $type)->first()
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get cached static pages associated to all breeding types.
|
||||
* @param \App\Enums\StaticPageType $type
|
||||
* @return \Illuminate\Database\Eloquent\Collection
|
||||
*/
|
||||
public static function getCachedBreedingStaticPages()
|
||||
{
|
||||
return Cache::rememberForever(
|
||||
'breedingStaticPages',
|
||||
fn() => self::query()->whereIn('type', StaticPageType::getBreedingPages())->get()
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ use App\Lib\Helpers\ToolboxHelper;
|
|||
use App\Traits\Models\ActivityLog;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
/**
|
||||
|
|
@ -70,15 +71,20 @@ class Submeat extends Model
|
|||
self::setOrder($model);
|
||||
self::manageFields($model);
|
||||
});
|
||||
static::created(function (self $model) {
|
||||
self::resetCache();
|
||||
});
|
||||
static::updating(function (self $model) {
|
||||
self::assertLabelIsUnique($model->label, $model->getKey());
|
||||
self::manageFields($model);
|
||||
});
|
||||
static::updated(function (self $model) {
|
||||
FileStorageHelper::removeOldFile($model, 'picture');
|
||||
self::resetCache();
|
||||
});
|
||||
static::deleted(function (self $model) {
|
||||
FileStorageHelper::removeFile($model, 'picture');
|
||||
self::resetCache();
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -122,6 +128,27 @@ class Submeat extends Model
|
|||
$model->order = \intval(self::query()->max('order')) + 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset all cache elements related to this model.
|
||||
* @return void
|
||||
*/
|
||||
private static function resetCache()
|
||||
{
|
||||
Cache::forget('publishedSubmeatsOrderedByOrder');
|
||||
self::getPublishedOrdered();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all published Subeats ordered by order.
|
||||
* @return \Illuminate\Database\Eloquent\Collection
|
||||
*/
|
||||
public static function getPublishedOrdered(): \Illuminate\Database\Eloquent\Collection
|
||||
{
|
||||
return Cache::rememberForever('publishedSubmeatsOrderedByOrder', function () {
|
||||
return self::query()->where('published', true)->orderBy('order')->get();
|
||||
});
|
||||
}
|
||||
|
||||
// * RELATIONSHIPS
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ use App\Lib\Helpers\ToolboxHelper;
|
|||
use App\Traits\Models\ActivityLog;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
/**
|
||||
|
|
@ -69,15 +70,20 @@ class Subrange extends Model
|
|||
self::setOrder($model);
|
||||
self::manageFields($model);
|
||||
});
|
||||
static::created(function (self $model) {
|
||||
self::resetCache();
|
||||
});
|
||||
static::updating(function (self $model) {
|
||||
self::assertLabelIsUnique($model->label, $model->getKey());
|
||||
self::manageFields($model);
|
||||
});
|
||||
static::updated(function (self $model) {
|
||||
FileStorageHelper::removeOldFile($model, 'picture');
|
||||
self::resetCache();
|
||||
});
|
||||
static::deleted(function (self $model) {
|
||||
FileStorageHelper::removeFile($model, 'picture');
|
||||
self::resetCache();
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -121,6 +127,27 @@ class Subrange extends Model
|
|||
$model->order = \intval(self::query()->max('order')) + 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset all cache elements related to this model.
|
||||
* @return void
|
||||
*/
|
||||
private static function resetCache()
|
||||
{
|
||||
Cache::forget('publishedSubrangesOrderedByOrder');
|
||||
self::getPublishedOrdered();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all published Subranges ordered by order.
|
||||
* @return \Illuminate\Database\Eloquent\Collection
|
||||
*/
|
||||
public static function getPublishedOrdered(): \Illuminate\Database\Eloquent\Collection
|
||||
{
|
||||
return Cache::rememberForever('publishedSubrangesOrderedByOrder', function () {
|
||||
return self::query()->where('published', true)->orderBy('order')->get();
|
||||
});
|
||||
}
|
||||
|
||||
// * RELATIONSHIPS
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -7,9 +7,10 @@ use Illuminate\Database\Eloquent\Factories\HasFactory;
|
|||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
/**
|
||||
* @property \App\Models\NewsClub $news_club_id Picto path.
|
||||
* @property boolean $published Picto publish status.
|
||||
* @property string $answer Picto publish status.
|
||||
* @property \App\Models\NewsClub $news_club_id Survey answer news club associated.
|
||||
* @property boolean $order Survey answer order.
|
||||
* @property boolean $published Survey answer status.
|
||||
* @property string $answer Survey answer.
|
||||
* @property-read \Illuminate\Support\Carbon $created_at Created date.
|
||||
* @property-read \Illuminate\Support\Carbon $updated_at Updated date.
|
||||
*/
|
||||
|
|
@ -25,6 +26,7 @@ class SurveysAnswer extends Model
|
|||
*/
|
||||
protected $fillable = [
|
||||
'news_club_id',
|
||||
'order',
|
||||
'published',
|
||||
'answer',
|
||||
];
|
||||
|
|
@ -38,6 +40,31 @@ class SurveysAnswer extends Model
|
|||
'published' => 'boolean',
|
||||
];
|
||||
|
||||
/**
|
||||
* Perform any actions required after the model boots.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected static function booted(): void
|
||||
{
|
||||
static::creating(function (self $model) {
|
||||
self::setOrder($model);
|
||||
});
|
||||
}
|
||||
|
||||
// * METHODS
|
||||
|
||||
/**
|
||||
* Set order after the last element of the list.
|
||||
*
|
||||
* @param self $model
|
||||
* @return void
|
||||
*/
|
||||
private static function setOrder(self $model): void
|
||||
{
|
||||
$model->order = \intval(self::query()->max('order')) + 1;
|
||||
}
|
||||
|
||||
// * RELATIONSHIPS
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -6,6 +6,7 @@ use App\Lib\Helpers\FileStorageHelper;
|
|||
use App\Traits\Models\ActivityLog;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
use Illuminate\Validation\Rule;
|
||||
|
||||
|
|
@ -66,14 +67,19 @@ class Testimonial extends Model
|
|||
self::setOrder($model);
|
||||
self::manageFields($model);
|
||||
});
|
||||
static::created(function (self $model) {
|
||||
self::resetCache();
|
||||
});
|
||||
static::updating(function (self $model) {
|
||||
self::manageFields($model);
|
||||
});
|
||||
static::updated(function (self $model) {
|
||||
FileStorageHelper::removeOldFile($model, 'picture');
|
||||
self::resetCache();
|
||||
});
|
||||
static::deleted(function (self $model) {
|
||||
FileStorageHelper::removeFile($model, 'picture');
|
||||
self::resetCache();
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -125,4 +131,25 @@ class Testimonial extends Model
|
|||
])
|
||||
])->validate();
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset all cache elements related to this model.
|
||||
* @return void
|
||||
*/
|
||||
private static function resetCache()
|
||||
{
|
||||
Cache::forget('publishedTestimonialsOrderedByOrder');
|
||||
self::getPublishedOrdered();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all published Testimonials ordered by order.
|
||||
* @return \Illuminate\Database\Eloquent\Collection
|
||||
*/
|
||||
public static function getPublishedOrdered(): \Illuminate\Database\Eloquent\Collection
|
||||
{
|
||||
return Cache::rememberForever('publishedTestimonialsOrderedByOrder', function () {
|
||||
return self::query()->where('published', true)->orderBy('order')->get();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@ namespace App\Models;
|
|||
use App\Traits\Models\ActivityLog;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
|
||||
/**
|
||||
* @property string $title Video title.
|
||||
|
|
@ -57,6 +58,15 @@ class Video extends Model
|
|||
static::creating(function (self $video) {
|
||||
self::setOrder($video);
|
||||
});
|
||||
static::created(function (self $video) {
|
||||
self::resetCache();
|
||||
});
|
||||
static::updated(function (self $video) {
|
||||
self::resetCache();
|
||||
});
|
||||
static::deleted(function (self $video) {
|
||||
self::resetCache();
|
||||
});
|
||||
}
|
||||
|
||||
// * METHODS
|
||||
|
|
@ -72,6 +82,51 @@ class Video extends Model
|
|||
$model->order = \intval(self::query()->max('order')) + 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reset all cache elements related to this model.
|
||||
* @return void
|
||||
*/
|
||||
private static function resetCache()
|
||||
{
|
||||
Cache::forget('9publishedHomeVideosOrderedByOrderWithProducts');
|
||||
self::get9PublishedHomeVideosOrderedWithProducts();
|
||||
Cache::forget('6publishedVideosOrderedByOrderWithProducts');
|
||||
self::get6PublishedVideosOrderedWithProducts();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get 9 published Videos to display in homepage ordered by order with products relations.
|
||||
* @return \Illuminate\Database\Eloquent\Collection
|
||||
*/
|
||||
public static function get9PublishedHomeVideosOrderedWithProducts(): \Illuminate\Database\Eloquent\Collection
|
||||
{
|
||||
return Cache::rememberForever('9publishedHomeVideosOrderedByOrderWithProducts', function () {
|
||||
return self::query()
|
||||
->where('published', true)
|
||||
->where('is_on_homepage', true)
|
||||
->orderBy('order')
|
||||
->with('product')
|
||||
->limit(9)
|
||||
->get();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Get 9 published Videos to display in homepage ordered by order with products relations.
|
||||
* @return \Illuminate\Database\Eloquent\Collection
|
||||
*/
|
||||
public static function get6PublishedVideosOrderedWithProducts(): \Illuminate\Database\Eloquent\Collection
|
||||
{
|
||||
return Cache::rememberForever('6publishedVideosOrderedByOrderWithProducts', function () {
|
||||
return self::query()
|
||||
->where('published', true)
|
||||
->orderBy('order')
|
||||
->with('product')
|
||||
->take(6)
|
||||
->get();
|
||||
});
|
||||
}
|
||||
|
||||
// * RELATIONSHIPS
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -81,7 +81,7 @@ class ViewServiceProvider extends ServiceProvider
|
|||
if (!$mainMenu) {
|
||||
throw new \RuntimeException('Missing setting ' . SettingsType::mainMenu->label());
|
||||
}
|
||||
return StaticPage::query()->whereIn('type', StaticPageType::getBreedingPages())->get();
|
||||
return StaticPage::getCachedBreedingStaticPages();
|
||||
})());
|
||||
|
||||
// * Inject configuration model
|
||||
|
|
@ -91,7 +91,7 @@ class ViewServiceProvider extends ServiceProvider
|
|||
['name' => 'breederMapComponentSettingModel', 'enum' => SettingsType::breederMapComponent],
|
||||
])->map(function ($array) {
|
||||
View::share($array['name'], (function () use ($array) {
|
||||
return GeneralSetting::query()->where('type', $array['enum'])->first() ?: null;
|
||||
return GeneralSetting::getCachedGeneralSetting($array['enum']) ?: null;
|
||||
})());
|
||||
});
|
||||
|
||||
|
|
@ -100,44 +100,25 @@ class ViewServiceProvider extends ServiceProvider
|
|||
['name' => 'customerModelsCount', 'value' => Customer::query()->count()],
|
||||
['name' => 'firstMeat', 'value' => Meat::query()->first()],
|
||||
['name' => 'firstRange', 'value' => Range::query()->first()],
|
||||
['name' => 'mainMenuRangeModels', 'value' => Range::query()->orderBy('order', 'ASC')
|
||||
->where('published', true)->get()],
|
||||
['name' => 'mainMenuMeatModels', 'value' => Meat::query()->orderBy('order', 'ASC')
|
||||
->where('published', true)->get()],
|
||||
['name' => 'homeStaticPageModel', 'value' => StaticPage::query()
|
||||
->where('type', StaticPageType::home)->first()],
|
||||
['name' => 'storyStaticPageModel', 'value' => StaticPage::query()
|
||||
->where('type', StaticPageType::story)->first()],
|
||||
['name' => 'recruitmentStaticPageModel', 'value' => StaticPage::query()
|
||||
->where('type', StaticPageType::recruitment)->first()],
|
||||
['name' => 'sagaStaticPageModel', 'value' => StaticPage::query()
|
||||
->where('type', StaticPageType::saga)->first()],
|
||||
['name' => 'recipesStaticPageModel', 'value' => StaticPage::query()
|
||||
->where('type', StaticPageType::recipes)->first()],
|
||||
['name' => 'recipeStaticPageModel', 'value' => StaticPage::query()
|
||||
->where('type', StaticPageType::recipe)->first()],
|
||||
['name' => 'productsStaticPageModel', 'value' => StaticPage::query()
|
||||
->where('type', StaticPageType::products)->first()],
|
||||
['name' => 'legalsStaticPageModel', 'value' => StaticPage::query()
|
||||
->where('type', StaticPageType::legals)->first()],
|
||||
['name' => 'confidentialityStaticPageModel', 'value' => StaticPage::query()
|
||||
->where('type', StaticPageType::confidentiality)->first()],
|
||||
['name' => 'sellingStaticPageModel', 'value' => StaticPage::query()
|
||||
->where('type', StaticPageType::selling)->first()],
|
||||
['name' => 'accessibilityStaticPageModel', 'value' => StaticPage::query()
|
||||
->where('type', StaticPageType::accessibility)->first()],
|
||||
['name' => 'productStaticPageModel', 'value' => StaticPage::query()
|
||||
->where('type', StaticPageType::product)->first()],
|
||||
['name' => 'breedingPoultryStaticPageModel', 'value' => StaticPage::query()
|
||||
->where('type', StaticPageType::breedingPoultry)->first()],
|
||||
['name' => 'breedingJobStaticPageModel', 'value' => StaticPage::query()
|
||||
->where('type', StaticPageType::breedingJob)->first()],
|
||||
['name' => 'breedingFoodStaticPageModel', 'value' => StaticPage::query()
|
||||
->where('type', StaticPageType::breedingFood)->first()],
|
||||
['name' => 'breedingHealthStaticPageModel', 'value' => StaticPage::query()
|
||||
->where('type', StaticPageType::breedingHealth)->first()],
|
||||
['name' => 'newsStaticPageModel', 'value' => StaticPage::query()
|
||||
->where('type', StaticPageType::news)->first()],
|
||||
['name' => 'mainMenuRangeModels', 'value' => Range::getPublishedOrdered()],
|
||||
['name' => 'mainMenuMeatModels', 'value' => Meat::getPublishedOrdered()],
|
||||
['name' => 'homeStaticPageModel', 'value' => StaticPage::getCachedStaticPage(StaticPageType::home)],
|
||||
['name' => 'storyStaticPageModel', 'value' => StaticPage::getCachedStaticPage(StaticPageType::story)],
|
||||
['name' => 'recruitmentStaticPageModel', 'value' => StaticPage::getCachedStaticPage(StaticPageType::recruitment)],
|
||||
['name' => 'sagaStaticPageModel', 'value' => StaticPage::getCachedStaticPage(StaticPageType::saga)],
|
||||
['name' => 'recipesStaticPageModel', 'value' => StaticPage::getCachedStaticPage(StaticPageType::recipes)],
|
||||
['name' => 'recipeStaticPageModel', 'value' => StaticPage::getCachedStaticPage(StaticPageType::recipe)],
|
||||
['name' => 'productsStaticPageModel', 'value' => StaticPage::getCachedStaticPage(StaticPageType::products)],
|
||||
['name' => 'legalsStaticPageModel', 'value' => StaticPage::getCachedStaticPage(StaticPageType::legals)],
|
||||
['name' => 'confidentialityStaticPageModel', 'value' => StaticPage::getCachedStaticPage(StaticPageType::confidentiality)],
|
||||
['name' => 'sellingStaticPageModel', 'value' => StaticPage::getCachedStaticPage(StaticPageType::selling)],
|
||||
['name' => 'accessibilityStaticPageModel', 'value' => StaticPage::getCachedStaticPage(StaticPageType::accessibility)],
|
||||
['name' => 'productStaticPageModel', 'value' => StaticPage::getCachedStaticPage(StaticPageType::product)],
|
||||
['name' => 'breedingPoultryStaticPageModel', 'value' => StaticPage::getCachedStaticPage(StaticPageType::breedingPoultry)],
|
||||
['name' => 'breedingJobStaticPageModel', 'value' => StaticPage::getCachedStaticPage(StaticPageType::breedingJob)],
|
||||
['name' => 'breedingFoodStaticPageModel', 'value' => StaticPage::getCachedStaticPage(StaticPageType::breedingFood)],
|
||||
['name' => 'breedingHealthStaticPageModel', 'value' => StaticPage::getCachedStaticPage(StaticPageType::breedingHealth)],
|
||||
['name' => 'newsStaticPageModel', 'value' => StaticPage::getCachedStaticPage(StaticPageType::news)],
|
||||
])->map(function ($array) {
|
||||
View::share($array['name'], (function () use ($array) {
|
||||
return $array['value'] ?: null;
|
||||
|
|
|
|||
|
|
@ -5,7 +5,6 @@ namespace App\Traits\Controllers;
|
|||
use App\Http\Requests\Bo\UpdateChangeOrderRequest;
|
||||
use Illuminate\Support\Arr;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Session;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
trait ChangesModelOrder
|
||||
|
|
@ -46,8 +45,10 @@ trait ChangesModelOrder
|
|||
|
||||
return DB::transaction(function () use ($request, $className, $model) {
|
||||
/** @var \Illuminate\Database\Eloquent\Model|null */
|
||||
$tmp = $className::where('order', $request->direction ? '<' : '>', $model->getOriginal('order'))
|
||||
->orderBy('order', $request->direction ? 'DESC' : 'ASC')->first();
|
||||
$tmp = $className::query()
|
||||
->where('order', $request->direction ? '<' : '>', $model->getOriginal('order'))
|
||||
->orderBy('order', $request->direction ? 'DESC' : 'ASC')
|
||||
->first();
|
||||
|
||||
if (!$tmp) {
|
||||
return back()->with('error', trans('crud.messages.order_not_changed'));
|
||||
|
|
@ -56,9 +57,8 @@ trait ChangesModelOrder
|
|||
$newOrder = $tmp->getOriginal('order');
|
||||
$tmp->update(['order' => $model->getOriginal('order')]);
|
||||
$model->update(['order' => $newOrder]);
|
||||
Session::flash('success', trans('crud.messages.order_changed'));
|
||||
|
||||
return back();
|
||||
return redirect()->back()->with('success', trans('crud.messages.order_changed'));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
|
||||
namespace App\View\Components\fo\breeding;
|
||||
namespace App\View\Components\Fo\Breeding;
|
||||
|
||||
use Illuminate\View\Component;
|
||||
|
||||
|
|
@ -0,0 +1,35 @@
|
|||
<?php
|
||||
|
||||
namespace App\View\Components\Fo\Story;
|
||||
|
||||
use Closure;
|
||||
use Illuminate\Contracts\View\View;
|
||||
use Illuminate\View\Component;
|
||||
use App\Models\StaticPage;
|
||||
use App\Enums\StaticPageType;
|
||||
use App\Models\HistoricalMilestone;
|
||||
|
||||
class HistoricalMilestoneComponent extends Component
|
||||
{
|
||||
public $staticPageModel;
|
||||
public $historicalMilestoneModels;
|
||||
/**
|
||||
* Create a new component instance.
|
||||
*/
|
||||
public function __construct()
|
||||
{
|
||||
$this->staticPageModel = StaticPage::getCachedStaticPage(StaticPageType::story);
|
||||
$this->historicalMilestoneModels = HistoricalMilestone::getPublishedOrderedByYear();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the view / contents that represent the component.
|
||||
*/
|
||||
public function render(): View|Closure|string
|
||||
{
|
||||
return view('components.fo.story.historical-milestone-component', [
|
||||
'staticPageModel' => $this->staticPageModel,
|
||||
'historicalMilestoneModels' => $this->historicalMilestoneModels
|
||||
]);
|
||||
}
|
||||
}
|
||||
35
app/View/Components/Fo/Story/WhoWeAre.php
Normal file
|
|
@ -0,0 +1,35 @@
|
|||
<?php
|
||||
|
||||
namespace App\View\Components\Fo\Story;
|
||||
|
||||
use Closure;
|
||||
use Illuminate\Contracts\View\View;
|
||||
use Illuminate\View\Component;
|
||||
use App\Models\StaticPage;
|
||||
use App\Enums\StaticPageType;
|
||||
|
||||
class WhoWeAre extends Component
|
||||
{
|
||||
public $staticPageModel;
|
||||
public bool $displayButton;
|
||||
|
||||
/**
|
||||
* Create a new component instance.
|
||||
*/
|
||||
public function __construct(bool $displayButton = false)
|
||||
{
|
||||
$this->staticPageModel = StaticPage::getCachedStaticPage(StaticPageType::story);
|
||||
$this->displayButton = $displayButton;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the view / contents that represent the component.
|
||||
*/
|
||||
public function render(): View|Closure|string
|
||||
{
|
||||
// Passe la donnée à la vue
|
||||
return view('components.fo.story.who-we-are', [
|
||||
'staticPageModel' => $this->staticPageModel,
|
||||
]);
|
||||
}
|
||||
}
|
||||
|
|
@ -32,7 +32,8 @@
|
|||
"snipe/banbuilder": "^2.3",
|
||||
"uwil/admin-secure-laravel": "^3.0",
|
||||
"uwil/k8s-laravel": "^1.4",
|
||||
"uwil/seo-laravel": "^3.0"
|
||||
"uwil/seo-laravel": "^3.0",
|
||||
"verschuur/laravel-robotstxt": "^5.1"
|
||||
},
|
||||
"require-dev": {
|
||||
"fakerphp/faker": "^1.9.1",
|
||||
|
|
|
|||
60
composer.lock
generated
|
|
@ -4,7 +4,7 @@
|
|||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "d9d5353325cde56c23904770ba015a27",
|
||||
"content-hash": "4d0e924059843ab5148a0141f93ff3cb",
|
||||
"packages": [
|
||||
{
|
||||
"name": "24slides/laravel-saml2",
|
||||
|
|
@ -7941,6 +7941,64 @@
|
|||
"issues": "https://lab.s-web.fr/ldc-web/projets/seo-laravel/-/issues"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": "verschuur/laravel-robotstxt",
|
||||
"version": "5.1.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/verschuur/laravel-robotstxt.git",
|
||||
"reference": "d2a63f00a58c3de478518e2a59833b0526c15498"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/verschuur/laravel-robotstxt/zipball/d2a63f00a58c3de478518e2a59833b0526c15498",
|
||||
"reference": "d2a63f00a58c3de478518e2a59833b0526c15498",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"laravel/framework": "^9.0|^10.0|^11.0",
|
||||
"php": "^8.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"orchestra/testbench": "^7.0|^8.0|^9.0",
|
||||
"phpstan/phpstan": "^1.4",
|
||||
"phpunit/phpunit": "^9.0|^10.0"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"laravel": {
|
||||
"providers": [
|
||||
"Verschuur\\Laravel\\RobotsTxt\\Providers\\RobotsTxtProvider"
|
||||
]
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Verschuur\\Laravel\\RobotsTxt\\": "src/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Govert Verschuur",
|
||||
"email": "govert.verschuur@gmail.com"
|
||||
}
|
||||
],
|
||||
"description": "Set the robots.txt content dynamically based on the Laravel app environment.",
|
||||
"keywords": [
|
||||
"laravel",
|
||||
"php",
|
||||
"robots.txt"
|
||||
],
|
||||
"support": {
|
||||
"issues": "https://github.com/verschuur/laravel-robotstxt/issues",
|
||||
"source": "https://github.com/verschuur/laravel-robotstxt/tree/5.1.0"
|
||||
},
|
||||
"time": "2024-09-10T19:00:10+00:00"
|
||||
},
|
||||
{
|
||||
"name": "vlucas/phpdotenv",
|
||||
"version": "v5.6.1",
|
||||
|
|
|
|||
27
config/robots-txt.php
Normal file
|
|
@ -0,0 +1,27 @@
|
|||
<?php
|
||||
return [
|
||||
'environments' => [
|
||||
'production' => [
|
||||
'sitemaps' => [
|
||||
'https://www.legaulois.fr/sitemap.xml'
|
||||
],
|
||||
'paths' => [
|
||||
'*' => [
|
||||
'disallow' => [
|
||||
'/bo',
|
||||
'/*.pdf$'
|
||||
]
|
||||
]
|
||||
]
|
||||
],
|
||||
'staging' => [
|
||||
'paths' => [
|
||||
'*' => [
|
||||
'disallow' => [
|
||||
'/'
|
||||
]
|
||||
]
|
||||
]
|
||||
]
|
||||
]
|
||||
];
|
||||
|
|
@ -0,0 +1,36 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::table('products', function (Blueprint $table) {
|
||||
$table->string('picture')->nullable()->change();
|
||||
$table->string('picture_alt')->nullable()->change();
|
||||
$table->string('picture_title')->nullable()->change();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::table('products', function (Blueprint $table) {
|
||||
$table->string('picture')->nullable(false)->change();
|
||||
$table->string('picture_alt')->nullable(false)->change();
|
||||
$table->string('picture_title')->nullable(false)->change();
|
||||
});
|
||||
}
|
||||
};
|
||||
|
|
@ -0,0 +1,128 @@
|
|||
<?php
|
||||
|
||||
use App\Enums\InputType;
|
||||
use App\Enums\StaticPageType;
|
||||
use App\Models\StaticPage;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
// PRODUCT.
|
||||
$staticPage = StaticPage::query()->where('type', StaticPageType::product)->first();
|
||||
$staticPage->data = [
|
||||
"products_title" => [
|
||||
"label" => "Titre des produits",
|
||||
"inputType" => InputType::string->value,
|
||||
"value" => "le titre des autres produits",
|
||||
"validate" => "required|string|between:3,255",
|
||||
'required' => true
|
||||
],
|
||||
"products_text" => [
|
||||
"label" => "Texte des produits",
|
||||
"inputType" => InputType::text->value,
|
||||
"value" => "le texte des autres produits",
|
||||
"validate" => 'required|string',
|
||||
'required' => true
|
||||
],
|
||||
"animation_text_1" => [
|
||||
"label" => "Texte de l'animation 1",
|
||||
"inputType" => InputType::string->value,
|
||||
"value" => "le texte de l'animation 1",
|
||||
"validate" => "required|string|between:3,255",
|
||||
'required' => true
|
||||
],
|
||||
"animation_text_2" => [
|
||||
"label" => "Texte de l'animation 2",
|
||||
"inputType" => InputType::string->value,
|
||||
"value" => "le texte de l'animation 2",
|
||||
"validate" => "required|string|between:3,255",
|
||||
'required' => true
|
||||
],
|
||||
"recipes_title" => [
|
||||
"label" => "Titre des recettes",
|
||||
"inputType" => InputType::string->value,
|
||||
"value" => "le titre des recettes",
|
||||
"validate" => "required|string|between:3,255",
|
||||
'required' => true
|
||||
],
|
||||
"recipes_text" => [
|
||||
"label" => "Texte des recettes",
|
||||
"inputType" => InputType::text->value,
|
||||
"value" => "le texte des recettes",
|
||||
"validate" => 'required|string',
|
||||
'required' => true
|
||||
],
|
||||
];
|
||||
$staticPage->saveQuietly();
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
// PRODUCT.
|
||||
$staticPage = StaticPage::query()->where('type', StaticPageType::product)->first();
|
||||
$staticPage->data = [
|
||||
"claim_title" => [
|
||||
"label" => "Titre des allégations",
|
||||
"inputType" => InputType::string->value,
|
||||
"value" => "le titre des allégations",
|
||||
"validate" => "required|string|between:3,255",
|
||||
'required' => true
|
||||
],
|
||||
"products_title" => [
|
||||
"label" => "Titre des produits",
|
||||
"inputType" => InputType::string->value,
|
||||
"value" => "le titre des autres produits",
|
||||
"validate" => "required|string|between:3,255",
|
||||
'required' => true
|
||||
],
|
||||
"products_text" => [
|
||||
"label" => "Texte des produits",
|
||||
"inputType" => InputType::text->value,
|
||||
"value" => "le texte des autres produits",
|
||||
"validate" => 'required|string',
|
||||
'required' => true
|
||||
],
|
||||
"animation_text_1" => [
|
||||
"label" => "Texte de l'animation 1",
|
||||
"inputType" => InputType::string->value,
|
||||
"value" => "le texte de l'animation 1",
|
||||
"validate" => "required|string|between:3,255",
|
||||
'required' => true
|
||||
],
|
||||
"animation_text_2" => [
|
||||
"label" => "Texte de l'animation 2",
|
||||
"inputType" => InputType::string->value,
|
||||
"value" => "le texte de l'animation 2",
|
||||
"validate" => "required|string|between:3,255",
|
||||
'required' => true
|
||||
],
|
||||
"recipes_title" => [
|
||||
"label" => "Titre des recettes",
|
||||
"inputType" => InputType::string->value,
|
||||
"value" => "le titre des recettes",
|
||||
"validate" => "required|string|between:3,255",
|
||||
'required' => true
|
||||
],
|
||||
"recipes_text" => [
|
||||
"label" => "Texte des recettes",
|
||||
"inputType" => InputType::text->value,
|
||||
"value" => "le texte des recettes",
|
||||
"validate" => 'required|string',
|
||||
'required' => true
|
||||
],
|
||||
];
|
||||
$staticPage->saveQuietly();
|
||||
}
|
||||
};
|
||||
|
|
@ -0,0 +1,28 @@
|
|||
<?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('products', function (Blueprint $table) {
|
||||
$table->string('claim_title')->nullable()->comment('The claim title for a product.')->after('label');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::table('products', function (Blueprint $table) {
|
||||
$table->dropColumn('claim_title');
|
||||
});
|
||||
}
|
||||
};
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
* @return void
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::table('recipes', function (Blueprint $table) {
|
||||
$table->string('tips', 500)->nullable()->change();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
* @return void
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::table('recipes', function (Blueprint $table) {
|
||||
$table->string('tips', 500)->nullable(false)->change();
|
||||
});
|
||||
}
|
||||
};
|
||||
|
|
@ -0,0 +1,37 @@
|
|||
<?php
|
||||
|
||||
use App\Models\SurveysAnswer;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::table('surveys_answers', function (Blueprint $table) {
|
||||
$table->integer('order')->comment('Survey answer order.')->after('news_club_id');
|
||||
});
|
||||
SurveysAnswer::query()->get()->map(function ($surveyAnswerModel) {
|
||||
$surveyAnswerModel->order = \intval(SurveysAnswer::query()->max('order')) + 1;
|
||||
$surveyAnswerModel->saveQuietly();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::table('surveys_answers', function (Blueprint $table) {
|
||||
$table->dropColumn('order');
|
||||
});
|
||||
}
|
||||
};
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
User-agent: *
|
||||
Disallow:
|
||||
BIN
resources/assets/images/legaulois-logo-40ans.png
Normal file
|
After Width: | Height: | Size: 51 KiB |
BIN
resources/assets/images/page-des-40-ans/good-to-be-gaulois.jpg
Normal file
|
After Width: | Height: | Size: 139 KiB |
|
Before Width: | Height: | Size: 70 KiB |
BIN
resources/assets/images/page-des-40-ans/section3/products/1.png
Normal file
|
After Width: | Height: | Size: 19 KiB |
BIN
resources/assets/images/page-des-40-ans/section3/products/2.png
Normal file
|
After Width: | Height: | Size: 13 KiB |
BIN
resources/assets/images/page-des-40-ans/section3/products/3.png
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
resources/assets/images/page-des-40-ans/section3/products/4.png
Normal file
|
After Width: | Height: | Size: 31 KiB |
BIN
resources/assets/images/page-des-40-ans/section3/products/5.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 35 KiB |
|
|
@ -1,25 +0,0 @@
|
|||
<svg width="318" height="160" viewBox="0 0 318 160" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M8.85765 147.969C9.27628 146.818 9.90599 146.071 10.7468 145.725C11.4953 145.423 12.3883 145.461 13.4257 145.838L17.908 147.47C18.9342 147.843 19.6414 148.426 20.0297 149.219C20.4222 150 20.4193 150.938 20.0212 152.032L18.4821 156.26C18.4493 156.351 18.3821 156.377 18.2806 156.34L7.42154 152.388C7.32005 152.351 7.28573 152.287 7.31856 152.197L8.85765 147.969ZM13.1266 148.239C12.5854 148.042 12.1112 148.029 11.7041 148.2C11.2858 148.367 10.9679 148.749 10.7503 149.347L10.1963 150.869L17.1312 153.393L17.6853 151.871C17.87 151.364 17.8696 150.891 17.6841 150.453C17.4987 150.015 17.1354 149.698 16.5941 149.501L13.1266 148.239Z" fill="#0F437E"/>
|
||||
<path d="M23.5952 142.884C23.5565 142.972 23.4877 142.994 23.3889 142.95L12.8131 138.293C12.7142 138.249 12.6842 138.183 12.7229 138.095L15.1895 132.495C15.2331 132.396 15.3043 132.368 15.4031 132.412L17.1657 133.188C17.2646 133.231 17.2922 133.303 17.2487 133.401L15.6816 136.96L17.922 137.946L19.1408 135.179C19.1795 135.091 19.2483 135.069 19.3471 135.112L21.1427 135.903C21.2415 135.947 21.2716 136.012 21.2329 136.1L20.0141 138.868L22.4356 139.934L24.0027 136.376C24.0462 136.277 24.1174 136.25 24.2163 136.293L25.9789 137.069C26.0777 137.113 26.1054 137.184 26.0618 137.283L23.5952 142.884Z" fill="#0F437E"/>
|
||||
<path d="M24.5161 123.953C24.8204 123.733 25.1543 123.508 25.5178 123.278C25.8707 123.042 26.2469 122.853 26.6466 122.709C27.0462 122.566 27.45 122.492 27.858 122.488C28.2715 122.474 28.6858 122.575 29.1007 122.791C29.2178 122.852 29.3559 122.938 29.515 123.048C29.6797 123.147 29.8521 123.271 30.032 123.419C30.2014 123.561 30.3703 123.731 30.5387 123.927C30.702 124.107 30.8461 124.31 30.9711 124.538C31.5385 125.578 31.4893 126.737 30.8235 128.013C30.6459 128.354 30.4231 128.678 30.1549 128.984C29.8866 129.291 29.5842 129.56 29.2475 129.79C28.9057 130.004 28.538 130.164 28.1444 130.271C27.7508 130.377 27.3345 130.396 26.8955 130.33C26.8312 130.323 26.7969 130.285 26.7928 130.215L26.2975 128.09C26.2781 127.971 26.3248 127.907 26.4376 127.899C26.4913 127.9 26.5556 127.906 26.6305 127.918C26.7004 127.914 26.789 127.913 26.8963 127.915C27.202 127.925 27.5307 127.853 27.8822 127.698C28.223 127.537 28.4767 127.297 28.6431 126.978C28.7097 126.85 28.7603 126.714 28.795 126.57C28.8246 126.41 28.8326 126.251 28.8192 126.095C28.7951 125.934 28.7386 125.783 28.6498 125.642C28.5503 125.495 28.4048 125.372 28.2132 125.272C28.0323 125.178 27.8369 125.15 27.6269 125.19C27.4225 125.218 27.2226 125.29 27.0275 125.405C26.8272 125.503 26.6399 125.629 26.4655 125.782C26.2861 125.918 26.1229 126.05 25.9758 126.176C25.6382 126.46 25.2846 126.736 24.9151 127.003C24.5405 127.255 24.1344 127.462 23.6969 127.627C22.7519 127.959 21.8911 127.923 21.1143 127.518C20.6142 127.258 20.2307 126.929 19.9637 126.533C19.7022 126.126 19.5379 125.688 19.4707 125.22C19.3929 124.746 19.4011 124.264 19.4953 123.771C19.5896 123.279 19.7504 122.815 19.9779 122.379C20.6936 121.006 21.9391 120.356 23.7145 120.429C23.8056 120.436 23.8558 120.483 23.8651 120.569L24.114 122.505C24.1182 122.575 24.0744 122.62 23.9829 122.64C23.4449 122.711 23.0189 122.827 22.7049 122.989C22.3802 123.144 22.1346 123.381 21.9682 123.701C21.9238 123.786 21.879 123.898 21.8337 124.036C21.7884 124.175 21.7618 124.317 21.754 124.462C21.7462 124.607 21.7679 124.747 21.8193 124.882C21.86 125.011 21.9549 125.115 22.1039 125.192C22.2848 125.287 22.4804 125.301 22.6909 125.235C22.9069 125.158 23.1261 125.049 23.3486 124.908C23.5659 124.75 23.7754 124.582 23.9771 124.403C24.1787 124.224 24.3584 124.074 24.5161 123.953Z" fill="#0F437E"/>
|
||||
<path d="M33.9423 99.7446C33.8972 99.6836 33.8919 99.6285 33.9264 99.5794L35.2091 97.7528C35.2435 97.7037 35.2971 97.69 35.3698 97.7117L46.6313 101.815C46.7531 101.871 46.7761 101.953 46.7003 102.061L45.521 103.74C45.4797 103.799 45.4261 103.813 45.3602 103.781L42.8945 102.908L41.3842 105.058L43.0535 107.066C43.0986 107.127 43.1039 107.182 43.0695 107.231L41.8799 108.926C41.804 109.034 41.719 109.04 41.6247 108.944L33.9423 99.7446ZM40.7472 102.082L38.078 101.153L39.8886 103.304L40.7472 102.082Z" fill="#0F437E"/>
|
||||
<path d="M44.0479 86.3808C43.9637 86.313 43.9556 86.2371 44.0233 86.153L45.3217 84.5408C45.3894 84.4567 45.4653 84.4485 45.5495 84.5163L54.5496 91.7645C54.6338 91.8323 54.6419 91.9082 54.5742 91.9923L53.321 93.5484C53.2683 93.6139 53.2111 93.6371 53.1493 93.6182L46.8887 91.9505L51.4448 95.6198C51.529 95.6875 51.5371 95.7634 51.4694 95.8476L50.1823 97.4457C50.1221 97.5205 50.05 97.524 49.9658 97.4563L40.9656 90.208C40.8815 90.1402 40.8696 90.069 40.9298 89.9942L42.262 88.34C42.2921 88.3026 42.3419 88.2887 42.4112 88.2983L48.5199 89.9823L44.0479 86.3808Z" fill="#0F437E"/>
|
||||
<path d="M60.3832 85.3556C60.3182 85.4262 60.246 85.425 60.1665 85.3518L51.6623 77.5276C51.5828 77.4544 51.5755 77.3826 51.6405 77.3119L53.0299 75.8018C53.103 75.7223 53.1793 75.7192 53.2588 75.7923L61.763 83.6166C61.8425 83.6897 61.8457 83.766 61.7726 83.8455L60.3832 85.3556Z" fill="#0F437E"/>
|
||||
<path d="M65.662 63.2059C65.7402 63.1314 65.8166 63.1332 65.8911 63.2114L73.8626 71.5778C73.9371 71.656 73.9352 71.7324 73.857 71.8069L72.4366 73.1603C72.4192 73.1768 72.3892 73.1888 72.3466 73.1963C72.2957 73.1951 72.2537 73.1771 72.2205 73.1423L67.6264 68.3206L70.8243 74.5472C70.8479 74.6242 70.838 74.6834 70.7946 74.7248L69.765 75.7057C69.7042 75.7636 69.6446 75.7707 69.5863 75.7268L63.5257 72.0537L68.2068 76.9666C68.2813 77.0448 68.2794 77.1212 68.2012 77.1957L66.7547 78.5739C66.6939 78.6319 66.6262 78.6218 66.5517 78.5436L58.5802 70.1772C58.5057 70.099 58.4989 70.0309 58.5597 69.973L60.3842 68.2346C60.445 68.1767 60.5089 68.1655 60.5759 68.2011L67.1815 71.9765L63.886 65.0472C63.8363 64.9951 63.8419 64.9401 63.9027 64.8821L65.662 63.2059Z" fill="#0F437E"/>
|
||||
<path d="M71.7075 58.0937C71.6798 58.0231 71.689 57.9685 71.7351 57.9301L73.4487 56.5C73.4948 56.4615 73.5501 56.4623 73.6147 56.5022L83.4213 63.3931C83.5243 63.4791 83.5251 63.5643 83.4238 63.6489L81.8483 64.9637C81.793 65.0098 81.7377 65.0091 81.6824 64.9615L79.5288 63.4765L77.5111 65.1604L78.6005 67.5334C78.6282 67.604 78.6191 67.6586 78.573 67.697L76.9837 69.0233C76.8824 69.1079 76.7986 69.0918 76.7325 68.9751L71.7075 58.0937ZM77.6702 62.1204L75.3345 60.5295L76.5232 63.0776L77.6702 62.1204Z" fill="#0F437E"/>
|
||||
<path d="M82.0356 52.5184C81.9484 52.582 81.8729 52.5702 81.8093 52.4829L80.6751 50.9262C80.6115 50.839 80.6234 50.7635 80.7107 50.6999L86.7772 46.2798C86.8645 46.2162 86.94 46.2281 87.0036 46.3154L88.1377 47.872C88.2013 47.9593 88.1895 48.0348 88.1022 48.0984L86.0364 49.6035L91.6118 57.2558C91.6754 57.3431 91.6636 57.4185 91.5763 57.4821L89.9032 58.7011C89.8159 58.7647 89.7405 58.7528 89.6769 58.6656L84.1015 51.0133L82.0356 52.5184Z" fill="#0F437E"/>
|
||||
<path d="M100.981 51.0776C100.899 51.1289 100.83 51.1089 100.772 51.0176L94.596 41.2506C94.5382 41.1593 94.55 41.088 94.6311 41.0367L96.3654 39.94C96.4567 39.8823 96.5312 39.8991 96.5889 39.9903L102.765 49.7574C102.823 49.8486 102.806 49.9231 102.715 49.9809L100.981 51.0776Z" fill="#0F437E"/>
|
||||
<path d="M107.344 33.3239C108.693 32.5901 109.835 32.3789 110.769 32.6904C111.508 32.9441 112.161 33.5928 112.729 34.6365L114.991 38.7953C115.575 39.8706 115.771 40.7821 115.576 41.5298C115.442 42.0123 115.181 42.4616 114.793 42.8777C114.405 43.2939 113.868 43.6882 113.183 44.0609C112.476 44.445 111.843 44.687 111.283 44.7868C110.733 44.8809 110.219 44.853 109.741 44.703C109.372 44.5761 109.021 44.3573 108.688 44.0466C108.36 43.7196 108.046 43.282 107.748 42.7338L105.487 38.575C104.925 37.5419 104.738 36.6328 104.926 35.8478C105.054 35.3547 105.315 34.9054 105.709 34.4998C106.103 34.0942 106.648 33.7023 107.344 33.3239ZM110.91 36.302C110.72 35.9542 110.526 35.6977 110.327 35.5328C110.123 35.3572 109.917 35.2435 109.712 35.1915C109.506 35.1395 109.307 35.1383 109.115 35.1879C108.924 35.2375 108.744 35.3081 108.575 35.3998L108.385 35.503C107.879 35.7782 107.599 36.1288 107.543 36.555C107.493 36.9648 107.608 37.428 107.889 37.9445L109.609 41.1071C109.798 41.455 109.995 41.7167 110.2 41.8922C110.405 42.0678 110.605 42.1844 110.8 42.2421C111 42.2835 111.199 42.2847 111.396 42.2457C111.588 42.1961 111.768 42.1255 111.937 42.0338L112.127 41.9306C112.633 41.6554 112.908 41.3076 112.952 40.8872C113.002 40.4506 112.894 39.9764 112.63 39.4646L110.91 36.302Z" fill="#0F437E"/>
|
||||
<path d="M121.448 26.6325C121.403 26.5344 121.429 26.4628 121.527 26.4175L123.407 25.5503C123.505 25.505 123.577 25.5314 123.622 25.6295L128.463 36.1224C128.509 36.2204 128.482 36.2921 128.384 36.3373L126.57 37.1744C126.494 37.2096 126.432 37.205 126.385 37.1606L121.518 32.8844L123.969 38.1962C124.014 38.2943 123.988 38.366 123.89 38.4112L122.026 39.2709C121.939 39.3111 121.873 39.2822 121.828 39.1842L116.986 28.6913C116.941 28.5932 116.962 28.5241 117.049 28.4838L118.978 27.594C119.021 27.5739 119.072 27.5835 119.13 27.6229L123.854 31.8462L121.448 26.6325Z" fill="#0F437E"/>
|
||||
<path d="M135.705 25.4846C136.079 25.521 136.478 25.5734 136.903 25.6418C137.323 25.6989 137.731 25.806 138.125 25.9631C138.52 26.1201 138.871 26.3323 139.179 26.5996C139.499 26.8626 139.742 27.2125 139.91 27.6494C139.957 27.7727 140.004 27.9282 140.051 28.116C140.108 28.2996 140.156 28.5064 140.192 28.7365C140.225 28.9553 140.24 29.194 140.236 29.4524C140.239 29.6954 140.212 29.9435 140.155 30.1968C139.892 31.3519 139.088 32.1875 137.743 32.7036C137.385 32.8412 137.004 32.9361 136.6 32.9884C136.195 33.0407 135.791 33.0417 135.386 32.9915C134.988 32.9258 134.606 32.8023 134.241 32.6212C133.876 32.44 133.551 32.1792 133.266 31.8387C133.222 31.7912 133.222 31.74 133.265 31.6849L134.301 29.7639C134.365 29.6622 134.442 29.6455 134.533 29.7136C134.572 29.7498 134.616 29.7972 134.664 29.8559C134.72 29.899 134.787 29.9567 134.866 30.0292C135.088 30.2395 135.382 30.403 135.748 30.5195C136.11 30.6249 136.459 30.613 136.795 30.484C136.929 30.4324 137.057 30.364 137.179 30.2788C137.307 30.1781 137.418 30.0649 137.511 29.9391C137.6 29.8022 137.658 29.6515 137.685 29.4869C137.707 29.3112 137.68 29.1225 137.602 28.9209C137.529 28.7304 137.401 28.5804 137.218 28.4709C137.045 28.357 136.848 28.2785 136.626 28.2353C136.411 28.1766 136.187 28.1467 135.955 28.1457C135.73 28.1291 135.521 28.1195 135.327 28.1168C134.886 28.1062 134.439 28.0788 133.985 28.0345C133.537 27.9748 133.096 27.8616 132.659 27.6951C131.73 27.3188 131.109 26.7218 130.795 25.904C130.593 25.3774 130.523 24.8773 130.586 24.4034C130.659 23.9253 130.826 23.4886 131.085 23.0934C131.341 22.6869 131.666 22.3304 132.063 22.024C132.459 21.7175 132.887 21.4761 133.347 21.2998C134.792 20.745 136.156 21.0828 137.438 22.3131C137.501 22.3786 137.508 22.4467 137.458 22.5173L136.362 24.1333C136.319 24.1884 136.257 24.1931 136.175 24.1474C135.725 23.8447 135.328 23.6497 134.986 23.5624C134.64 23.464 134.299 23.4793 133.963 23.6083C133.873 23.6427 133.766 23.6969 133.64 23.7709C133.514 23.8449 133.4 23.9336 133.298 24.0369C133.197 24.1402 133.12 24.2595 133.069 24.3947C133.014 24.5188 133.017 24.6592 133.077 24.816C133.15 25.0065 133.287 25.1466 133.489 25.2363C133.702 25.3217 133.938 25.3852 134.198 25.4268C134.465 25.4528 134.734 25.4654 135.003 25.4648C135.273 25.4641 135.507 25.4707 135.705 25.4846Z" fill="#0F437E"/>
|
||||
<path d="M159.976 25.4065C159.882 25.4289 159.823 25.3875 159.798 25.2825L157.108 14.044C157.083 13.939 157.117 13.8753 157.21 13.8529L163.162 12.4282C163.267 12.4031 163.332 12.443 163.357 12.5481L163.806 14.4212C163.831 14.5262 163.791 14.5913 163.686 14.6164L159.905 15.5215L160.474 17.9023L163.415 17.1983C163.509 17.1759 163.568 17.2173 163.593 17.3223L164.05 19.2304C164.075 19.3355 164.041 19.3991 163.948 19.4215L161.007 20.1255L161.623 22.6988L165.404 21.7937C165.509 21.7685 165.574 21.8085 165.599 21.9135L166.047 23.7866C166.073 23.8916 166.033 23.9567 165.928 23.9818L159.976 25.4065Z" fill="#0F437E"/>
|
||||
<path d="M175.22 10.26C175.201 10.1535 175.246 10.0912 175.352 10.073L177.392 9.72454C177.499 9.70636 177.561 9.7505 177.579 9.85696L179.525 21.248C179.543 21.3545 179.499 21.4168 179.393 21.435L177.423 21.7713C177.34 21.7855 177.282 21.765 177.248 21.7099L173.661 16.3149L174.646 22.0814C174.664 22.1878 174.62 22.2501 174.513 22.2683L172.49 22.6138C172.396 22.63 172.339 22.5848 172.321 22.4784L170.376 11.0873C170.358 10.9808 170.396 10.9195 170.49 10.9034L172.584 10.5458C172.631 10.5377 172.678 10.5602 172.723 10.6133L176.186 15.92L175.22 10.26Z" fill="#0F437E"/>
|
||||
<path d="M206.761 7.20407C206.869 7.20001 206.925 7.25194 206.929 7.35987L207.363 18.9077C207.367 19.0156 207.315 19.0716 207.207 19.0757L205.247 19.1494C205.223 19.1503 205.192 19.1395 205.156 19.1168C205.118 19.0822 205.099 19.0409 205.097 18.9929L204.847 12.3376L203.12 19.1213C203.087 19.1946 203.04 19.2324 202.98 19.2347L201.559 19.2881C201.475 19.2913 201.426 19.2571 201.411 19.1856L199.302 12.4201L199.557 19.2013C199.561 19.3092 199.509 19.3652 199.401 19.3693L197.404 19.4444C197.32 19.4475 197.276 19.3951 197.272 19.2872L196.838 7.73939C196.834 7.63146 196.874 7.57592 196.958 7.57277L199.476 7.47805C199.56 7.4749 199.615 7.50884 199.642 7.57989L202.092 14.7829L204.211 7.40806C204.208 7.33611 204.249 7.29855 204.333 7.2954L206.761 7.20407Z" fill="#0F437E"/>
|
||||
<path d="M214.677 7.3758C214.703 7.30451 214.746 7.26971 214.806 7.2714L217.037 7.33432C217.097 7.33601 217.138 7.37318 217.16 7.44583L219.946 19.103C219.966 19.2356 219.911 19.3001 219.779 19.2964L217.727 19.2385C217.655 19.2365 217.614 19.1993 217.605 19.127L216.974 16.5882L214.347 16.5141L213.592 19.0139C213.566 19.0852 213.523 19.12 213.463 19.1183L211.394 19.0599C211.262 19.0562 211.21 18.9887 211.238 18.8574L214.677 7.3758ZM216.479 14.3414L215.782 11.6026L214.986 14.2993L216.479 14.3414Z" fill="#0F437E"/>
|
||||
<path d="M229.023 15.6447C228.915 15.6345 228.867 15.5757 228.877 15.4682L229.057 13.5507C229.068 13.4431 229.126 13.3944 229.234 13.4046L233.338 13.7914C233.445 13.8015 233.494 13.8604 233.484 13.9679L233.219 16.7814C233.094 18.1075 232.657 19.0306 231.909 19.5507C231.161 20.0708 230.118 20.2678 228.78 20.1417C228.158 20.0831 227.597 19.9639 227.096 19.7841C226.606 19.6054 226.196 19.3558 225.865 19.0352C225.534 18.7028 225.29 18.288 225.132 17.791C224.986 17.2951 224.946 16.7007 225.011 16.0078L225.455 11.2947C225.578 9.99244 226.019 9.08185 226.779 8.56288C227.54 8.04392 228.589 7.8475 229.927 7.97362C230.548 8.03218 231.103 8.15082 231.593 8.32953C232.094 8.50937 232.504 8.76496 232.822 9.09629C233.153 9.4168 233.392 9.82501 233.538 10.3209C233.686 10.8049 233.727 11.3873 233.663 12.0683L233.627 12.4446C233.617 12.5522 233.558 12.6009 233.451 12.5907L231.39 12.3965C231.283 12.3863 231.234 12.3275 231.244 12.22L231.266 11.987C231.318 11.4375 231.198 11.0465 230.906 10.8141C230.616 10.5698 230.244 10.4262 229.79 10.3834L229.575 10.3632C229.001 10.3091 228.567 10.4429 228.271 10.7646C228.124 10.9195 228.016 11.1082 227.947 11.3307C227.878 11.5531 227.829 11.8137 227.801 12.1124L227.466 15.6607C227.429 16.0549 227.447 16.382 227.519 16.6419C227.592 16.8898 227.693 17.0923 227.823 17.2491C227.966 17.3952 228.13 17.5071 228.316 17.5849C228.502 17.6507 228.691 17.6926 228.882 17.7106L229.097 17.7309C229.647 17.7827 230.069 17.6477 230.365 17.326C230.66 17.0043 230.835 16.5568 230.889 15.9833L230.904 15.822L229.023 15.6447Z" fill="#0F437E"/>
|
||||
<path d="M242.743 9.81531C242.779 9.74805 242.826 9.71919 242.885 9.72873L245.089 10.0838C245.148 10.0934 245.184 10.1356 245.196 10.2105L246.429 22.1325C246.432 22.2666 246.368 22.3232 246.237 22.3022L244.212 21.9757C244.14 21.9643 244.105 21.9221 244.104 21.8491L243.812 19.2495L241.218 18.8314L240.141 21.2105C240.106 21.2778 240.059 21.3066 240 21.2971L237.956 20.9678C237.826 20.9468 237.783 20.873 237.828 20.7465L242.743 9.81531ZM243.616 16.9571L243.285 14.1506L242.141 16.7195L243.616 16.9571Z" fill="#0F437E"/>
|
||||
<path d="M257.835 17.2962C258.125 17.5351 258.427 17.8014 258.741 18.0951C259.058 18.3771 259.336 18.6934 259.576 19.0439C259.816 19.3944 259.989 19.7665 260.095 20.1603C260.214 20.5568 260.221 20.9832 260.116 21.4393C260.086 21.568 260.038 21.7232 259.972 21.9049C259.917 22.0894 259.841 22.2874 259.743 22.4989C259.648 22.6986 259.527 22.9048 259.38 23.1172C259.247 23.3207 259.086 23.5115 258.898 23.6899C258.034 24.5013 256.901 24.7461 255.497 24.424C255.123 24.3381 254.754 24.2041 254.389 24.022C254.025 23.8399 253.688 23.615 253.381 23.3473C253.087 23.0707 252.839 22.7553 252.637 22.4011C252.435 22.047 252.311 21.6492 252.265 21.2076C252.255 21.1438 252.283 21.101 252.35 21.0793L254.282 20.0637C254.391 20.015 254.465 20.0441 254.502 20.1511C254.514 20.2033 254.524 20.2671 254.532 20.3427C254.553 20.4092 254.577 20.4946 254.602 20.5989C254.669 20.8974 254.822 21.1972 255.061 21.4982C255.302 21.7876 255.598 21.9725 255.949 22.053C256.089 22.0852 256.234 22.0998 256.382 22.097C256.545 22.0851 256.7 22.0529 256.848 22.0006C256.998 21.9365 257.13 21.8437 257.244 21.7222C257.361 21.5889 257.443 21.417 257.491 21.2065C257.537 21.0076 257.514 20.8116 257.423 20.6183C257.344 20.4277 257.224 20.2525 257.064 20.0926C256.918 19.9237 256.749 19.7741 256.557 19.644C256.38 19.5048 256.212 19.38 256.052 19.2695C255.692 19.0145 255.336 18.742 254.984 18.4519C254.646 18.1528 254.343 17.8123 254.073 17.4304C253.513 16.6 253.331 15.7579 253.526 14.9041C253.653 14.3544 253.874 13.9004 254.19 13.542C254.518 13.1863 254.9 12.9169 255.336 12.7338C255.774 12.5389 256.244 12.425 256.744 12.392C257.244 12.359 257.734 12.3975 258.213 12.5076C259.722 12.8538 260.665 13.895 261.042 15.6314C261.059 15.7213 261.026 15.7816 260.945 15.8123L259.134 16.5417C259.068 16.5634 259.013 16.5324 258.971 16.4488C258.766 15.9463 258.546 15.5634 258.311 15.3002C258.079 15.0252 257.787 14.8475 257.436 14.767C257.343 14.7455 257.223 14.7304 257.077 14.7216C256.932 14.7128 256.788 14.7229 256.646 14.7518C256.503 14.7808 256.374 14.8371 256.256 14.9209C256.141 14.993 256.065 15.111 256.027 15.2747C255.981 15.4735 256.017 15.6664 256.134 15.8534C256.263 16.043 256.424 16.2276 256.617 16.4073C256.824 16.5779 257.039 16.7382 257.263 16.8881C257.488 17.038 257.678 17.1741 257.835 17.2962Z" fill="#0F437E"/>
|
||||
<path d="M267.243 27.3051C267.151 27.2775 267.121 27.212 267.152 27.1086L270.471 16.0395C270.502 15.9361 270.563 15.8981 270.655 15.9257L272.621 16.5151C272.724 16.5461 272.761 16.6134 272.73 16.7168L269.41 27.7858C269.379 27.8893 269.312 27.9255 269.209 27.8945L267.243 27.3051Z" fill="#0F437E"/>
|
||||
<path d="M286.116 21.2908C286.154 21.1896 286.223 21.1579 286.324 21.1957L288.264 21.9193C288.365 21.957 288.396 22.0265 288.359 22.1277L284.319 32.9546C284.281 33.0558 284.212 33.0875 284.111 33.0497L282.239 32.3513C282.16 32.3219 282.12 32.2749 282.118 32.2103L281.726 25.7433L279.681 31.2242C279.644 31.3254 279.574 31.3571 279.473 31.3193L277.55 30.602C277.46 30.5684 277.434 30.5011 277.472 30.3999L281.512 19.573C281.55 19.4718 281.613 19.438 281.703 19.4715L283.693 20.214C283.738 20.2308 283.767 20.2736 283.78 20.3424L284.108 26.6705L286.116 21.2908Z" fill="#0F437E"/>
|
||||
<path d="M305.6 38.9735C305.505 38.9228 305.483 38.8497 305.533 38.7544L308.873 31.4379C308.907 31.3743 308.942 31.3457 308.98 31.352C309.023 31.3477 309.06 31.354 309.092 31.3709L311.683 32.7483C311.736 32.7765 311.764 32.8121 311.769 32.8552C311.773 32.8982 311.767 32.9357 311.75 32.9674L307.568 39.836C307.517 39.9314 307.444 39.9537 307.348 39.903L305.6 38.9735ZM306.284 39.9488C306.687 40.1629 306.95 40.4728 307.074 40.8785C307.209 41.2899 307.172 41.6916 306.964 42.0836C306.755 42.4756 306.44 42.7362 306.018 42.8652C305.607 42.9998 305.2 42.9601 304.797 42.746C304.416 42.5432 304.166 42.2336 304.047 41.8173C303.929 41.401 303.974 40.9968 304.182 40.6048C304.391 40.2128 304.698 39.9547 305.104 39.8307C305.509 39.7066 305.903 39.746 306.284 39.9488Z" fill="#0F437E"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 19 KiB |
|
After Width: | Height: | Size: 27 KiB |
BIN
resources/assets/images/page-des-40-ans/section5/40ans-guess.jpg
Normal file
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 80 KiB |
|
Before Width: | Height: | Size: 249 KiB |
|
Before Width: | Height: | Size: 75 KiB |
|
Before Width: | Height: | Size: 65 KiB |
50
resources/lang/de.json
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
{
|
||||
"homepage": "startseite",
|
||||
"40years.more-gifts-to-win": "Noch mehr Geschenke zu gewinnen",
|
||||
"40years.collect-points": "Sammeln Sie Punkte und wählen Sie Ihre Geschenke in unserem Shop aus!",
|
||||
"40years.1euro-spent": "1€ ausgegeben",
|
||||
"40years.1point-collected": "1 Punkt gesammelt",
|
||||
"40years.2-levels": "2 Stufen",
|
||||
"40years.many-gifts": "zahlreiche Geschenke",
|
||||
"40years.discover-our-store": "Entdecken Sie unseren Shop",
|
||||
"40years.find-the-golden-magnets": "Finden Sie die goldenen Magneten",
|
||||
"40years.win-a-surprise": "und gewinnen Sie eine Überraschung!",
|
||||
"40years.hide-golden-magnet": "Zu seinem 40-jährigen Jubiläum hat Le Gaulois 94 goldene Magneten",
|
||||
"40years.in-his-panes-cases": "in seinen Schachteln von panierten Produkten versteckt!",
|
||||
"40years.i-discover": "Ich entdecke",
|
||||
"40years.a-golden-magnet": "einen goldenen Magnet",
|
||||
"40years.i-win": "Ich gewinne",
|
||||
"40years.a-collector-map": "eine Sammlerkarte von Frankreich, die von einem jungen französischen Künstler entworfen wurde, und eine komplette Sammlung goldener Magnete!",
|
||||
"40years.happy-searching": "Viel Spaß beim Suchen!",
|
||||
"40years.play-with-us": "Spielen Sie mit uns!",
|
||||
"40years.more-gifts": "Noch mehr Geschenke!",
|
||||
"40years.banner": "Seit 40 Jahren verpflichtet sich Le Gaulois, Produkte anzubieten, die zu <strong>100% aus Frankreich stammen</strong> mit <strong>Geflügel, das in unserem Land geboren, aufgezogen und verarbeitet wurde.</strong> <br><strong>40 Jahre Geselligkeit und Freude \"à la française\", die wir mit Ihnen teilen möchten!</strong><br> Entdecken Sie in diesem festlichen Jahr <strong>unsere Spiele und Überraschungen.</strong>",
|
||||
"40years.game-title": "40 Jahre!",
|
||||
"40years.game-subtitle": "Das Jubiläum aller Gaulois",
|
||||
"40years.visit-your-store": "Finden Sie unsere Produkte in den Geschäften und haben Sie die Chance, tolle Geschenke zu gewinnen!",
|
||||
"40years.dream-stays": "Traumaufenthalte",
|
||||
"40years.dream-stays-subtitle": "im Wert von 4.000 €",
|
||||
"40years.camera": "Kameras",
|
||||
"40years.discount-title": "Tausende",
|
||||
"40years.discount-subtitle": "von Rabattgutscheinen",
|
||||
"40years.how-to": "Wie wird",
|
||||
"40years.play": "gespielt?",
|
||||
"40years.bearing-products-top": "Zahlreiche Produkte,",
|
||||
"40years.bearing-products-bottom": "die Angebote tragen",
|
||||
"40years.to-participate": "Um teilzunehmen, kaufen Sie eines unserer Produkte, das den Aufkleber trägt.",
|
||||
"40years.see-you-in-store": "Wir sehen uns im Geschäft!",
|
||||
"40years.i-participate": "Ich nehme am Spiel teil",
|
||||
"40years.breadcrumb": "40 Jahre! Das Jubiläum aller Gaulois",
|
||||
"40years.animations": "Animationen in den Geschäften!",
|
||||
"40years.highlight": "Highlights",
|
||||
"40years.highlight-date": "vom 2. September bis zum 30. November",
|
||||
"40years.who-are-we.tagline.alt": "Logo Le Gaulois mit dem Slogan \"C'est bon d'être Gaulois\" (Es ist gut, Gallier zu sein) mit einem Holztisch und -stuhl im Hintergrund",
|
||||
"40years.who-are-we.tagline.title": "Logo Le Gaulois mit dem Slogan \"C'est bon d'être Gaulois\"",
|
||||
"40years.who-are-we.title": "Wer sind wir?",
|
||||
"40years.who-are-we.content1": "<strong>Gemeinsame Mahlzeiten sind uns heilig!</strong> Es sind die wichtigen Momente im Leben, in denen man mit der Familie, dem Partner oder Freunden zusammenkommt. Bei Tisch wird immer viel geredet, werden angeregte Gespräche und Debatten über Gott und die Welt geführt... nicht immer ist alles fundiert, aber jeder nimmt teil! ",
|
||||
"40years.who-are-we.content2": "Wir sind stolz darauf, zur Verbreitung unserer traditionellen Esskultur und Lebensart und zu diesem einzigartigen Genuss des Lebens und guter Küche beizutragen, dem <strong>“ Französischen Savoir-vivre! ”</strong>",
|
||||
"40years.who-are-we.h3-title1": "Le Gaulois steht für die französische Lebensfreude",
|
||||
"40years.who-are-we.content3": "Le Gaulois verpflichtet sich, dem Verbraucher höchstes Savoir-faire im Bereich Geflügelprodukte anzubieten. Ihr Genuss ist uns wichtig, deshalb garantieren wir Ihnen eine hervorragende geschmackliche Qualität, die der französischen Küche würdig ist.",
|
||||
"40years.who-are-we.h3-title2": "Le Gaulois, eine Marke à la française",
|
||||
"40years.who-are-we.content4": "Le Gaulois bietet hochwertige Produkte für eine ausgewogene Ernährung. Da Le Gaulois Geflügel verwendet, das in Frankreich geboren, gehalten und verarbeitet ist, sind die Produkte zu 100 % aus französicher Herkunft. Eine Marke, die die Freude an gutem Essen und geselligem Beisammensein wieder aufleben lässt!"
|
||||
}
|
||||
|
|
@ -50,5 +50,53 @@
|
|||
"Verify Your Email Address": "Verify Your Email Address",
|
||||
"Whoops!": "Whoops!",
|
||||
"You are logged in!": "You are logged in!",
|
||||
"You are receiving this email because we received a password reset request for your account.": "You are receiving this email because we received a password reset request for your account."
|
||||
}
|
||||
"You are receiving this email because we received a password reset request for your account.": "You are receiving this email because we received a password reset request for your account.",
|
||||
"homepage": "homepage",
|
||||
"40years.more-gifts-to-win": "Even more gifts to win",
|
||||
"40years.collect-points": "Collect points and choose your gifts in our store!",
|
||||
"40years.1euro-spent": "1€ spent",
|
||||
"40years.1point-collected": "1 point collected",
|
||||
"40years.2-levels": "2 levels",
|
||||
"40years.many-gifts": "Many gifts",
|
||||
"40years.discover-our-store": "Discover our store",
|
||||
"40years.find-the-golden-magnets": "Find the golden magnets",
|
||||
"40years.win-a-surprise": "and win a surprise!",
|
||||
"40years.hide-golden-magnet": "For his 40th birthday, Le Gaulois hid 94 golden magnets",
|
||||
"40years.in-his-panes-cases": "in his Panés cases",
|
||||
"40years.i-discover": "I discovered",
|
||||
"40years.a-golden-magnet": "a golden magnet",
|
||||
"40years.i-win": "I won",
|
||||
"40years.a-collector-map": "a 40th anniversary collector's card of France created by a young French artist and a complete collection of golden magnets!",
|
||||
"40years.happy-searching": "Happy searching everyone!",
|
||||
"40years.play-with-us": "Play with us!",
|
||||
"40years.more-gifts": "Even more gifts!",
|
||||
"40years.banner": "For 40 years, Le Gaulois has been committed to offering products <strong>100% of French origin</strong> with <strong>poultry born, raised and prepared</strong> in our territory. <br><strong>40 years of French conviviality to share with you!</strong><br> During this festive year, discover <strong>our games and our surprises.</strong>",
|
||||
"40years.game-title": "40 years!",
|
||||
"40years.game-subtitle": "The birthday of all our Gaulois",
|
||||
"40years.visit-your-store": "Visit your local store for a chance to win exceptional gifts!",
|
||||
"40years.dream-stays": "Dream stays",
|
||||
"40years.dream-stays-subtitle": "worth €4,000",
|
||||
"40years.camera": "Cameras",
|
||||
"40years.discount-title": "Thousands",
|
||||
"40years.discount-subtitle": "of discount vouchers",
|
||||
"40years.how-to": "How to",
|
||||
"40years.play": "play?",
|
||||
"40years.bearing-products-top": "Many",
|
||||
"40years.bearing-products-bottom": "bearing products",
|
||||
"40years.to-participate": "To participate, purchase one of our products bearing the sticker.",
|
||||
"40years.see-you-in-store": "See you in store!",
|
||||
"40years.i-participate": "I participate",
|
||||
"40years.breadcrumb": "40 years! The birthday of all our Gaulois",
|
||||
"40years.animations": "In-store events!",
|
||||
"40years.highlight": "Highlight",
|
||||
"40years.highlight-date": "from September 2 to November 30",
|
||||
"40years.who-are-we.tagline.alt": "Le Gaulois logo with the slogan \"C'est bon d'être Gaulois\" with a wooden table and chair in the background",
|
||||
"40years.who-are-we.tagline.title": "Le Gaulois logo with the slogan \"C'est bon d'être Gaulois\"",
|
||||
"40years.who-are-we.title": "About us",
|
||||
"40years.who-are-we.content1": "<strong>Where we come from, meals are sacred!</strong> There is a time for conviviality, whether spent as a family, a couple, or with friends. Meals are an opportunity to talk, talk a lot, and have great debates - not always justified, but always lively!",
|
||||
"40years.who-are-we.content2": "Here, we take pride in sharing values, a way of life, a true culinary culture, and a pleasure in eating and living that is unique in the world: <strong>“ The French way of good living! ”</strong>",
|
||||
"40years.who-are-we.h3-title1": "Le Gaulois, a brand that promotes good living",
|
||||
"40years.who-are-we.content3": "Le Gaulois is committed to offering consumers the very best in poultry expertise. Your satisfaction is our number one priority, this is is why we guarantee you a top-quality gourmet experience, so you can eat well the French way.",
|
||||
"40years.who-are-we.h3-title2": "Le Gaulois, a French brand",
|
||||
"40years.who-are-we.content4": "Le Gaulois offers quality products for a balanced diet. With poultry born, bred, and prepared in France, Le Gaulois guarantees 100% French products. A brand that fosters a taste for good food and conviviality!"
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,13 +17,13 @@ return [
|
|||
'approach' => 'approach|approaches',
|
||||
'meat' => 'meat',
|
||||
'submeat' => 'submeat',
|
||||
'label' => 'label',
|
||||
'label' => 'Certification badge',
|
||||
'demarche' => 'demarche',
|
||||
'consumption_moment' => 'consumption moment',
|
||||
'video' => 'video',
|
||||
'product' => 'product',
|
||||
'recipe' => 'recipe',
|
||||
'product_type' => 'product type|product types',
|
||||
'product_type' => 'Promotional message|Promotional messages',
|
||||
'claim' => 'claim',
|
||||
'historical_milestone' => 'historical milestone|historical milestones',
|
||||
'offer' => 'offer',
|
||||
|
|
|
|||
|
|
@ -247,6 +247,7 @@ return [
|
|||
'catchline' => 'catchline|catchlines',
|
||||
'category' => 'catégorie',
|
||||
'claim' => 'claim',
|
||||
'claim_title' => 'claims title',
|
||||
'class' => 'class',
|
||||
'color_block' => 'color block',
|
||||
'color' => 'color',
|
||||
|
|
|
|||
|
|
@ -50,5 +50,53 @@
|
|||
"Verify Your Email Address": "Vérifiez votre adresse e-mail",
|
||||
"Whoops!": "Oups !",
|
||||
"You are logged in!": "Vous êtes connecté·e !",
|
||||
"You are receiving this email because we received a password reset request for your account.": "Vous recevez cet e-mail car nous avons reçu une demande de réinitialisation de mot de passe pour votre compte."
|
||||
"You are receiving this email because we received a password reset request for your account.": "Vous recevez cet e-mail car nous avons reçu une demande de réinitialisation de mot de passe pour votre compte.",
|
||||
"homepage": "accueil",
|
||||
"40years.more-gifts-to-win": "Encore + de cadeaux à gagner",
|
||||
"40years.collect-points": "Collectez des points et choisissez vos cadeaux dans notre boutique !",
|
||||
"40years.1euro-spent": "1€ dépensé",
|
||||
"40years.1point-collected": "1 point collecté",
|
||||
"40years.2-levels": "2 paliers",
|
||||
"40years.many-gifts": "de nombreux cadeaux",
|
||||
"40years.discover-our-store": "Découvrez notre boutique",
|
||||
"40years.find-the-golden-magnets": "Trouvez les magnets dorés",
|
||||
"40years.win-a-surprise": "et remportez une surprise !",
|
||||
"40years.hide-golden-magnet": "Pour ses 40 ans, Le Gaulois a caché 94 magnets dorés",
|
||||
"40years.in-his-panes-cases": "dans ses étuis de Panés",
|
||||
"40years.i-discover": "Je découvre",
|
||||
"40years.a-golden-magnet": "un Magnet doré",
|
||||
"40years.i-win": "Je gagne",
|
||||
"40years.a-collector-map": "une carte de France collector 40 ans créée par un jeune artiste français et une collection complète de magnets dorés !",
|
||||
"40years.happy-searching": "Bonne recherche à tous !",
|
||||
"40years.play-with-us": "Jouez avec nous !",
|
||||
"40years.more-gifts": "Encore + de cadeaux !",
|
||||
"40years.banner": "Depuis 40 ans, Le Gaulois s'engage à proposer des produits <strong>100 % origine France</strong> avec des <strong>volailles nées, élevées et préparées</strong> sur notre territoire. <br><strong>40 ans de convivialité et de plaisir à la française, à partager avec vous !</strong><br> Pendant cette année festive, découvrez <strong>nos jeux et nos surprises.</strong>",
|
||||
"40years.game-title": "Le jeu des 40 ans",
|
||||
"40years.game-subtitle": "100% gagnant",
|
||||
"40years.visit-your-store": "Rendez-vous en magasin, et tentez de remporter des cadeaux exceptionnels !",
|
||||
"40years.dream-stays": "Séjours de rêve",
|
||||
"40years.dream-stays-subtitle": "d'une valeur de 4000€",
|
||||
"40years.camera": "Appareils photos",
|
||||
"40years.discount-title": "Des<br> milliers",
|
||||
"40years.discount-subtitle": "de bons de réduction",
|
||||
"40years.how-to": "Comment",
|
||||
"40years.play": "jouer ?",
|
||||
"40years.bearing-products-top": "De nombreux",
|
||||
"40years.bearing-products-bottom": "produits porteurs",
|
||||
"40years.to-participate": "Pour participer, achetez un de nos produits porteurs du sticker.",
|
||||
"40years.see-you-in-store": "Rendez-vous en magasin !",
|
||||
"40years.i-participate": "Je participe",
|
||||
"40years.breadcrumb": "40 ans ! L'anniversaire de tous les Gaulois",
|
||||
"40years.animations": "Des animations en magasin\u00A0!",
|
||||
"40years.highlight": "Temps fort",
|
||||
"40years.highlight-date": "du 2 septembre au 30 novembre",
|
||||
"40years.who-are-we.tagline.alt": "Logo Le Gaulois avec le slogan \"C'est bon d'être Gaulois\" avec en fond une table et une chaise en bois",
|
||||
"40years.who-are-we.tagline.title": "Logo Le Gaulois avec le slogan \"C'est bon d'être Gaulois\"",
|
||||
"40years.who-are-we.title": "Qui sommes-nous ?",
|
||||
"40years.who-are-we.content1": "<strong>En France, le repas c'est sacré !</strong> C'est le moment de convivialité qui compte le plus, qu'on soit en famille, en couple ou entre amis. A table, c'est l'occasion de parler, beaucoup parler, d'avoir de grands débats, pas toujours justifiés, mais tous animés!",
|
||||
"40years.who-are-we.content2": "Nous, les français, sommes fiers de partager des valeurs, un savoir-vivre, une vraie culture culinaire, un bonheur de manger et de vivre unique au monde : <strong>“ Le bon vivre à la française ! ”</strong>",
|
||||
"40years.who-are-we.h3-title1": "Le Gaulois, une marque qui véhicule le bon vivre",
|
||||
"40years.who-are-we.content3": "Le Gaulois s'engage à offrir à ses consommateur un savoir-faire volailler d'excellence. Car votre plaisir est notre priorité, nous vous engageons une qualité pleine de gourmandise pour bien manger à la française.",
|
||||
"40years.who-are-we.h3-title2": "Le Gaulois, une marque à la française",
|
||||
"40years.who-are-we.content4": "Le Gaulois propose des produits bons pour la santé pour une alimentation équilibrée. Avec une volaille née, élevée et préparée en France. Le Gaulois offre des produits 100% Français. Une marque qui redonne goût aux bonnes choses et à la convivialité."
|
||||
}
|
||||
|
|
|
|||
|
|
@ -17,13 +17,13 @@ return [
|
|||
'approach' => 'approche|approches',
|
||||
'meat' => 'viande',
|
||||
'submeat' => 'sous-viande',
|
||||
'label' => 'label',
|
||||
'label' => 'Badge de certification',
|
||||
'demarche' => 'démarche',
|
||||
'consumption_moment' => 'moment de consommation|moments de consommation',
|
||||
'video' => 'vidéo',
|
||||
'product' => 'produit',
|
||||
'recipe' => 'recette',
|
||||
'product_type' => 'type de produit|types de produit',
|
||||
'product_type' => 'Message promotionnel|Messages promotionnel',
|
||||
'claim' => 'allégations',
|
||||
'historical_milestone' => 'jalon historique|jalons historique',
|
||||
'offer' => 'offre',
|
||||
|
|
|
|||
|
|
@ -248,6 +248,7 @@ return [
|
|||
'catchline' => 'phrase d\'accroche|phrases d\'accroche',
|
||||
'category' => 'catégorie',
|
||||
'claim' => 'allégation',
|
||||
'claim_title' => 'titre des allégations',
|
||||
'class' => 'classe',
|
||||
'color_block' => 'couleur du block',
|
||||
'color' => 'couleur',
|
||||
|
|
|
|||
50
resources/lang/nl.json
Normal file
|
|
@ -0,0 +1,50 @@
|
|||
{
|
||||
"homepage": "startpagina",
|
||||
"40years.more-gifts-to-win": "Nog meer geschenken te winnen",
|
||||
"40years.collect-points": "Verzamel punten en kies uw geschenk in onze winkel!",
|
||||
"40years.1euro-spent": "1€ besteed",
|
||||
"40years.1point-collected": "1 verzameld punt",
|
||||
"40years.2-levels": "2 niveaus",
|
||||
"40years.many-gifts": "talloze geschenken",
|
||||
"40years.discover-our-store": "Ontdek onze winkel",
|
||||
"40years.find-the-golden-magnets": "Vind de gouden magneten",
|
||||
"40years.win-a-surprise": "en win een verrassing!",
|
||||
"40years.hide-golden-magnet": "Voor zijn 40e verjaardag verborg Le Gaulois 94 gouden magneten",
|
||||
"40years.in-his-panes-cases": "in zijn verpakkingen met gepaneerde producten",
|
||||
"40years.i-discover": "Ik ontdek",
|
||||
"40years.a-golden-magnet": "een gouden magneet",
|
||||
"40years.i-win": "Ik won",
|
||||
"40years.a-collector-map": "een verzamelkaart van Frankrijk collectie 40-jaar, ontworpen door een jonge Franse kunstenaar, en een volledige verzameling gouden magneten!",
|
||||
"40years.happy-searching": "Veel zoekplezier aan allen!",
|
||||
"40years.play-with-us": "Speel met ons!",
|
||||
"40years.more-gifts": "nog meer geschenken!",
|
||||
"40years.banner": "Sinds 40 jaar zet Le Gaulois zich in om producten aan te bieden van <strong>100% Franse origine,</strong><strong>gevogelte geboren, gekweekt en bereidt</strong> op ons grondgebied. <br><strong>40 jaar Franse gezelligheid en gebruiksgemak, om met u te delen!</strong><br> Ontdek tijdens dit feestjaar <strong>onze spelen en verrassingen.</strong>",
|
||||
"40years.game-title": "40 jaar!",
|
||||
"40years.game-subtitle": "De verjaardag van alle Gaulois",
|
||||
"40years.visit-your-store": "Bezoek de winkel en probeer uitzonderlijke geschenken te winnen!",
|
||||
"40years.dream-stays": "Droomverblijven",
|
||||
"40years.dream-stays-subtitle": "ter waarde van € 4.000",
|
||||
"40years.camera": "Fototoestellen",
|
||||
"40years.discount-title": "Duizenden",
|
||||
"40years.discount-subtitle": "kortingsbonnen",
|
||||
"40years.how-to": "Hoe te",
|
||||
"40years.play": "spelen?",
|
||||
"40years.bearing-products-top": "Veel",
|
||||
"40years.bearing-products-bottom": "deelnemende producten",
|
||||
"40years.to-participate": "Om deel te nemen, koopt u een van onze producten met de sticker.",
|
||||
"40years.see-you-in-store": "Tot ziens in de winkel!",
|
||||
"40years.i-participate": "Ik neem deel",
|
||||
"40years.breadcrumb": "40 jaar! De verjaardag van alle Gaulois",
|
||||
"40years.animations": "Animaties in de winkel!",
|
||||
"40years.highlight": "Hoogtepunt",
|
||||
"40years.highlight-date": "van 2 september tot 30 november",
|
||||
"40years.who-are-we.tagline.alt": "Le Gaulois logo met de slogan \"C'est bon d'être Gaulois\" met een houten tafel en stoel op de achtergrond",
|
||||
"40years.who-are-we.tagline.title": "Le Gaulois-logo met de slogan \"C'est bon d'être Gaulois\"",
|
||||
"40years.who-are-we.title": "Wie zijn we?",
|
||||
"40years.who-are-we.content1": "<strong>Voor ons is eten heilig!</strong> Het is het belangrijkste moment van gezelligheid, of je nu met familie, met z'n tweeën of met vrienden bent. Aan tafel kan je praten, veel praten, geweldige debatten voeren, niet altijd terecht, maar wel levendig!",
|
||||
"40years.who-are-we.content2": "Hier delen we met trots onze waarden, onze savoir-vivre, onze eetcultuur en ons plezier om te eten en leven, dat uniek is in de wereld: <strong>“ Het goede Franse leven! ”</strong>",
|
||||
"40years.who-are-we.h3-title1": "Le Gaulois, een merk dat het goede leven uitdraagt ",
|
||||
"40years.who-are-we.content3": "Le Gaulois doet er alles aan om zijn klanten het allerbeste te bieden als het gaat om gevogelte. Omdat jouw genot onze prioriteit is, kunnen we je gastronomische kwaliteit garanderen, zodat je lekker op z'n Frans kunt eten.",
|
||||
"40years.who-are-we.h3-title2": "Le Gaulois, een Frans merk",
|
||||
"40years.who-are-we.content4": "Le Gaulois biedt kwaliteitsproducten aan voor een evenwichtige voeding. Met gevogelte dat geboren, gekweekt en bereid is in Frankrijk, biedt Le Gaulois 100% Franse producten. Een merk dat je zin geeft in goede dingen en gezelligheid!"
|
||||
}
|
||||
|
|
@ -7,7 +7,7 @@ body {
|
|||
flex-direction: column;
|
||||
|
||||
// * HEADER
|
||||
> header {
|
||||
>header {
|
||||
position: fixed;
|
||||
z-index: 1020;
|
||||
top: 0;
|
||||
|
|
@ -154,7 +154,7 @@ body {
|
|||
}
|
||||
}
|
||||
|
||||
.nav-link:hover{
|
||||
.nav-link:hover {
|
||||
overflow: visible;
|
||||
|
||||
&::before {
|
||||
|
|
@ -180,6 +180,7 @@ body {
|
|||
#main-nav,
|
||||
// * Mobile Offcanvas Nav
|
||||
#offcanvas-main-menu {
|
||||
|
||||
// * Center vertical menu link
|
||||
.nav-item {
|
||||
display: flex;
|
||||
|
|
@ -200,7 +201,7 @@ body {
|
|||
}
|
||||
}
|
||||
|
||||
.nav-link:hover{
|
||||
.nav-link:hover {
|
||||
overflow: visible;
|
||||
|
||||
&::before {
|
||||
|
|
@ -260,7 +261,7 @@ body {
|
|||
@include rfs(30rem, min-width);
|
||||
}
|
||||
|
||||
+ label {
|
||||
+label {
|
||||
height: 2rem;
|
||||
padding: 0.5rem 0.25rem;
|
||||
line-height: 1.2;
|
||||
|
|
@ -272,6 +273,10 @@ body {
|
|||
#menu-lang-list {
|
||||
display: none;
|
||||
|
||||
.dropdown-menu {
|
||||
min-width: fit-content;
|
||||
}
|
||||
|
||||
@include media-breakpoint-up(lg) {
|
||||
display: list-item;
|
||||
}
|
||||
|
|
@ -279,25 +284,29 @@ body {
|
|||
}
|
||||
|
||||
/** For home page usage */
|
||||
> .no-offset {
|
||||
>.no-offset {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
> main {
|
||||
>main {
|
||||
flex-grow: 1;
|
||||
flex-shrink: 0;
|
||||
margin-top: $top-menu-offset;
|
||||
}
|
||||
|
||||
// * FOOTER
|
||||
> footer {
|
||||
>footer {
|
||||
position: relative;
|
||||
flex-grow: 0;
|
||||
flex-shrink: 1;
|
||||
|
||||
.col-logo{
|
||||
height: calc(fit-content - 3rem);
|
||||
}
|
||||
|
||||
#footer-logo {
|
||||
position: relative;
|
||||
top: -2rem;
|
||||
top: -3rem;
|
||||
width: 17.6875rem;
|
||||
object-fit: contain;
|
||||
}
|
||||
|
|
@ -437,8 +446,10 @@ body {
|
|||
}
|
||||
}
|
||||
|
||||
> footer, > header {
|
||||
.btn-social, .btn-lang {
|
||||
>footer,
|
||||
>header {
|
||||
.btn-social,
|
||||
.btn-lang {
|
||||
width: 2.3rem;
|
||||
height: 2.3rem;
|
||||
padding: 0.1rem;
|
||||
|
|
|
|||
|
|
@ -31,6 +31,7 @@
|
|||
@import "./pages/breeding/approaches";
|
||||
@import "./pages/breeding/article";
|
||||
@import "./pages/page-des-40-ans";
|
||||
@import "./pages/export-40-ans";
|
||||
@import "./pages/news";
|
||||
|
||||
// * PARTIALS
|
||||
|
|
|
|||
|
|
@ -413,14 +413,36 @@
|
|||
}
|
||||
|
||||
#commitments-banner-text-complex-items {
|
||||
.banner-title {
|
||||
color: #000;
|
||||
|
||||
@include media-breakpoint-up(md) {
|
||||
position: absolute;
|
||||
color: #fff !important;
|
||||
}
|
||||
}
|
||||
|
||||
.text-custom-placement {
|
||||
z-index: 1;
|
||||
transform: translateY(5rem);
|
||||
|
||||
@include media-breakpoint-up(md) {
|
||||
transform: translateY(5rem);
|
||||
}
|
||||
}
|
||||
|
||||
~#commitments-complex-flex-items .container {
|
||||
padding-top: 6rem !important;
|
||||
}
|
||||
|
||||
.responsive-position {
|
||||
position: relative;
|
||||
|
||||
|
||||
|
||||
@include media-breakpoint-up(md) {
|
||||
position: absolute;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#commitments-paragraph-with-visual,
|
||||
|
|
|
|||
14
resources/sass/fo/pages/export-40-ans.scss
Normal file
|
|
@ -0,0 +1,14 @@
|
|||
#export-40-ans {
|
||||
#hero {
|
||||
min-height: 85vh;
|
||||
background-color: #efd;
|
||||
|
||||
.export-hero {
|
||||
&-wrapper {
|
||||
min-height: inherit;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -5,6 +5,10 @@
|
|||
overflow-y: visible;
|
||||
}
|
||||
|
||||
.breadcrumb-item {
|
||||
color: $color-primary !important;
|
||||
}
|
||||
|
||||
#section-40-ans {
|
||||
min-height: 80vh;
|
||||
overflow-x: hidden;
|
||||
|
|
@ -258,7 +262,7 @@
|
|||
transform: scaleX(-100%);
|
||||
}
|
||||
|
||||
h2 {
|
||||
h1 {
|
||||
z-index: 1;
|
||||
padding-top: 35px;
|
||||
|
||||
|
|
@ -464,7 +468,7 @@
|
|||
|
||||
@include media-breakpoint-up(lg) {
|
||||
top: 50%;
|
||||
left: -10%;
|
||||
left: -5%;
|
||||
max-width: 211px;
|
||||
transform: rotate(-3deg);
|
||||
}
|
||||
|
|
@ -509,7 +513,7 @@
|
|||
&-container {
|
||||
position: absolute;
|
||||
top: -38%;
|
||||
right: -29%;
|
||||
right: -5%;
|
||||
display: none;
|
||||
max-width: 263px;
|
||||
transform: rotate(5deg);
|
||||
|
|
@ -535,9 +539,13 @@
|
|||
|
||||
@include media-breakpoint-up(md) {
|
||||
z-index: 1;
|
||||
right: -18%;
|
||||
right: -5%;
|
||||
transform: translateX(0%);
|
||||
}
|
||||
|
||||
@include media-breakpoint-up(xxl) {
|
||||
right: 5%;
|
||||
}
|
||||
}
|
||||
|
||||
&-div {
|
||||
|
|
@ -643,8 +651,16 @@
|
|||
background-color: $color-hex-medium-blue;
|
||||
}
|
||||
|
||||
.text-light-blue {
|
||||
color: $color-hex-medium-blue;
|
||||
}
|
||||
|
||||
.title-wrapper {
|
||||
margin-top: -2rem;
|
||||
}
|
||||
|
||||
.titre-le-jeu-des-40-ans {
|
||||
position: absolute;
|
||||
// position: absolute;
|
||||
z-index: 2;
|
||||
top: -.5rem;
|
||||
left: 11%;
|
||||
|
|
@ -656,22 +672,19 @@
|
|||
}
|
||||
|
||||
.titre-100-gagnant {
|
||||
position: absolute;
|
||||
z-index: 3;
|
||||
top: 1.7rem;
|
||||
left: 19%;
|
||||
margin-left: 3rem;
|
||||
transform: rotate(-2deg);
|
||||
|
||||
@include media-breakpoint-up(md) {
|
||||
top: 2.1rem;
|
||||
left: 50%;
|
||||
transform: translateX(-50%) rotate(-2deg);
|
||||
top: 2.7rem;
|
||||
left: 3.5rem;
|
||||
transform: rotate(-2deg);
|
||||
}
|
||||
}
|
||||
|
||||
.sous-titre-rendez-vous {
|
||||
max-width: 100%;
|
||||
margin-top: 100px;
|
||||
margin-top: 3rem;
|
||||
|
||||
@include media-breakpoint-up(md) {
|
||||
max-width: 65%;
|
||||
|
|
@ -679,8 +692,12 @@
|
|||
}
|
||||
|
||||
.picto-temps-fort-1 {
|
||||
@include media-breakpoint-up(lg) {
|
||||
max-width: 352px;
|
||||
.highlight-top {
|
||||
margin-bottom: -0.5rem !important;
|
||||
}
|
||||
|
||||
.highlight-bottom {
|
||||
margin-top: -0.5rem !important;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -860,16 +877,8 @@
|
|||
top: -13%;
|
||||
left: 33%;
|
||||
max-width: 190px;
|
||||
transform: rotate(40deg);
|
||||
|
||||
@include media-breakpoint-up(md) {
|
||||
top: -4%;
|
||||
left: 4%;
|
||||
max-width: 317px;
|
||||
transform: rotate(-45deg);
|
||||
}
|
||||
|
||||
@include media-breakpoint-up(lg) {
|
||||
top: -4%;
|
||||
left: 4%;
|
||||
max-width: 317px;
|
||||
|
|
@ -1092,17 +1101,21 @@
|
|||
&-cadeau-bleu {
|
||||
position: absolute;
|
||||
z-index: -1;
|
||||
top: 0;
|
||||
top: 4rem;
|
||||
right: 0;
|
||||
max-width: 90px;
|
||||
transform: translate(1%, 117%);
|
||||
|
||||
@include media-breakpoint-up(md) {
|
||||
top: 10rem;
|
||||
right: -15rem;
|
||||
max-width: 109px;
|
||||
transform: translate(-12%, 84%);
|
||||
}
|
||||
|
||||
@include media-breakpoint-up(lg) {
|
||||
top: 0;
|
||||
right: 0;
|
||||
transform: translate(-17%, 21%);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -85,7 +85,7 @@
|
|||
}
|
||||
|
||||
.product-paper-content {
|
||||
overflow: hidden scroll;
|
||||
overflow: hidden auto;
|
||||
height: 12rem;
|
||||
opacity: 0;
|
||||
transition: opacity .5s;
|
||||
|
|
|
|||
|
|
@ -1,6 +1,4 @@
|
|||
#story-description {
|
||||
padding-bottom: 18rem;
|
||||
|
||||
@include media-breakpoint-up(lg) {
|
||||
padding-bottom: 1rem;
|
||||
}
|
||||
|
|
@ -12,51 +10,22 @@
|
|||
}
|
||||
|
||||
.left-picture-wrapper {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
height: 15rem;
|
||||
padding: 0 3rem 0 0;
|
||||
|
||||
@include media-breakpoint-up(lg) {
|
||||
width: 54%;
|
||||
height: 80%;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
&::before {
|
||||
@include media-breakpoint-up(sm) {
|
||||
position: absolute;
|
||||
top: -5.5rem;
|
||||
right: 2rem;
|
||||
width: 128px;
|
||||
height: 132px;
|
||||
background-image: url('@/images/story/french-flag.svg');
|
||||
background-position: center;
|
||||
background-repeat: no-repeat;
|
||||
background-size: contain;
|
||||
content: "";
|
||||
.img-wrapper {
|
||||
&::before {
|
||||
@include media-breakpoint-up(sm) {
|
||||
position: absolute;
|
||||
top: 2rem;
|
||||
right: 0;
|
||||
width: 128px;
|
||||
height: 132px;
|
||||
background-image: url('@/images/story/french-flag.svg');
|
||||
background-position: center;
|
||||
background-repeat: no-repeat;
|
||||
background-size: contain;
|
||||
content: "";
|
||||
transform: translate(0%, -100%);
|
||||
}
|
||||
}
|
||||
|
||||
@include media-breakpoint-up(lg) {
|
||||
right: 0;
|
||||
}
|
||||
}
|
||||
|
||||
img {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
object-fit: cover;
|
||||
|
||||
@include media-breakpoint-up(lg) {
|
||||
width: auto;
|
||||
height: auto;
|
||||
object-fit: cover;
|
||||
}
|
||||
}
|
||||
|
||||
> div > div {
|
||||
clip-path: polygon(98% 0, 100% calc(100% - 0.75vw), 0 calc(100% - 0.5vw), 0% 0);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -117,7 +86,7 @@
|
|||
z-index: 5;
|
||||
top: 8rem;
|
||||
|
||||
&.is-sticky{
|
||||
&.is-sticky {
|
||||
/* stylelint-disable-next-line scss/at-extend-no-missing-placeholder */
|
||||
@extend .bottom-left-shadow;
|
||||
|
||||
|
|
@ -158,7 +127,7 @@
|
|||
}
|
||||
}
|
||||
|
||||
.col-10 > div::before {
|
||||
.col-10>div::before {
|
||||
position: absolute;
|
||||
top: calc(50% - 2rem);
|
||||
left: 50%;
|
||||
|
|
|
|||
|
|
@ -1,4 +1,3 @@
|
|||
|
||||
.product-card {
|
||||
.product-card-tag {
|
||||
top: -5%;
|
||||
|
|
@ -36,6 +35,10 @@
|
|||
.product-card-bottom-part {
|
||||
top: -1rem;
|
||||
|
||||
@include media-breakpoint-up(lg) {
|
||||
min-height: 8.5rem;
|
||||
}
|
||||
|
||||
.product-card-view-more {
|
||||
margin-bottom: -1rem;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -230,7 +230,7 @@ document.addEventListener("DOMContentLoaded", function () {
|
|||
},
|
||||
},
|
||||
breakpoints: {
|
||||
576: {
|
||||
768: {
|
||||
slidesPerView: 2,
|
||||
slidesPerGroup: 2,
|
||||
},
|
||||
|
|
@ -612,18 +612,21 @@ document.addEventListener("DOMContentLoaded", function () {
|
|||
|
||||
for (const eltButtonPrintProd of eltsButtonPrintProd) {
|
||||
eltButtonPrintProd.addEventListener("click", function () {
|
||||
const pathname = window.location.pathname;
|
||||
const pathnameAsArray = pathname.split("/");
|
||||
const itemName = pathnameAsArray[pathnameAsArray.length - 1];
|
||||
setTimeout(() => {
|
||||
// ! Seule solution: imprimer un pdf spécifique pour avoir le rendu souhaité.
|
||||
// @ts-ignore
|
||||
printJS({
|
||||
printable: "recettes/" + itemName + "/print-commercial-sheet",
|
||||
type: "pdf",
|
||||
showModal: true,
|
||||
});
|
||||
});
|
||||
window.print();
|
||||
|
||||
// FIXME: Uncomment to have a custom PDF.
|
||||
// const pathname = window.location.pathname;
|
||||
// const pathnameAsArray = pathname.split("/");
|
||||
// const itemName = pathnameAsArray[pathnameAsArray.length - 1];
|
||||
// setTimeout(() => {
|
||||
// // ! Seule solution: imprimer un pdf spécifique pour avoir le rendu souhaité.
|
||||
// // @ts-ignore
|
||||
// printJS({
|
||||
// printable: "recettes/" + itemName + "/print-commercial-sheet",
|
||||
// type: "pdf",
|
||||
// showModal: true,
|
||||
// });
|
||||
// });
|
||||
});
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -779,7 +779,7 @@
|
|||
$approachType ===
|
||||
\App\Enums\Approaches\ApproachTypeEnum::label->value(),
|
||||
])></i>
|
||||
{{ str(__('labels'))->ucFirst() }}
|
||||
{{ str(__('Badge de certification'))->ucFirst() }}
|
||||
</a>
|
||||
</li>
|
||||
</ul>
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
@php
|
||||
$inter = $condition ? __('validation.custom.of_the.female') : __('validation.custom.of_the.male');
|
||||
$model = $condition ? __('validation.custom.demarche') : __('validation.custom.label');
|
||||
$model = $condition ? __('models.classes.demarche') : __('models.classes.label');
|
||||
@endphp
|
||||
<div class="row">
|
||||
{{-- NAME --}}
|
||||
|
|
@ -82,7 +82,7 @@
|
|||
'id' => 'approachPictureAlt',
|
||||
'label' => __(':field1 :inter1:field2 :inter2:model', [
|
||||
'field1' => str(__('validation.custom.attribute_alt'))->ucfirst(),
|
||||
'inter1' => __('validation.custom.of_the.male'),
|
||||
'inter1' => __('validation.custom.of_the.vowel'),
|
||||
'field2' => __('validation.attributes.image'),
|
||||
'inter2' => $inter,
|
||||
'model' => $model,
|
||||
|
|
@ -94,7 +94,7 @@
|
|||
'helper' => __('crud.minicrud.picture_alt_helper'),
|
||||
'placeholder' => __(':field1 :inter1:field2 :inter2:model', [
|
||||
'field1' => str(__('validation.custom.attribute_alt'))->ucfirst(),
|
||||
'inter1' => __('validation.custom.of_the.male'),
|
||||
'inter1' => __('validation.custom.of_the.vowel'),
|
||||
'field2' => __('validation.attributes.image'),
|
||||
'inter2' => $inter,
|
||||
'model' => $model,
|
||||
|
|
@ -107,7 +107,7 @@
|
|||
'id' => 'approachPictureTitle',
|
||||
'label' => __(':field1 :inter1:field2 :inter2:model', [
|
||||
'field1' => str(__('validation.custom.attribute_title'))->ucfirst(),
|
||||
'inter1' => __('validation.custom.of_the.male'),
|
||||
'inter1' => __('validation.custom.of_the.vowel'),
|
||||
'field2' => __('validation.attributes.image'),
|
||||
'inter2' => $inter,
|
||||
'model' => $model,
|
||||
|
|
@ -119,7 +119,7 @@
|
|||
'helper' => __('crud.minicrud.picture_title_helper'),
|
||||
'placeholder' => __(':field1 :inter1:field2 :inter2:model', [
|
||||
'field1' => str(__('validation.custom.attribute_title'))->ucfirst(),
|
||||
'inter1' => __('validation.custom.of_the.male'),
|
||||
'inter1' => __('validation.custom.of_the.vowel'),
|
||||
'field2' => __('validation.attributes.image'),
|
||||
'inter2' => $inter,
|
||||
'model' => $model,
|
||||
|
|
|
|||
|
|
@ -112,6 +112,41 @@
|
|||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
{{-- CLAIM TITLE --}}
|
||||
<div class="col-12 col-lg-6 mb-3">
|
||||
<fieldset class="h-100 border p-3">
|
||||
<legend>{{ str(__('validation.custom.claim_title'))->ucFirst() }}</legend>
|
||||
<div class="row">
|
||||
<div class="col-12">
|
||||
@include('bo.partials.inputs.varchar', [
|
||||
'id' => 'productClaimTitle',
|
||||
'label' => __(':field :inter:model', [
|
||||
'field' => str(__('validation.custom.claim_title'))->ucFirst(),
|
||||
'inter' => __('validation.custom.of_the.male'),
|
||||
'model' => __('models.classes.product'),
|
||||
]),
|
||||
'hasWordCounter' => true,
|
||||
'name' => 'claim_title',
|
||||
'model' => $productModel ?? null,
|
||||
'helper' => __('validation.between.string', [
|
||||
'attribute' => __(':field :inter:model', [
|
||||
'field' => __('validation.custom.claim_title'),
|
||||
'inter' => __('validation.custom.of_the.male'),
|
||||
'model' => __('models.classes.product'),
|
||||
]),
|
||||
'min' => 3,
|
||||
'max' => 255,
|
||||
]),
|
||||
'placeholder' => __(':field :inter:model', [
|
||||
'field' => str(__('validation.custom.claim_title'))->ucFirst(),
|
||||
'inter' => __('validation.custom.of_the.male'),
|
||||
'model' => __('models.classes.product'),
|
||||
]),
|
||||
])
|
||||
</div>
|
||||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
{{-- DESCRIPTION --}}
|
||||
<div class="col-12 mb-3">
|
||||
<fieldset class="border p-3">
|
||||
|
|
@ -246,7 +281,6 @@
|
|||
]),
|
||||
'hasWordCounter' => true,
|
||||
'name' => 'picture_alt',
|
||||
'required' => true,
|
||||
'model' => $productModel ?? null,
|
||||
'helper' => __('crud.minicrud.picture_alt_helper'),
|
||||
'placeholder' => __(':field1 :inter1:field2 :inter2:model', [
|
||||
|
|
@ -271,7 +305,6 @@
|
|||
]),
|
||||
'hasWordCounter' => true,
|
||||
'name' => 'picture_title',
|
||||
'required' => true,
|
||||
'model' => $productModel ?? null,
|
||||
'helper' => __('crud.minicrud.picture_title_helper'),
|
||||
'placeholder' => __(':field1 :inter1:field2 :inter2:model', [
|
||||
|
|
@ -291,7 +324,6 @@
|
|||
'width' => 300,
|
||||
'height' => 200,
|
||||
'model' => $productModel ?? null,
|
||||
'required' => true,
|
||||
'preview' => true,
|
||||
])
|
||||
</div>
|
||||
|
|
@ -702,14 +734,14 @@
|
|||
'routeName' => 'bo.product-types.json-paginate',
|
||||
'fieldName' => 'label',
|
||||
'multiple' => true,
|
||||
'limits' => [0, 4],
|
||||
'limits' => [0, 1],
|
||||
'required' => true,
|
||||
'disabled' => false,
|
||||
'placeholder' => __('Rechercher un :model', [
|
||||
'model' => trans_choice('models.classes.product_type', 1),
|
||||
]),
|
||||
'helper' => __(
|
||||
'Sélectionner un ou plusieurs :model qui sera associé parmis la liste (minimum 0 et maximum 4).',
|
||||
'Sélectionner un ou plusieurs :model qui sera associé parmis la liste (minimum 0 et maximum 1).',
|
||||
['model' => trans_choice('models.classes.product_type', \INF)]),
|
||||
])
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -3,9 +3,10 @@
|
|||
<thead>
|
||||
@include('bo.modules.table-col-sorter', [
|
||||
'cols' => [
|
||||
'news_club_id' => str(trans_choice('models.classes.news_club', 1))->ucfirst(),
|
||||
'news_club_id' => str(__('models.classes.survey'))->ucfirst(),
|
||||
'answer' => str(trans_choice('models.classes.surveys_answer', 1))->ucfirst(),
|
||||
'published' => str(__('validation.custom.publication'))->ucfirst(),
|
||||
'order' => str(__('validation.custom.order'))->ucfirst(),
|
||||
'updated_at' => str(__('validation.attributes.updated_at'))->ucfirst(),
|
||||
],
|
||||
])
|
||||
|
|
@ -26,9 +27,77 @@
|
|||
'routeName' => 'surveys_answers',
|
||||
'model' => $surveysAnswerModel,
|
||||
])
|
||||
@if (empty(request()->search) && session()->get('bo.surveys_answers.index.sort_col') === 'order')
|
||||
<td class="text-center align-middle">
|
||||
@can('changeOrder', $surveysAnswerModel)
|
||||
<div class="d-flex justify-content-center align-items-center">
|
||||
@php
|
||||
$parametersUp = ['surveys_answer' => $surveysAnswerModel, 'direction' => 'up'];
|
||||
if (request()->route()->parameter('news_club')) {
|
||||
$parametersUp = array_merge($parametersUp, [
|
||||
'news_club' => $surveysAnswerModel->newsClub,
|
||||
]);
|
||||
}
|
||||
@endphp
|
||||
<form @class([
|
||||
'invisible' => $loop->first and $surveysAnswerModels->onFirstPage(),
|
||||
])
|
||||
action="{{ route('bo.surveys_answers.change-order', $parametersUp) }}"
|
||||
method="POST">
|
||||
@csrf
|
||||
@method('PATCH')
|
||||
<button data-bs-toggle="tooltip" type="submit" title="{{ __('crud.other.up') }}"
|
||||
@class([
|
||||
'btn btn-sm btn-outline-secondary',
|
||||
'disabled' => $loop->first and $surveysAnswerModels->onFirstPage(),
|
||||
])>
|
||||
<i class="fas fa-arrow-up"></i>
|
||||
</button>
|
||||
</form>
|
||||
@php
|
||||
$parametersDown = [
|
||||
'surveys_answer' => $surveysAnswerModel,
|
||||
'direction' => 'down',
|
||||
];
|
||||
if (request()->route()->parameter('news_club')) {
|
||||
$parametersDown = array_merge($parametersDown, [
|
||||
'news_club' => $surveysAnswerModel->newsClub,
|
||||
]);
|
||||
}
|
||||
@endphp
|
||||
<form @class([
|
||||
'invisible' =>
|
||||
$loop->last and
|
||||
$surveysAnswerModels->currentPage() ===
|
||||
$surveysAnswerModels->lastPage(),
|
||||
])
|
||||
action="{{ route('bo.surveys_answers.change-order', $parametersDown) }}"
|
||||
method="POST">
|
||||
@csrf
|
||||
@method('PATCH')
|
||||
<button data-bs-toggle="tooltip" type="submit" title="{{ __('crud.other.down') }}"
|
||||
@class([
|
||||
'btn btn-sm btn-outline-secondary ms-1',
|
||||
'disabled' =>
|
||||
$loop->last and
|
||||
$surveysAnswerModels->currentPage() ===
|
||||
$surveysAnswerModels->lastPage(),
|
||||
])>
|
||||
<i class="fas fa-arrow-down"></i>
|
||||
</button>
|
||||
</form>
|
||||
</div>
|
||||
@else
|
||||
<span class="text-danger" data-bs-toggle="tooltip" title="{{ __('crud.other.right') }}">
|
||||
<i class="fa-solid fa-ban"></i>
|
||||
</span>
|
||||
@endcan
|
||||
</td>
|
||||
@endif
|
||||
<td class="text-center align-middle">
|
||||
<span
|
||||
class="badge text-bg-secondary">{{ $surveysAnswerModel->updated_at->isoFormat('LLLL') }}</span>
|
||||
<span class="badge text-bg-secondary">
|
||||
{{ $surveysAnswerModel->updated_at->isoFormat('LLLL') }}
|
||||
</span>
|
||||
</td>
|
||||
<td class="text-end align-middle">
|
||||
@canAny(['show', 'duplicate', 'update', 'delete'], $surveysAnswerModel)
|
||||
|
|
|
|||
|
|
@ -73,7 +73,7 @@
|
|||
</li>
|
||||
<li class="nav-item mx-auto">
|
||||
<a class="btn btn-link menu-logo p-1" href="{{ route('fo.home.show') }}">
|
||||
<img src="{{ Vite::asset('resources/assets/images/legaulois-logo.png') }}"
|
||||
<img src="{{ Vite::asset('resources/assets/images/legaulois-logo-40ans.png') }}"
|
||||
title="{{ __(':appname, Volaille 100% Française', ['appname' => config('app.name')]) }}"
|
||||
alt="{{ config('app.name') }}" role="img">
|
||||
</a>
|
||||
|
|
|
|||
|
|
@ -79,7 +79,7 @@
|
|||
</li> --}}
|
||||
<li class="nav-item">
|
||||
<span class="nav-icon"><img
|
||||
src="{{ Vite::asset('resources/assets/images/legaulois-logo.png') }}"
|
||||
src="{{ Vite::asset('resources/assets/images/legaulois-logo-40ans.png') }}"
|
||||
title="{{ __(':appname, Volaille 100% Française', ['appname' => config('app.name')]) }}"
|
||||
alt="{{ config('app.name') }}" role="img"></span>
|
||||
<a class="nav-link" href="{{ route('fo.home.show') }}"
|
||||
|
|
|
|||
|
|
@ -58,7 +58,7 @@
|
|||
action="{{ route('club.surveys.store', ['news_club' => $newsClubModel]) }}"
|
||||
method="POST">
|
||||
@csrf
|
||||
@foreach ($newsClubModel->answers->filter(function ($answer) {
|
||||
@foreach ($newsClubModel->answers->sortBy([['order', 'asc']])->filter(function ($answer) {
|
||||
return $answer->published;
|
||||
}) as $key => $answerModel)
|
||||
<fieldset class="form-check mb-3">
|
||||
|
|
|
|||
|
|
@ -5,8 +5,6 @@
|
|||
$commitmentItem1->picture = 'resources/assets/images/commitments/commitment-1/preview-banner.jpg';
|
||||
$commitmentItem1->picture_alt = __('Homme portant un bébé dinde');
|
||||
$commitmentItem1->picture_title = __('Image de prévisualisation de la page Le métier d\'éleveur de volailles');
|
||||
// TODO
|
||||
// Put the good url
|
||||
$commitmentItem1->link = route('fo.breeding.show', $breedingPages->where('type', \App\Enums\StaticPageType::breedingJob)->first());
|
||||
// Item 2
|
||||
$commitmentItem2 = new stdClass();
|
||||
|
|
@ -14,8 +12,6 @@
|
|||
$commitmentItem2->picture = 'resources/assets/images/commitments/commitment-2/preview-banner.jpg';
|
||||
$commitmentItem2->picture_alt = __('Bébé dindes picorant');
|
||||
$commitmentItem2->picture_title = __('Image de prévisualisation de la bannière de la page alimentation des volailles');
|
||||
// TODO
|
||||
// Put the good url
|
||||
$commitmentItem2->link = route('fo.breeding.show', $breedingPages->where('type', \App\Enums\StaticPageType::breedingFood)->first());
|
||||
// Item 3
|
||||
$commitmentItem3 = new stdClass();
|
||||
|
|
@ -23,8 +19,6 @@
|
|||
$commitmentItem3->picture = 'resources/assets/images/commitments/commitment-3/preview-banner.jpg';
|
||||
$commitmentItem3->picture_alt = __('Éleveur portant une poule blanche');
|
||||
$commitmentItem3->picture_title = __('Image de prévisualisation de la bannière de la page santé des volailles');
|
||||
// TODO
|
||||
// Put the good url
|
||||
$commitmentItem3->link = route('fo.breeding.show', $breedingPages->where('type', \App\Enums\StaticPageType::breedingHealth)->first());
|
||||
|
||||
// Item 4
|
||||
|
|
@ -33,8 +27,6 @@
|
|||
$commitmentItem4->picture = 'resources/assets/images/commitments/commitment-4/preview-banner.jpg';
|
||||
$commitmentItem4->picture_alt = __('Groupe de poules couchées dans leur poulailler');
|
||||
$commitmentItem4->picture_title = __('Image de prévisualisation de la bannière de la page élevage des volailles.');
|
||||
// TODO
|
||||
// Put the good url
|
||||
$commitmentItem4->link = route('fo.breeding.show', $breedingPages->where('type', \App\Enums\StaticPageType::breedingPoultry)->first());
|
||||
|
||||
// All
|
||||
|
|
|
|||
|
|
@ -22,7 +22,7 @@
|
|||
<img class="img-fluid block-center" src="{{ Vite::asset($icon['path']) }}" title="{{ $icon['description'] }}"
|
||||
alt="{{ $icon['alt'] }}">
|
||||
</div>
|
||||
<h4 class="col-9 col-md-12">{{ $title }}</h4>
|
||||
<h4 class="col-9 col-md-12">{{ clean($title) }}</h4>
|
||||
</div>
|
||||
<a class="text-uppercase btn btn-secondary" href="{{ $href }}">{{ $btnText }}</a>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -5,6 +5,6 @@
|
|||
<x-fo.page-des-40-ans.section1.logo-anniversaire-tous-les-gaulois />
|
||||
<div class="position-absolute h-100 w-100 z-n1 bg-confettis start-0 top-0"></div>
|
||||
<x-fo.page-des-40-ans.section1.cadeaux-cote-gauche />
|
||||
<x-fo.page-des-40-ans.section1.info-card />
|
||||
<x-fo.page-des-40-ans.section1.info-card :isExport="$isExport ?? false" />
|
||||
<x-fo.page-des-40-ans.section1.cadeaux-cote-droit />
|
||||
</section>
|
||||
|
|
|
|||
|
|
@ -1,41 +1,36 @@
|
|||
@props([
|
||||
'isExport' => false,
|
||||
])
|
||||
<div class="mb-lg-5 container mt-5">
|
||||
<div class="navigation-card bg-light position-relative line-border-small light-card-content text-primary mx-auto mt-3 px-3 py-4">
|
||||
<nav class="d-flex justify-content-md-center" aria-label="breadcrumb">
|
||||
<ol class="breadcrumb text-primary">
|
||||
<li class="breadcrumb-item text-primary"><a class="text-decoration-none"
|
||||
href="{{ route('fo.home.show') }}">{{ __('Accueil') }}</a>
|
||||
</li>
|
||||
<li class="fw-bold breadcrumb-item active text-primary" aria-current="page">
|
||||
{{ __("40 ans! l'anniversaire de tous les gaulois") }}</li>
|
||||
</ol>
|
||||
</nav>
|
||||
<div class="d-flex justify-content-center">
|
||||
<div class="mb-3 w-fit">
|
||||
@include('modules.breadcrumbs.breadcrumb-body', ['brParam' => ''])
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<p class="fs-5 text-md-center pr-3 text-start">
|
||||
{!! clean(
|
||||
__(
|
||||
'Depuis 40 ans, Le Gaulois s\'engage à proposer des produits <strong>100% origine France</strong> avec des <strong>volailles nées, élevées et préparées</strong> sur notre territoire. <br>
|
||||
<strong>40 ans de convivialité et de plaisir à la française, à partager avec vous !</strong> <br>
|
||||
Pendant cette année festive, découvrez <strong>nos jeux et nos surprises</strong>.',
|
||||
),
|
||||
) !!}
|
||||
{!! clean(__('40years.banner')) !!}
|
||||
</p>
|
||||
<div class="d-flex flex-column flex-md-row justify-content-center mt-4 gap-4">
|
||||
<div class="text-md-start text-center">
|
||||
<a class="btn text-uppercase w-100 w-md-fit btn-cotillons f-bourton-base fw-medium px-md-3 px-0 py-2 text-white"
|
||||
href="#nos-40-annees">
|
||||
{{ __('Nos 40 années') }}
|
||||
</a>
|
||||
</div>
|
||||
@if (!$isExport)
|
||||
<div class="text-md-start text-center">
|
||||
<a class="btn text-uppercase w-100 w-md-fit btn-cotillons f-bourton-base fw-medium px-md-3 px-0 py-2 text-white"
|
||||
href="#nos-40-annees">
|
||||
{{ __('Nos 40 années') }}
|
||||
</a>
|
||||
</div>
|
||||
@endif
|
||||
<div class="text-md-start text-center">
|
||||
<a class="btn text-uppercase w-100 w-md-fit btn-cotillons f-bourton-base fw-medium px-md-3 px-0 py-2 text-white"
|
||||
href="#le-jeu-des-40-ans">
|
||||
{{ __('Jouez avec nous !') }}
|
||||
{{ __('40years.play-with-us') }}
|
||||
</a>
|
||||
</div>
|
||||
<div class="text-md-start text-center">
|
||||
<a class="btn text-uppercase w-100 w-md-fit btn-cotillons f-bourton-base fw-medium px-md-3 px-0 py-2 text-white"
|
||||
href="#encore-plus-de-cadeaux">
|
||||
{{ __('Encore + de cadeaux !') }}
|
||||
{{ __('40years.more-gifts') }}
|
||||
</a>
|
||||
</div>
|
||||
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
<a class="w-100 d-flex justify-content-center py-5" href="{{ route('fo.brand.story') }}">
|
||||
<a class="w-100 d-flex justify-content-center py-5"
|
||||
href="@if ($isExport) #story-description @else{{ route('fo.brand.story') }} @endif">
|
||||
<div class="position-relative w-fit pb-2">
|
||||
<div class="position-absolute z-n1 w-100 h-100 d-flex justify-content-center start-0 top-0">
|
||||
<div class="h-100 w-100 cta-blue"></div>
|
||||
|
|
|
|||
|
|
@ -1,10 +1,10 @@
|
|||
<h2 class="fs-1 f-bourton-base text-primary text-center">
|
||||
<h1 class="fs-1 f-bourton-base text-primary text-center">
|
||||
{{ __('L\'anniversaire de') }}
|
||||
<span class="bg-danger text-white shadow-sm">
|
||||
{{ __('68 millions') }}
|
||||
</span>
|
||||
{{ __('de Gaulois !') }}
|
||||
</h2>
|
||||
</h1>
|
||||
<p class="fs-5 text-primary py-md-4 py-2 text-center">
|
||||
{!! clean(
|
||||
__(
|
||||
|
|
@ -12,4 +12,4 @@
|
|||
),
|
||||
) !!}
|
||||
</p>
|
||||
<h3 class="text-primary fs-3 text-center">{{ __('Bon anniversaire à tous nos Gaulois !') }}</h3>
|
||||
<h3 class="text-primary fs-3 f-bourton-base text-center">{{ __('Bon anniversaire à tous nos Gaulois !') }}</h3>
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
<div class="photo-1909-originel-container">
|
||||
<div class="photo-1909-originel-container d-none d-xxl-block">
|
||||
<div class="backdrop-shadow z-0">
|
||||
</div>
|
||||
<div class="bg-light clip-path-smooth position-relative z-2 photo-1909-originel-div">
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
<div class="photo-arc-de-triomphe-container">
|
||||
<div class="photo-arc-de-triomphe-container d-none d-lg-block">
|
||||
<div class="backdrop-shadow z-0">
|
||||
</div>
|
||||
<div class="bg-light line-border-small position-relative z-2 photo-arc-de-triomphe-div">
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
<div class="photo-volaille-drapeau-container">
|
||||
<div class="photo-volaille-drapeau-container d-none d-md-block">
|
||||
<div class="backdrop-shadow z-0">
|
||||
</div>
|
||||
<div class="line-border-small position-relative z-2 photo-volaille-drapeau-div">
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
<div class="photo-partage-blanc-de-dinde-container">
|
||||
<div class="photo-partage-blanc-de-dinde-container d-none d-lg-block">
|
||||
<div class="backdrop-shadow z-0">
|
||||
</div>
|
||||
<div class="bg-danger clip-path-smooth position-relative z-2 photo-partage-blanc-de-dinde-div">
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
<section class="position-relative line-border-large bg-light overflow-x-hidden" id="section-anniversaire">
|
||||
<x-fo.page-des-40-ans.section2.white-wood-background />
|
||||
<x-fo.page-des-40-ans.section2.main-content />
|
||||
<x-fo.page-des-40-ans.section2.main-content :isExport="$isExport ?? false" />
|
||||
</section>
|
||||
|
|
|
|||
|
|
@ -8,5 +8,5 @@
|
|||
<x-fo.page-des-40-ans.section2.img-partage-blanc-de-dinde />
|
||||
<x-fo.page-des-40-ans.section2.img-1909 />
|
||||
</div>
|
||||
<x-fo.page-des-40-ans.section2.cta />
|
||||
<x-fo.page-des-40-ans.section2.cta :isExport="$isExport ?? false" />
|
||||
</div>
|
||||
|
|
|
|||