diff --git a/app/Enums/InputType.php b/app/Enums/InputType.php index ad7c44bc..49edf721 100644 --- a/app/Enums/InputType.php +++ b/app/Enums/InputType.php @@ -8,20 +8,22 @@ enum InputType: int { use BaseEnum; - case boolean = 1; - case dropdownArray = 2; - case email = 3; - case image = 4; - case imageArray = 5; - case labelArray = 6; - case miniblocArray = 7; - case number = 8; - case selectEnum = 9; - case password = 10; - case string = 11; - case text = 12; - case url = 13; - case videoVimeo = 14; - case videoYoutube = 15; - case video = 16; + case boolean = 1; + case dropdownArray = 2; + case email = 3; + case image = 4; + case imageArray = 5; + case labelArray = 6; + case miniblocArray = 7; + case number = 8; + case selectEnum = 9; + case password = 10; + case string = 11; + case text = 12; + case url = 13; + case videoVimeo = 14; + case videoYoutube = 15; + case video = 16; + case slider = 17; + case selectImageVideo = 18; } diff --git a/app/Enums/StaticPageType.php b/app/Enums/StaticPageType.php index 2126e6ec..7964fb7e 100644 --- a/app/Enums/StaticPageType.php +++ b/app/Enums/StaticPageType.php @@ -33,6 +33,7 @@ enum StaticPageType: int case exitOutside = 23; case ouiCBon = 24; case ourFarms = 25; + case tdf = 26; /** * Optionnal labels definition. @@ -64,7 +65,8 @@ enum StaticPageType: int self::rules->name => 'Règlement du jeu', self::exitOutside->name => 'Sortir à l\'extérieur', self::ouiCBon->name => 'Oui c\'est bon', - self::ourFarms->name => 'Nos élevages' + self::ourFarms->name => 'Nos élevages', + self::tdf->name => 'Tour de France' ]; /** diff --git a/app/Http/Controllers/Bo/StaticPageController.php b/app/Http/Controllers/Bo/StaticPageController.php index 71f467a2..910b146c 100644 --- a/app/Http/Controllers/Bo/StaticPageController.php +++ b/app/Http/Controllers/Bo/StaticPageController.php @@ -43,9 +43,19 @@ class StaticPageController extends Controller public function update(UpdateStaticPageRequest $request, StaticPage $static_page): \Illuminate\Http\RedirectResponse { return DB::transaction(function () use ($request, $static_page) { + $validated = $request->validated(); + $data = $static_page->data; + + foreach ($validated['data'] as $key => $input) { + if (isset($input['value']) && is_array($input['value'])) { + $data[$key]['value'] = $input['value']; + } + } + + $static_page->data = $data; $static_page->fill(array_replace_recursive( $static_page->getFillableFields($static_page), - $request->validated() + $validated )); if ($static_page->saveOrFail()) { @@ -73,7 +83,7 @@ class StaticPageController extends Controller ->map(fn($page) => $page->data['common_section'] ?? null) ->filter() ->first(); - + return view('bo.pages.static_pages.common_section.edit', [ 'commonSection' => $commonSection, ]); @@ -88,17 +98,17 @@ class StaticPageController extends Controller public function updateCommonSection(UpdateCommonSectionRequest $request): RedirectResponse { $pages = StaticPage::whereIn('type', StaticPageType::getBreedingValues())->get(); - + try { DB::transaction(function () use ($pages, $request) { foreach ($pages as $page) { $data = $page->data ?? []; - + $data['common_section'] = [ 'title' => $request->validated('title'), 'content' => $request->validated('content'), ]; - + $page->data = $data; $page->saveOrFail(); } @@ -110,7 +120,7 @@ class StaticPageController extends Controller ->with('error', __('crud.messages.cannot_be_updated', [ 'model' => Str::ucfirst(__('validation.custom.common_section_part'))])); } - + return redirect() ->route('bo.static_page.sections.edit') ->with('success', __('crud.messages.has_been_updated', [ diff --git a/app/Http/Controllers/Club/ShopController.php b/app/Http/Controllers/Club/ShopController.php index 707e9e64..9adc5f92 100644 --- a/app/Http/Controllers/Club/ShopController.php +++ b/app/Http/Controllers/Club/ShopController.php @@ -2,6 +2,7 @@ namespace App\Http\Controllers\Club; +use App\Enums\Shop\ContactFormCivility; use App\Enums\Shop\OrderStatus; use App\Enums\Shop\OrderType; use App\Exceptions\CBPayementError; @@ -69,6 +70,7 @@ class ShopController extends Controller $order->payementType = OrderType::make(intval($request->payementMethod)); $order->status = OrderStatus::waiting; $order->customer_id = $customerModel->getKey(); + $order->civility = ContactFormCivility::m; // FIXME: Remove this field $order->fill($request->coords); $order->saveOrFail(); } catch (QueryException $e) { diff --git a/app/Http/Controllers/Fo/BreedingController.php b/app/Http/Controllers/Fo/BreedingController.php index ed06f424..f74f38db 100644 --- a/app/Http/Controllers/Fo/BreedingController.php +++ b/app/Http/Controllers/Fo/BreedingController.php @@ -39,13 +39,16 @@ class BreedingController extends Controller $ocbBreederModels = OcbBreeder::getOcbBreederCards(); $staticPage = StaticPage::query()->where('type', StaticPageType::ouiCBon)->first(); $categoryApproachModels = CategoryApproach::all(); - $sections = SectionApproach::query()->where('page_id', $staticPage->id)->get(); - $sectionApproachModels = CollectionHelper::mapItemsToCards($sections->toArray(), $categoryApproachModels->toArray()); + $sections = SectionApproach::query() + ->with('category') + ->where('page_id', $staticPage->id) + ->get() + ->groupBy(fn($section) => $section->category?->name); return view('fo.pages.breeding.oui-c-est-bon', [ 'ocbBreederModels' => $ocbBreederModels, 'staticPageModel' => $staticPage, 'categoryApproachModels' => $categoryApproachModels, - 'sectionApproachModels' => $sectionApproachModels + 'sections' => $sections ]); } @@ -75,24 +78,27 @@ class BreedingController extends Controller ]); } - /** - * Display the given breeding page. - * - * @return \Illuminate\Contracts\View\View - */ + /** + * Display the given breeding page. + * + * @return \Illuminate\Contracts\View\View + */ public function exitOutsidePage(): \Illuminate\Contracts\View\View { $staticPage = StaticPage::query()->where('type', StaticPageType::exitOutside)->first(); $sliderImages = CollectionHelper::mapSlidesToFields($staticPage->data); $categoryApproachModels = CategoryApproach::all(); - $sections = SectionApproach::query()->where('page_id', $staticPage->id)->get(); - $sectionApproachModels = CollectionHelper::mapItemsToCards($sections->toArray(), $categoryApproachModels->toArray()); + $sections = SectionApproach::query() + ->with('category') + ->where('page_id', $staticPage->id) + ->get() + ->groupBy(fn($section) => $section->category?->name); return view('fo.pages.breeding.sortant-a-l-exterieur', [ - 'staticPageModel' => $staticPage, - 'sliderImages' => $sliderImages, + 'staticPageModel' => $staticPage, + 'sliderImages' => $sliderImages, 'categoryApproachModels' => $categoryApproachModels, - 'sectionApproachModels' => $sectionApproachModels + 'sections' => $sections, ]); } diff --git a/app/Http/Controllers/Fo/StaticPageController.php b/app/Http/Controllers/Fo/StaticPageController.php index 83b7eb97..50cea2ef 100644 --- a/app/Http/Controllers/Fo/StaticPageController.php +++ b/app/Http/Controllers/Fo/StaticPageController.php @@ -141,4 +141,15 @@ class StaticPageController extends Controller $videoModels = Video::get6PublishedVideosOrderedWithProducts(); return view('fo.pages.saga', compact('staticPageModel', 'videoModels')); } + + /** + * TDF page. + * + * @return \Illuminate\Contracts\View\View + */ + public function tdf(): \Illuminate\Contracts\View\View + { + $staticPageModel = StaticPage::getCachedStaticPage(StaticPageType::tdf); + return view('fo.pages.tdf', compact('staticPageModel')); + } } diff --git a/app/Http/Requests/Bo/UpdateMiniCrudRequest.php b/app/Http/Requests/Bo/UpdateMiniCrudRequest.php index 0b0fdde8..24c4411b 100644 --- a/app/Http/Requests/Bo/UpdateMiniCrudRequest.php +++ b/app/Http/Requests/Bo/UpdateMiniCrudRequest.php @@ -5,6 +5,7 @@ namespace App\Http\Requests\Bo; use App\Enums\InputType; use App\Lib\Helpers\ToolboxHelper; use Illuminate\Foundation\Http\FormRequest; +use Illuminate\Support\Arr; use Illuminate\Validation\ValidationException; abstract class UpdateMiniCrudRequest extends FormRequest @@ -203,6 +204,36 @@ abstract class UpdateMiniCrudRequest extends FormRequest $rules = array_merge($rules, [ "data.$iptName.value" => 'boolean' ]); + break; + case InputType::slider->value: + foreach ($input['columns'] as $column) { + $columnId = $column['id']; + $validation = $column['validation'] ?? ''; + + if (!empty($validation)) { + $rules["data.$iptName.value.*.$columnId"] = $validation; + } + } + break; + case InputType::selectImageVideo->value: + if (Arr::exists($this->input("data.$iptName.value"), 'picture')) { + $rules = array_merge($rules, [ + "data.$iptName.value.picture" => "required|array", + "data.$iptName.value.picture.path" => "required|image|mimes:png,jpg,jpeg|dimensions:width=620,height=348", + "data.$iptName.value.picture.alt" => "required|string|between:3,255", + "data.$iptName.value.picture.title" => "required|string|between:3,255", + ]); + } + + if (Arr::exists($this->input("data.$iptName.value"), 'video')) { + $rules = array_merge($rules, [ + "data.$iptName.value.video" => "required|array", + "data.$iptName.value.video.id" => "required|string", + "data.$iptName.value.video.alt" => "required|string|between:3,255", + "data.$iptName.value.video.title" => "required|string|between:3,255", + ]); + } + break; } //end switch } //end foreach diff --git a/app/Lib/Helpers/CollectionHelper.php b/app/Lib/Helpers/CollectionHelper.php index b0fe5aee..cdbe8b8f 100644 --- a/app/Lib/Helpers/CollectionHelper.php +++ b/app/Lib/Helpers/CollectionHelper.php @@ -118,89 +118,5 @@ class CollectionHelper ]) ->values() ->toArray(); - } - - /** - * Transform and merge 2 arrays to get homogeneous result - * - * @param array $items sections array - * @param array $categories categories array - * @return array - */ - public static function mapItemsToCards(array $items, array $categories): array - { - $categoriesById = collect($categories)->keyBy('id'); - $result = []; - - foreach ($items as $item) { - $category = $categoriesById->get($item['category_id']); - if (!$category) { - continue; - } - $categoryKey = $category['name']; - $parsed = self::parseContent($item['content']); - - $result[$categoryKey][] = [ - 'category' => $item['title'], - 'icon' => [ - 'path' => $item['picture'], - 'alt' => $item['picture_alt'], - 'description' => $item['picture_title'], - ], - 'content' => [ - [ - 'title' => $parsed['title'], - 'points' => $parsed['points'], - 'asterisc' => $parsed['asterisc'], - ], - ], - 'class' => 'card-template-sm', - ]; - } - return $result; - } - - - private static function parseContent(string $html): array - { - $dom = new \DOMDocument(); - @$dom->loadHTML(mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8')); - - // Extract h3 - $title = ''; - $h3 = $dom->getElementsByTagName('h3'); - if ($h3->length > 0) { - $title = $h3->item(0)->textContent; - } - - // Extract li - $points = []; - $liNodes = $dom->getElementsByTagName('li'); - foreach ($liNodes as $li) { - $points[] = trim($li->textContent); - } - - // Extract last

* - $lastAsterisc = null; - $pNodes = $dom->getElementsByTagName('p'); - foreach ($pNodes as $p) { - $text = trim($p->textContent); - if (str_starts_with($text, '*')) { - $lastAsterisc = $text; - } - } - // if nothing to extract - if (empty($title) && empty($points)) { - $body = $dom->getElementsByTagName('body')->item(0); - $rawText = trim($body ? $body->textContent : strip_tags($html)); - if (!empty($rawText)) { - $points[] = $rawText; - } - } - return [ - 'title' => $title, - 'points' => $points, - 'asterisc' => $lastAsterisc ?? '', - ]; - } + } } diff --git a/app/Providers/ViewServiceProvider.php b/app/Providers/ViewServiceProvider.php index 0050dee3..2b495c7f 100644 --- a/app/Providers/ViewServiceProvider.php +++ b/app/Providers/ViewServiceProvider.php @@ -136,6 +136,7 @@ class ViewServiceProvider extends ServiceProvider ['name' => 'exitOutsideStaticPageModel', 'value' => StaticPage::getCachedStaticPage(StaticPageType::exitOutside)], ['name' => 'ouiCestBonStaticPageModel', 'value' => StaticPage::getCachedStaticPage(StaticPageType::ouiCBon)], ['name' => 'ourFarmsStaticPageModel', 'value' => StaticPage::getCachedStaticPage(StaticPageType::ourFarms)], + ['name' => 'tdfStaticPageModel', 'value' => StaticPage::getCachedStaticPage(StaticPageType::tdf)], ])->map(function ($array) { View::share($array['name'], (function () use ($array) { return $array['value'] ?: null; diff --git a/app/Traits/Models/MiniCrudModel.php b/app/Traits/Models/MiniCrudModel.php index 268c94cb..f6021055 100644 --- a/app/Traits/Models/MiniCrudModel.php +++ b/app/Traits/Models/MiniCrudModel.php @@ -171,6 +171,20 @@ trait MiniCrudModel case InputType::url->value: ToolboxHelper::assertNoInternalBoUrls('content', $input['value']); break; + case InputType::slider->value: + if (!is_array($data[$o]['value'])) break; + foreach ($data[$o]['value'] as $index => $item) { + if (isset($item['picture']) && $item['picture'] instanceof \Illuminate\Http\UploadedFile) { + $data[$o]['value'][$index]['picture'] = \preg_replace( + '/^\/|^/', + '', + FileStorageHelper::storeFile($this, $item['picture'], true) + ); + } + } + break; + case InputType::selectImageVideo->value: + break; default: throw new \ErrorException(sprintf( 'Unknown input Type %s', diff --git a/database/migrations/2026_04_30_115934_add_data_to_static_page_tdf.php b/database/migrations/2026_04_30_115934_add_data_to_static_page_tdf.php new file mode 100644 index 00000000..20dac34f --- /dev/null +++ b/database/migrations/2026_04_30_115934_add_data_to_static_page_tdf.php @@ -0,0 +1,612 @@ + [ + 'label' => 'Texte de l\'encart', + 'inputType' => InputType::string->value, + 'value' => 'TOUR DE FRANCE 2025', + 'validate' => 'required|string|between:3,20', + 'required' => true + ], + 'banner_title' => [ + 'label' => 'Titre de la bannière', + 'inputType' => InputType::string->value, + 'value' => 'Le Gaulois en selle pour le tour de France', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'banner_picture' => [ + 'label' => 'Logo de la bannière', + 'inputType' => 4, + 'dimensions' => [ + 'width' => 100, + 'height' => 300 + ], + 'alt' => 'Logo volaille officielle de Le Gaulois et le Tour de France', + 'title' => 'Logo volaille officielle de Le Gaulois et le Tour de France', + 'value' => '', + 'validate' => 'required', + 'required' => true + ], + 'banner_button_title' => [ + 'label' => 'Titre du bouton n°1', + 'inputType' => InputType::string->value, + 'value' => 'Le Gaulois et le Tour de France', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'banner_button_title_2' => [ + 'label' => 'Titre du bouton n°2', + 'inputType' => InputType::string->value, + 'value' => 'Au cœur de la caravane le Gaulois', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'banner_picture_author' => [ + 'label' => 'Nom du photographe', + 'inputType' => InputType::string->value, + 'value' => 'Crédit photo - ASO Aurélien Vialatte', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'play_title' => [ + 'label' => 'Titre de la section n°2', + 'inputType' => InputType::string->value, + 'value' => 'Jouez et tentez de gagner !', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'play_description' => [ + 'label' => 'Description de la section n°2', + 'inputType' => InputType::text->value, + 'value' => '

Participez à notre jeu 100% gagnant Le Gaulois pendant le Tour de France 2025.

', + 'validate' => 'required|string|min:15', + 'required' => true + ], + 'play_picture' => [ + 'label' => 'Logo de la section n°2', + 'inputType' => 4, + 'dimensions' => [ + 'width' => 200, + 'height' => 125 + ], + 'alt' => '100% Gagnant', + 'title' => '100% Gagnant', + 'value' => '', + 'validate' => 'required', + 'required' => true + ], + 'play_btn_text' => [ + 'label' => 'Texte du bouton', + 'inputType' => InputType::string->value, + 'value' => 'Je tente ma chance !', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'play_btn_url' => [ + 'label' => 'Lien du bouton', + 'inputType' => InputType::url->value, + "value" => "https://www.legauloistourdefrance.fr", + "validate" => "required|string|url:http,https", + 'required' => true + ], + 'prize_title_1' => [ + 'label' => 'Texte du lot n°1', + 'inputType' => InputType::string->value, + 'value' => 'Ensembles TV + Home Cinema', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'prize_picture_1' => [ + 'label' => 'Image du lot n°1', + 'inputType' => 4, + 'dimensions' => [ + 'width' => 130, + 'height' => 100 + ], + 'alt' => 'Ensemble TV-Home cinéma à gagner pendant le jeu TDF 100% gagnant Le Gaulois', + 'title' => '5 Ensembles TV-Home cinéma à gagner', + 'value' => '', + 'validate' => 'required', + 'required' => true + ], + 'prize_title_2' => [ + 'label' => 'Texte du lot n°2', + 'inputType' => InputType::string->value, + 'value' => 'Casques audios oreilles libres', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'prize_picture_2' => [ + 'label' => 'Image du lot n°2', + 'inputType' => 4, + 'dimensions' => [ + 'width' => 130, + 'height' => 100 + ], + 'alt' => 'Casques audios oreilles libres à gagner pendant le jeu TDF 100% gagnant Le Gaulois', + 'title' => '40 Casques audios oreilles libres à gagner', + 'value' => '', + 'validate' => 'required', + 'required' => true + ], + 'prize_title_3' => [ + 'label' => 'Texte du lot n°3', + 'inputType' => InputType::string->value, + 'value' => 'Bons d\'achat', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'prize_picture_3' => [ + 'label' => 'Image du lot n°3', + 'inputType' => 4, + 'dimensions' => [ + 'width' => 130, + 'height' => 100 + ], + 'alt' => 'Bons de réduction à gagner pendant le jeu TDF 100% gagnant Le Gaulois', + 'title' => 'Milliers de bons d\'achat à gagner', + 'value' => '', + 'validate' => 'required', + 'required' => true + ], + "play_display_section" => [ + "label" => "Afficher la section n°2", + "inputType" => InputType::boolean->value, + "value" => true, + "validate" => "required|boolean", + 'required' => true + ], + 'find_us_title' => [ + 'label' => 'Titre de la section n°3', + 'inputType' => InputType::string->value, + 'value' => 'Venez nous retrouver sur le parcours du Tour de France', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'find_us_description' => [ + 'label' => 'Description de la section n°3', + 'inputType' => InputType::text->value, + 'value' => '

Participez à notre jeu 100% gagnant Le Gaulois pendant le Tour de France 2025.

', + 'validate' => 'required|string|min:15', + 'required' => true + ], + 'find_us_picture' => [ + 'label' => 'Pictogramme de la section n°3', + 'inputType' => 4, + 'dimensions' => [ + 'width' => 50, + 'height' => 70 + ], + 'alt' => 'Point d\'exclamation', + 'title' => 'Point d\'exclamation', + 'value' => '', + 'validate' => 'required', + 'required' => true + ], + 'find_us_btn_text_1' => [ + 'label' => 'Texte du bouton n°1', + 'inputType' => InputType::string->value, + 'value' => 'Télécharger la pancarte', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'find_us_btn_url_1' => [ + 'label' => 'Lien du bouton n°1', + 'inputType' => InputType::url->value, + "value" => "https://www.legaulois.fr/tdf-downloads/Pancarte.pdf", + "validate" => "required|string|url:http,https", + 'required' => true + ], + 'find_us_btn_text_2' => [ + 'label' => 'Texte du bouton n°2', + 'inputType' => InputType::string->value, + 'value' => 'Télécharger des coloriages', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'find_us_btn_url_2' => [ + 'label' => 'Lien du bouton n°2', + 'inputType' => InputType::url->value, + "value" => "https://www.legaulois.fr/tdf-downloads/COLORIAGE-Avril-2024.pdf", + "validate" => "required|string|url:http,https", + 'required' => true + ], + 'find_us_picture_1' => [ + 'label' => 'Image n°1 de la section n°3', + 'inputType' => 4, + 'dimensions' => [ + 'width' => 300, + 'height' => 220 + ], + 'alt' => 'Chars de la caravane Le Gaulois', + 'title' => 'Caravane Le Gaulois au mileu des supporters du Tour de France', + 'value' => '', + 'validate' => 'required', + 'required' => true + ], + 'find_us_picture_2' => [ + 'label' => 'Image n°2 de la section n°3', + 'inputType' => 4, + 'dimensions' => [ + 'width' => 300, + 'height' => 220 + ], + 'alt' => 'Char Cuisson Express Le Gaulois', + 'title' => 'Char cocotte Cuisson Express traversant un pont lors d\'une étape du Tour de France', + 'value' => '', + 'validate' => 'required', + 'required' => true + ], + 'find_us_picture_author' => [ + 'label' => 'Nom du photographe', + 'inputType' => InputType::string->value, + 'value' => 'Crédit photo - ASO Aurélien Vialatte', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'tdf_title' => [ + 'label' => 'Titre de la section n°4', + 'inputType' => InputType::string->value, + 'value' => 'Le Gaulois et le Tour de France', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'tdf_subtitle_1' => [ + 'label' => 'Sous-titre n°1 de la section n°4', + 'inputType' => InputType::string->value, + 'value' => 'Plus de 10 années', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'tdf_subtitle_2' => [ + 'label' => 'Sous-titre n°2 de la section n°4', + 'inputType' => InputType::string->value, + 'value' => ' de complicité avec le public', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'tdf_description' => [ + 'label' => 'Description de la section n°4', + 'inputType' => InputType::text->value, + 'value' => '

Les chars « Cocottes » sont devenus emblématiques de la caravane du Tour de France. Dix-huit caravaniers passionnés, dont huit femmes et dix hommes de tous âges et venus de différentes régions de France, auront l\'opportunité unique de piloter les mythiques « Cocottes » à travers le pays. Représentant la diversité et l\'esprit de partage, ces caravaniers formeront une véritable famille pendant toute la durée du Tour, unis par leur amour du sport et leur engagement envers Le Gaulois.

Les huit chars Le Gaulois, représentant les produits phares de la marque, offrent au public l\'occasion de découvrir ou redécouvrir la diversité des produits proposés : Crousty Chicken, Oui c\'est Bon !, Cordon Bleu, Filets de Poulet Rôti, Blanc de Poulet Sortant à l\'Extérieur, et Le Filet de Poulet Tranché Cuisson Express seront à l\'honneur. Deux chars multiproduits, mettant en avant la diversité de la gamme, défileront également en tête de cortège avec à leur bord l\'animateur Arthur pour enflammer les foules gauloises. En fin de défilé, le char « Roule ma Poule » viendra clore le spectacle, un clin d\'œil toujours apprécié du public.

Les chars iront à la rencontre des Français pour distribuer plus de 600 000 goodies Le Gaulois dans une atmosphère joyeuse et conviviale. Cette année, la marque offrira des capes supporters, des magnets décapsuleurs, et des milliers de bons de réduction pour découvrir les produits Le Gaulois en magasin.

', + 'validate' => 'required|string|min:15', + 'required' => true + ], + 'tdf_media' => [ + 'label' => 'Media de la section n°3', + 'inputType' => InputType::selectImageVideo->value, + 'value' => '', + 'validate' => 'required|array', + 'required' => true + ], + 'discover_title_1' => [ + 'label' => 'Titre n°1 de la section n°5', + 'inputType' => InputType::string->value, + 'value' => 'Découvrez', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'discover_title_2' => [ + 'label' => 'Titre n°2 de la section n°5', + 'inputType' => InputType::string->value, + 'value' => 'nos chars "cocottes"', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'discover_items' => [ + 'label' => 'Slider de la section n°5', + 'inputType' => InputType::slider->value, + 'value' => '', + 'validate' => 'required|array|between:2,10', + 'required' => true, + 'columns' => [ + [ + 'id' => 'picture', + 'type' => 'picture', + 'placeholder' => Str::ucFirst(__('validation.custom.picture')), + 'validation' => 'required', + 'required' => true + ], + [ + 'id' => 'picture_alt', + 'type' => 'text', + 'placeholder' => Str::ucFirst(__('validation.custom.picture_alt')), + 'validation' => 'required|string|between:3,255', + 'required' => true + ], + [ + 'id' => 'picture_title', + 'type' => 'text', + 'placeholder' => Str::ucFirst(__('validation.custom.picture_title')), + 'validation' => 'required|string|between:3,255', + 'required' => true + ], + [ + 'id' => 'subtitle', + 'type' => 'text', + 'placeholder' => Str::ucFirst(__('validation.custom.subtitle')), + 'validation' => 'sometimes|string|between:3,255', + 'required' => true + ], + [ + 'id' => 'description', + 'type' => 'wysiwyg', + 'placeholder' => Str::ucFirst(__('validation.attributes.description')), + 'validation' => 'required|string|min:15', + 'required' => true + ], + ], + 'itemLimit' => [2, 10], + 'imageSizes' => [600, 450], + ], + 'heart_title' => [ + 'label' => 'Titre de la section n°6', + 'inputType' => InputType::string->value, + 'value' => 'Au cœur de la caravane Le Gaulois', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'heart_subtitle' => [ + 'label' => 'Sous-titre de la section n°6', + 'inputType' => InputType::string->value, + 'value' => 'Nos petites anecdotes', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'heart_picture' => [ + 'label' => 'Image de fond de la section n°6', + 'inputType' => 4, + 'dimensions' => [ + 'width' => 1020, + 'height' => 680 + ], + 'alt' => 'Char \'La crousty mobile\' qui traverse un village français pendant le Tour de France', + 'title' => 'Char de la caravane Le Gaulois', + 'value' => '', + 'validate' => 'required', + 'required' => true + ], + 'heart_picture_author' => [ + 'label' => 'Nom du photographe', + 'inputType' => InputType::string->value, + 'value' => 'Crédit photo - ASO Aurélien Vialatte', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'fun_facts_title_1' => [ + 'label' => 'Titre de l\'anecdote n°1', + 'inputType' => InputType::string->value, + 'value' => 'La caravane par tous les temps !', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'fun_facts_description_1' => [ + 'label' => 'Description de l\'anecdote n°1', + 'inputType' => InputType::text->value, + 'value' => '

Le 26 juillet 2019, lors de l\'étape Saint-Jean-de-Maurienne et Tignes, les chars terminent leur parade quand un orage de grêle s\'invite et entraîne une coulée de boue qui bloque la route et l\'accès aux cyclistes. L\'organisation décide l\'arrêt de l\'étape et marquera l\'histoire du Tour de France.

', + 'validate' => 'required|string|min:15', + 'required' => true + ], + 'fun_facts_picture_1' => [ + 'label' => 'Pictogramme de l\'anecdote n°1', + 'inputType' => 4, + 'dimensions' => [ + 'width' => 80, + 'height' => 80 + ], + 'alt' => 'Pictogramme d\'un soleil pour les anecdoctes météo sur le Tour de France', + 'title' => 'Pictogramme d\'un soleil', + 'value' => '', + 'validate' => 'required', + 'required' => true + ], + 'fun_facts_title_2' => [ + 'label' => 'Titre de l\'anecdote n°2', + 'inputType' => InputType::string->value, + 'value' => 'La transmission d\'une passion entre Père & Fils !', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'fun_facts_description_2' => [ + 'label' => 'Description de l\'anecdote n°2', + 'inputType' => InputType::text->value, + 'value' => '

Avec plus de 10 tours de France à son actif, Jean-Marie a transmis sa passion à son fils. Léo assure : « Sur le Tour, nous sommes collègues, mais il y a toujours cette fierté personnelle de partager ces moments ensemble sur les routes de France. ».

', + 'validate' => 'required|string|min:15', + 'required' => true + ], + 'fun_facts_picture_2' => [ + 'label' => 'Pictogramme de l\'anecdote n°2', + 'inputType' => 4, + 'dimensions' => [ + 'width' => 80, + 'height' => 80 + ], + 'alt' => 'Pictogramme d\'une tête d\'enfant pour les liens de parenté au sein de l\'équipe des caravaniers', + 'title' => 'Pictogramme d\'un enfant', + 'value' => '', + 'validate' => 'required', + 'required' => true + ], + 'fun_facts_title_3' => [ + 'label' => 'Titre de l\'anecdote n°3', + 'inputType' => InputType::string->value, + 'value' => 'Histoire de poulet', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'fun_facts_description_3' => [ + 'label' => 'Description de l\'anecdote n°3', + 'inputType' => InputType::text->value, + 'value' => '

Avec un sens de l\'humour aguerri, Cocotte rencontre un sympathique collègue au détour d\'un passage dans un village sur les routes du Tour de France.

', + 'validate' => 'required|string|min:15', + 'required' => true + ], + 'fun_facts_picture_3' => [ + 'label' => 'Pictogramme de l\'anecdote n°3', + 'inputType' => 4, + 'dimensions' => [ + 'width' => 80, + 'height' => 80 + ], + 'alt' => 'Pictogramme d\'un poulet policier pour les histoires poulets-policiers pendants le Tour de France', + 'title' => 'Pictogramme d\'un poulet policier', + 'value' => '', + 'validate' => 'required', + 'required' => true + ], + 'fun_facts_title_4' => [ + 'label' => 'Titre de l\'anecdote n°4', + 'inputType' => InputType::string->value, + 'value' => 'Un pompier en tant que chauffeur d\'un char Le Gaulois !', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'fun_facts_description_4' => [ + 'label' => 'Description de l\'anecdote n°4', + 'inputType' => InputType::text->value, + 'value' => '

Nicolas, pompier engagé, a procédé à une intervention de secours pour une jeune caravanière Le Gaulois. Depuis, Nicolas, rebaptisé Pimpon Le Gaulois, sillonne toujours les routes de France à bord d\'un char Cocotte.

', + 'validate' => 'required|string|min:15', + 'required' => true + ], + 'fun_facts_picture_4' => [ + 'label' => 'Pictogramme de l\'anecdote n°4', + 'inputType' => 4, + 'dimensions' => [ + 'width' => 80, + 'height' => 80 + ], + 'alt' => 'Pictogramme d\'une sirène d\'alarme pour les anecdoctes insolites pendant le Tour de France', + 'title' => 'Pictorgramme d\'une alarme', + 'value' => '', + 'validate' => 'required', + 'required' => true + ], + 'testimonials_title' => [ + 'label' => 'Titre de la section n°7', + 'inputType' => InputType::string->value, + 'value' => 'Les témoignages des caravaniers', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'testimonials_items' => [ + 'label' => 'Slider de la section n°7', + 'inputType' => InputType::slider->value, + 'value' => '', + 'validate' => 'required|array|between:2,6', + 'required' => true, + 'columns' => [ + [ + 'id' => 'picture', + 'type' => 'picture', + 'placeholder' => Str::ucFirst(__('validation.custom.picture')), + 'validation' => 'required', + 'required' => true + ], + [ + 'id' => 'picture_alt', + 'type' => 'text', + 'placeholder' => Str::ucFirst(__('validation.custom.picture_alt')), + 'validation' => 'required|string|between:3,255', + 'required' => true + ], + [ + 'id' => 'picture_title', + 'type' => 'text', + 'placeholder' => Str::ucFirst(__('validation.custom.picture_title')), + 'validation' => 'required|string|between:3,255', + 'required' => true + ], + [ + 'id' => 'picture_author', + 'type' => 'text', + 'placeholder' => Str::ucFirst(__('validation.custom.picture_author')), + 'validation' => 'required|string|between:3,255', + 'required' => true + ], + [ + 'id' => 'title', + 'type' => 'text', + 'placeholder' => Str::ucFirst(__('validation.attributes.title')), + 'validation' => 'required|string|between:3,255', + 'required' => true + ], + [ + 'id' => 'subtitle', + 'type' => 'text', + 'placeholder' => Str::ucFirst(__('validation.custom.subtitle')), + 'validation' => 'nullable|string|between:3,255', + 'required' => false + ], + [ + 'id' => 'description', + 'type' => 'wysiwyg', + 'placeholder' => Str::ucFirst(__('validation.attributes.description')), + 'validation' => 'required|string|min:15', + 'required' => true + ], + [ + 'id' => 'subtitle_2', + 'type' => 'text', + 'placeholder' => Str::ucFirst(__('validation.custom.subtitle')), + 'validation' => 'required|string|between:3,255', + 'required' => true + ], + [ + 'id' => 'description_2', + 'type' => 'wysiwyg', + 'placeholder' => Str::ucFirst(__('validation.attributes.description')), + 'validation' => 'required|string|min:15', + 'required' => true + ], + ], + 'itemLimit' => [2, 6], + 'imageSizes' => [500, 333], + ], + ]; + + $staticPage = StaticPage::where('type', StaticPageType::tdf)->first(); + if ($staticPage) { + $staticPage->data = $data; + $staticPage->saveQuietly(); + } else { + StaticPage::query()->forceCreateQuietly( + [ + 'type' => StaticPageType::tdf->value(), + 'seo_title' => 'Le Gaulois | Volaille officielle du Tour de France', + 'seo_description' => 'Immergez-vous dans l\'ambiance du Tour de France avec Le Gaulois. Découvrez le jeu concours, les photos, anecdotes et témoignages de notre équipe.', + 'title' => 'Le Gaulois Le sponsor du Tour de France', + 'slug' => 'tour-de-france', + 'data' => $data + ] + ); + } + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('static_pages', function () { + $staticPage = StaticPage::query()->where('type', StaticPageType::tdf)->first(); + $staticPage->data = []; + $staticPage->saveQuietly(); + }); + } +}; diff --git a/database/migrations/2026_05_07_144145_add_section_for_oui_c_bon_page.php b/database/migrations/2026_05_07_144145_add_section_for_oui_c_bon_page.php new file mode 100644 index 00000000..10a694c0 --- /dev/null +++ b/database/migrations/2026_05_07_144145_add_section_for_oui_c_bon_page.php @@ -0,0 +1,58 @@ + [ + 'label' => 'Rechercher un éleveur : Titre', + 'inputType' => 11, + 'value' => 'retrouvez tous nos éleveurs oui c\'est bon !', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'search_description' => [ + 'label' => 'Rechercher un éleveur : Description', + 'inputType' => 12, + 'value' => '

Parce que nous sommes fiers de notre savoir-faire français et de l\'origine France de nos produits, nous vous dévoilons les éleveurs partenaires et engagés au quotidien dans notre démarche Oui c\'est Bon Le Gaulois

', + 'validate' => 'required|string|min:15', + 'required' => true + ], + ]; + + $staticPage = StaticPage::where('type', StaticPageType::ouiCBon)->first(); + + if ($staticPage && !empty($staticPage->data)) { + $staticPage->data = array_merge($staticPage->data, $data); + $staticPage->saveQuietly(); + } + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + $staticPage = StaticPage::where('type', StaticPageType::ouiCBon)->first(); + + if ($staticPage && !empty($staticPage->data)) { + $data = $staticPage->data; + + unset( + $data['search_title'], + $data['search_description'] + ); + + $staticPage->data = $data; + $staticPage->saveQuietly(); + } + } +}; diff --git a/public/newsletters/260521/assets/separation_2.png b/public/newsletters/260521/assets/separation_2.png new file mode 100644 index 00000000..cb8f8ce6 Binary files /dev/null and b/public/newsletters/260521/assets/separation_2.png differ diff --git a/public/newsletters/260521/index.html b/public/newsletters/260521/index.html index 3f24d6d0..384a6e8d 100644 --- a/public/newsletters/260521/index.html +++ b/public/newsletters/260521/index.html @@ -661,8 +661,7 @@ LES CROUSTY CHICKEN WINGS
Amenez le restaurant directement directement à la maison avec nos Wings de Poulet, des ailes de poulet marinées et panées avec une chapelure ultra croustillante. Doux ou - piquants, faîtes votre choix 🔥! - + piquants, faîtes votre choix 🔥! @@ -719,8 +718,7 @@ LES PANÉS DE POULET BURGER
🍔"Extra Croustillant" avec notre chapelure exclusive, ou "Extra Fondant" avec de l'emmental gourmand, transformez vos burgers maisons avec les nouveaux Panés Burgers Le - Gaulois. - + Gaulois. @@ -809,8 +807,7 @@ Végétal réinvente les aiguillettes panées en version végétale 🌱😋💚. Un produit élaboré à partir de blé et pois, recouvert d'une chapelure extra-croustillante pour un maximun de plaisir. Idéal pour les repas du quotidien, en salade, wraps, à - dipper... - + dipper... @@ -879,7 +876,7 @@ @@ -1253,4 +1250,4 @@ - + \ No newline at end of file diff --git a/public/tdf-downloads/COLORIAGE - Avril 2024.pdf b/public/tdf-downloads/COLORIAGE-Avril-2024.pdf similarity index 100% rename from public/tdf-downloads/COLORIAGE - Avril 2024.pdf rename to public/tdf-downloads/COLORIAGE-Avril-2024.pdf diff --git a/resources/lang/en/crud.php b/resources/lang/en/crud.php index 70d7e022..2eeee955 100644 --- a/resources/lang/en/crud.php +++ b/resources/lang/en/crud.php @@ -72,6 +72,10 @@ return [ 'picture_title_label' => 'Title attribute of the image', 'picture_alt_helper' => 'Must describe your image for search engines and blind people (5 to 6 words).', 'picture_alt_label' => 'Alt attribute of the image', + 'video_title_helper' => 'Useful for users, displayed by moving the mouse over the video', + 'video_title_label' => 'Title attribute of the video', + 'video_alt_helper' => 'Must describe your video for search engines and blind people (5 to 6 words).', + 'video_alt_label' => 'Alt attribute of the video', 'text_warning' => 'Proofread your content before publishing it', ], diff --git a/resources/lang/en/validation.php b/resources/lang/en/validation.php index 653b35a9..615e20d0 100644 --- a/resources/lang/en/validation.php +++ b/resources/lang/en/validation.php @@ -328,6 +328,12 @@ return [ 'salt' => 'salt', ], 'breeding_section_card' => 'Common breeding section', - 'common_section_part' => 'common section' + 'common_section_part' => 'common section', + 'picture' => 'image', + 'picture_author' => 'image author', + 'picture_alt' => 'image alternative text', + 'picture_title' => 'image title', + 'video_alt' => 'video alternative text', + 'video_title' => 'video title', ], ]; diff --git a/resources/lang/fr/crud.php b/resources/lang/fr/crud.php index 32f37a6b..0d0c0458 100644 --- a/resources/lang/fr/crud.php +++ b/resources/lang/fr/crud.php @@ -76,6 +76,11 @@ return [ 'picture_alt_helper' => 'Doit décrire votre image pour les moteurs de recherche et les personnes malvoyantes (5 à 6 mots).', 'picture_alt_label' => 'Attribut Alt de l\'image', + 'video_title_helper' => 'Utile pour les utilisateurs, s\'affiche en passant la souris sur la vidéo.', + 'video_title_label' => 'Attribut du titre de la vidéo', + 'video_alt_helper' => 'Doit décrire votre vidéo pour les moteurs de recherche et + les personnes malvoyantes (5 à 6 mots).', + 'video_alt_label' => 'Attribut Alt de la vidéo', 'text_warning' => 'Relisez votre contenu avant de le publier.', ], diff --git a/resources/lang/fr/validation.php b/resources/lang/fr/validation.php index c320774b..8066e716 100644 --- a/resources/lang/fr/validation.php +++ b/resources/lang/fr/validation.php @@ -346,6 +346,12 @@ return [ 'salt' => 'sel', ], 'breeding_section_card' => 'section commune des élevages', - 'common_section_part' => 'section commune' + 'common_section_part' => 'section commune', + 'picture' => 'image', + 'picture_author' => 'auteur de l\'image', + 'picture_alt' => 'texte alternatif de l\'image', + 'picture_title' => 'titre de l\'image', + 'video_alt' => 'texte alternatif de la vidéo', + 'video_title' => 'titre de la vidéo', ], ]; diff --git a/resources/sass/fo/base/_bootstrap-overload.scss b/resources/sass/fo/base/_bootstrap-overload.scss index 1f9639b0..68425add 100644 --- a/resources/sass/fo/base/_bootstrap-overload.scss +++ b/resources/sass/fo/base/_bootstrap-overload.scss @@ -52,3 +52,11 @@ .form-control::file-selector-button { font-family: #{$btn-font-family} !important; } + +.mt-16 { + margin-top: 4rem; +} + +.mt-24 { + margin-top: 6.25rem; +} diff --git a/resources/sass/fo/pages/breeding/approaches.scss b/resources/sass/fo/pages/breeding/approaches.scss index 59998f8c..54392512 100644 --- a/resources/sass/fo/pages/breeding/approaches.scss +++ b/resources/sass/fo/pages/breeding/approaches.scss @@ -230,6 +230,50 @@ } } } + + #cards-container-outside { + /* GRID */ + .card-grid { + display: grid; + width: 100%; + gap: 48px 18px; + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + /* CARD */ + .light-card { + width: 100%; + } + + /* CONTENT */ + .light-card-content.ck-content { + h1,h2,h3 { + margin-bottom: 0.5rem; + font-family: inherit; + font-size: 1.25rem; + font-weight: 600; + line-height: 1.059; + } + + p { + padding-right: 1rem; + margin-bottom: 0.7rem; + } + + ul { + padding-left: 1.2rem; + margin-bottom: 1rem; + } + + small { + display: block; + padding-right: 1rem; + color: #666; + font-size: 0.875rem; + font-style: italic; + } + } +} } #les-elevages { @@ -258,6 +302,13 @@ } } +@media (width <= 767.98px) { + #cards-container-outside .card-grid { + gap: 32px; + grid-template-columns: 1fr; + } +} + .breeding-header-translate-right { @include media-breakpoint-up(lg) { right: -18rem !important; diff --git a/resources/sass/fo/pages/commitments.scss b/resources/sass/fo/pages/commitments.scss index 525ef67e..0fc1677d 100644 --- a/resources/sass/fo/pages/commitments.scss +++ b/resources/sass/fo/pages/commitments.scss @@ -399,9 +399,13 @@ &-reversed { top: -3rem; - right: 2rem; + right: -2rem; left: auto; width: 6rem; + + @include media-breakpoint-up(xxl) { + right: 2rem; + } } } diff --git a/resources/ts/bo/bo.ts b/resources/ts/bo/bo.ts index cd94d30d..f3a1468f 100644 --- a/resources/ts/bo/bo.ts +++ b/resources/ts/bo/bo.ts @@ -1,11 +1,13 @@ // ASSETS /// import.meta.glob(["./../../assets/images/**"]); +import { initMediaSelector } from "./utilities/media-selector"; // UTILITIES import "./utilities/bootstrap"; import "./utilities/fontawesome"; import "./utilities/vue-bo"; +window.initMediaSelector = initMediaSelector; // MODULES import "./../modules/sweetalert"; diff --git a/resources/ts/bo/components/SliderComponent.vue b/resources/ts/bo/components/SliderComponent.vue new file mode 100644 index 00000000..2f800a29 --- /dev/null +++ b/resources/ts/bo/components/SliderComponent.vue @@ -0,0 +1,285 @@ + + + diff --git a/resources/ts/bo/utilities/fontawesome.ts b/resources/ts/bo/utilities/fontawesome.ts index d8636fcf..4ff6728a 100644 --- a/resources/ts/bo/utilities/fontawesome.ts +++ b/resources/ts/bo/utilities/fontawesome.ts @@ -85,7 +85,10 @@ import { faUndoAlt, faUserTie, faUtensils, - faWandMagic + faWandMagic, + faBicycle, + faChevronDown, + faChevronUp } from "@fortawesome/free-solid-svg-icons"; config.autoReplaceSvg = false; @@ -175,5 +178,8 @@ library.add(faComments); library.add(faRug); library.add(faBasketShopping); library.add(faArrowTurnUp); +library.add(faBicycle); +library.add(faChevronDown); +library.add(faChevronUp); dom.watch(); diff --git a/resources/ts/bo/utilities/media-selector.ts b/resources/ts/bo/utilities/media-selector.ts new file mode 100644 index 00000000..767ece12 --- /dev/null +++ b/resources/ts/bo/utilities/media-selector.ts @@ -0,0 +1,49 @@ +export function initMediaSelector(id: string) { + const container = document.getElementById(`${id}Section`); + if (container === null) { + return; + } + + const mediaVideo = document.getElementById("mediaSelectorVideo") as HTMLInputElement, + mediaImage = document.getElementById("mediaSelectorImage") as HTMLInputElement, + mediaEmpty = document.getElementById("mediaSelectorEmpty") as HTMLInputElement; + + mediaVideo?.addEventListener("change", function() { + hideFormPart(`.${id}Picture`); + showFormPart(`.${id}Video`); + hideFormPart(`.${id}None`); + }); + + mediaImage?.addEventListener("change", function() { + hideFormPart(`.${id}Video`); + showFormPart(`.${id}Picture`); + hideFormPart(`.${id}None`); + }); + + mediaEmpty?.addEventListener("change", function() { + hideFormPart(`.${id}Video`); + hideFormPart(`.${id}Picture`); + showFormPart(`.${id}None`); + }); +} + +function hideFormPart(id: string) { + const parts = document.querySelectorAll(id); + parts.forEach(partToHide => { + partToHide.classList.add("d-none"); + const inputs = partToHide.querySelectorAll("input"); + for (const input of inputs) { + input.disabled = true; + } + }); +} +function showFormPart(id: string) { + const parts = document.querySelectorAll(id); + parts.forEach(partToShow => { + partToShow.classList.remove("d-none"); + const inputs = partToShow.querySelectorAll("input"); + for (const input of inputs) { + input.disabled = false; + } + }); +} diff --git a/resources/ts/index.d.ts b/resources/ts/index.d.ts index 9f8555ee..def906b2 100644 --- a/resources/ts/index.d.ts +++ b/resources/ts/index.d.ts @@ -5,6 +5,7 @@ import { AxiosStatic } from "axios"; import type Swiper from "swiper"; import type { DepStatus as DepStatusEnum } from "./club/enums"; import type { MenuNodeInterface } from "./types/models/MenuNode"; +import { initMediaSelector } from "./bo/utilities/media-selector"; // * Enum interface EnumInterface { @@ -141,6 +142,7 @@ declare global { Swal: Function; shop: ClubShop; vueDebug: boolean | undefined; + initMediaSelector: initMediaSelector; __SLIDERS: Map, __SYSTEM: { _asset: Record; diff --git a/resources/views/bo/layouts/sidemenu.blade.php b/resources/views/bo/layouts/sidemenu.blade.php index d4d65812..aa542230 100644 --- a/resources/views/bo/layouts/sidemenu.blade.php +++ b/resources/views/bo/layouts/sidemenu.blade.php @@ -1176,7 +1176,7 @@ + {{-- TDF PAGE --}} + @if (isset($tdfStaticPageModel)) + + url()->current() === + route('bo.static_pages.edit', $tdfStaticPageModel->type->value()), + ])> + + url()->current() === + route('bo.static_pages.edit', $tdfStaticPageModel->type->value()), + ])> + {{ $tdfStaticPageModel->type->label() }} + + @endif
{{-- CONTACT --}} @if(isset($contactStaticPageModel)) diff --git a/resources/views/bo/modules/minicrud-form-inputs.blade.php b/resources/views/bo/modules/minicrud-form-inputs.blade.php index d83ce4ad..26652f5e 100644 --- a/resources/views/bo/modules/minicrud-form-inputs.blade.php +++ b/resources/views/bo/modules/minicrud-form-inputs.blade.php @@ -246,6 +246,58 @@ @break + @case(intval(\App\Enums\InputType::selectImageVideo->value)) +
+
+ {{ $input['label'] }}* +
+
+ @include('bo.partials.inputs.media-selector', [ + 'id' => Str::camel($k), + 'name' => $k, + 'value' => old("data.{$k}.value", $input['value'] ?? null), + 'required' => isset($input['required']) ? !empty($input['required']) : true, + 'model' => $model ?? null, + 'helper' => + __('crud.minicrud.text_warning') . + '. ' . + __('validation.min.string', [ + 'attribute' => $input['label'], + 'min' => 3, + ]), + ]) + @include('modules.input-error', [ + 'inputName' => "data.{$k}.value", + ]) +
+
+
+
+ @break + + @case(intval(\App\Enums\InputType::slider->value)) +
+
+ {{ $input['label'] }}* +
+
+ @include('bo.partials.inputs.slider', [ + 'id' => Str::camel($k), + 'name' => $k, + 'value' => old("data.{$k}.value", $input['value'] ?? null), + 'model' => $model ?? null, + 'columns' => $input['columns'], + 'itemLimit' => $input['itemLimit'], + 'imageSizes' => $input['imageSizes'], + 'required' => isset($input['required']) ? !empty($input['required']) : true, + 'helper' => '', + ]) +
+
+
+
+ @break + @default @php throw new Exception('Input type not handled'); @endphp @endswitch diff --git a/resources/views/bo/pages/sections_approaches/edit.blade.php b/resources/views/bo/pages/sections_approaches/edit.blade.php index 8851658e..3a12628c 100644 --- a/resources/views/bo/pages/sections_approaches/edit.blade.php +++ b/resources/views/bo/pages/sections_approaches/edit.blade.php @@ -1,10 +1,13 @@ @extends('bo.layout', ['brParam' => $sectionApproachModel]) - +@php + $condition = trans_choice('models.classes.sectionApproach', 1); + $inter = __('validation.custom.of_the.female'); +@endphp -@section('title', __('Édition :inter :model', ['model' => $condition])) -@section('description', __('Édition :inter :model', - ['model' => $condition, 'inter' => __('validation.custom.female') ])) + +@section('title', __('Édition :inter :model', ['model' => $condition, 'inter' => $inter])) +@section('description', __('Édition :inter :model', ['model' => $condition, 'inter' => __('validation.custom.female')])) @section('breadcrumb', request()->route()->getName()) @section('content') @@ -16,7 +19,7 @@ @include('modules.breadcrumbs.breadcrumb-body', [ - 'brParam' => $sectionApproachModel + 'brParam' => $sectionApproachModel, ])
@@ -26,9 +29,8 @@
-
+ @csrf @method('PUT') @include('bo.pages.sections_approaches.form') @@ -36,7 +38,7 @@
diff --git a/resources/views/bo/partials/inputs/media-selector.blade.php b/resources/views/bo/partials/inputs/media-selector.blade.php new file mode 100644 index 00000000..978d5d38 --- /dev/null +++ b/resources/views/bo/partials/inputs/media-selector.blade.php @@ -0,0 +1,163 @@ +
+ {{-- BUTTONS SELECTOR --}} +
+
+ data[$name]['value']['video']))> + + data[$name]['value']['picture']))> + + @if (!$required) + data[$name]['value']['video']) && empty($model->data[$name]['value']['picture']))> + + @endif +
+
+ + {{-- HIDDEN EMPTY MEDIA INPUT --}} + + + {{-- VIDEO --}} +
empty($model->data[$name]['value']['video']), + ])> + {{-- VIDEO ID --}} + @include('bo.partials.inputs.varchar', [ + 'id' => sprintf("%sVideoId", $id), + 'label' => Str::ucFirst(__('validation.custom.video_id')), + 'hasWordCounter' => true, + 'name' => "data[$name][value][video][id]", + 'required' => true, + 'disabled' => empty($model->data[$name]['value']['video']), + 'value' => $model->data[$name]['value']['video']['id'] ?? null, + 'helper' => Str::ucFirst(__('validation.custom.video_id')), + 'placeholder' => Str::ucFirst(__('validation.custom.video_id')), + ]) +
+ {{-- VIDEO_ALT --}} +
empty($model->data[$name]['value']['video']), + ])> + @include('bo.partials.inputs.varchar', [ + 'id' => sprintf("%sVideoAlt", $id), + 'label' => Str::ucFirst(__('validation.custom.video_alt')), + 'hasWordCounter' => true, + 'name' => "data[$name][value][video][alt]", + 'required' => true, + 'model' => $model ?? null, + 'disabled' => empty($model->data[$name]['value']['video']['alt']), + 'value' => $model->data[$name]['value']['video']['alt'] ?? '', + 'helper' => __('crud.minicrud.video_alt_helper') . ' ' . __('validation.between.string', [ + 'attribute' => Str::ucFirst(__('validation.custom.video_alt')), + 'min' => 6, + 'max' => 255 + ]), + 'placeholder' => Str::ucFirst(__('validation.custom.video_alt')), + ]) +
+ {{-- VIDEO_TITLE --}} +
empty($model->data[$name]['value']['video']), + ])> + @include('bo.partials.inputs.varchar', [ + 'id' => sprintf("%sVideoTitle", $id), + 'label' => Str::ucFirst(__('validation.custom.video_title')), + 'hasWordCounter' => true, + 'name' => "data[$name][value][video][title]", + 'required' => true, + 'model' => $model ?? null, + 'disabled' => empty($model->data[$name]['value']['video']['title']), + 'value' => $model->data[$name]['value']['video']['title'] ?? '', + 'helper' => __('crud.minicrud.video_title_helper') . ' ' . __('validation.between.string', [ + 'attribute' => Str::ucFirst(__('validation.custom.video_title')), + 'min' => 6, + 'max' => 255 + ]), + 'placeholder' => Str::ucFirst(__('validation.custom.video_title')), + ]) +
+ {{-- PICTURE --}} +
empty($model->data[$name]['value']['picture']), + ])> + @include('bo.partials.inputs.varchar-picture', [ + 'id' => sprintf("%sPicture", $id), + 'name' => "data[$name][value][picture][path]", + 'width' => 500, + 'height' => 500, + 'model' => $model ?? null, + 'value' => $model->data[$name]['value']['picture']['path'] ?? null, + 'helper' => __('crud.minicrud.dimensions_must_be', [ + 'width' => 500, + 'height' => 500, + ]), + 'required' => true, + 'preview' => false, + ]) +
+ {{-- PICTURE_ALT --}} +
empty($model->data[$name]['value']['picture']), + ])> + @include('bo.partials.inputs.varchar', [ + 'id' => sprintf("%sPictureAlt", $id), + 'label' => Str::ucFirst(__('validation.custom.picture_alt')), + 'hasWordCounter' => true, + 'name' => "data[$name][value][picture][alt]", + 'required' => true, + 'model' => $model ?? null, + 'disabled' => empty($model->data[$name]['value']['picture']['alt']), + 'value' => $model->data[$name]['value']['picture']['alt'] ?? '', + 'helper' => __('crud.minicrud.picture_alt_helper') . ' ' . __('validation.between.string', [ + 'attribute' => Str::ucFirst(__('validation.custom.picture_alt')), + 'min' => 6, + 'max' => 255 + ]), + 'placeholder' => Str::ucFirst(__('validation.custom.picture_alt')), + ]) +
+ {{-- PICTURE_TITLE --}} +
empty($model->data[$name]['value']['picture']), + ])> + @include('bo.partials.inputs.varchar', [ + 'id' => sprintf("%sPictureTitle", $id), + 'label' => Str::ucFirst(__('validation.custom.picture_title')), + 'hasWordCounter' => true, + 'name' => "data[$name][value][picture][title]", + 'required' => true, + 'model' => $model ?? null, + 'disabled' => empty($model->data[$name]['value']['picture']['title']), + 'value' => $model->data[$name]['value']['picture']['title'] ?? '', + 'helper' => __('crud.minicrud.picture_title_helper') . ' ' . __('validation.between.string', [ + 'attribute' => Str::ucFirst(__('validation.custom.picture_title')), + 'min' => 6, + 'max' => 255 + ]), + 'placeholder' => Str::ucFirst(__('validation.custom.picture_title')), + ]) +
+ {{-- NOTHING SELECTED --}} +
!empty($model->data[$name]['value']['picture']) || !empty($model->data[$name]['value']['video']), + ])> +

{{ __('Aucun média n\'est sélectionné') }}

+
+
+ +@push('scripts') + +@endpush diff --git a/resources/views/bo/partials/inputs/slider.blade.php b/resources/views/bo/partials/inputs/slider.blade.php new file mode 100644 index 00000000..eb4542ae --- /dev/null +++ b/resources/views/bo/partials/inputs/slider.blade.php @@ -0,0 +1,18 @@ +@php + $data = [ + 'itemList' => old($name, $value ?? []) ?? [], + 'columns' => $columns, + 'itemLimit' => $itemLimit ?? [], + 'inputName' => $name, + 'imageSizes' => $imageSizes ?? [], + 'wysiwygConfig' => $wysiwygConfig ?? 'basic', + 'header' => $header ?? false, + 'errors' => $errors->getBag('default')->getMessages() ?? [], + ]; +@endphp +
+@include('modules.input-error', [ + 'inputName' => $name, + 'helperId' => "{$id}Help", + 'helper' => $helper, +]) diff --git a/resources/views/components/fo/breeding/light-card.blade.php b/resources/views/components/fo/breeding/light-card.blade.php index c242fe61..9b1c6126 100644 --- a/resources/views/components/fo/breeding/light-card.blade.php +++ b/resources/views/components/fo/breeding/light-card.blade.php @@ -1,29 +1,11 @@ -
+
{{ $icon['alt'] }} {{ $category }} -
- @foreach ($content as $section) - @if(isset($section['title'])) -

{{ $section['title'] }}

- @endif - @if (array_key_exists('points', $section) && !empty($section['points'])) -
    - @foreach ($section['points'] as $point) -
  • {!! $point !!}
  • - @endforeach -
- @endif - @if (array_key_exists('text', $section) && !empty($section['text'])) -

{{ $section['text'] }}

- @endif - - @if (array_key_exists('asterisc', $section) && !empty($section['asterisc'])) - {{ $section['asterisc'] }} - @endif - @endforeach +
+ {!! clean($content) !!}
diff --git a/resources/views/components/fo/breeding/section/header-section.blade.php b/resources/views/components/fo/breeding/section/header-section.blade.php index 8b464452..4aa54583 100644 --- a/resources/views/components/fo/breeding/section/header-section.blade.php +++ b/resources/views/components/fo/breeding/section/header-section.blade.php @@ -14,30 +14,30 @@
@if (isset($badge) && !empty($badge))
- {{ $badge->label }} + {!! clean($badge->label) !!}
@endif
@if (isset($badge) && !empty($picto)) - {{ $picto_alt }} @endif -

{{ $title }}

+

{!! clean($title) !!}

-

{{ $subtitle }} +

{!! clean($subtitle) !!}

{{ $alt_img }} + title="{!! clean($title_img) !!}" alt="{!! clean($alt_img) !!}">
{{ $alt_img }} + title="{!! clean($title_img) !!}" alt="{!! clean($alt_img) !!}">
diff --git a/resources/views/components/fo/breeding/section/oui-c-est-bon/cahier-des-charges-section.blade.php b/resources/views/components/fo/breeding/section/oui-c-est-bon/cahier-des-charges-section.blade.php index 77f5d717..4ddc1b4c 100644 --- a/resources/views/components/fo/breeding/section/oui-c-est-bon/cahier-des-charges-section.blade.php +++ b/resources/views/components/fo/breeding/section/oui-c-est-bon/cahier-des-charges-section.blade.php @@ -20,9 +20,9 @@
-

- {{ __(strip_tags($staticPageModel->data['description']['value'])) }} -

+
+ {!! clean($staticPageModel->data['description']['value']) !!} +
@@ -45,13 +45,14 @@
@foreach ($categoryItems as $item) - +
+ +
@endforeach
@endforeach diff --git a/resources/views/components/fo/breeding/section/oui-c-est-bon/search-breeders-section.blade.php b/resources/views/components/fo/breeding/section/oui-c-est-bon/search-breeders-section.blade.php index d175b45a..eaf5f8c1 100644 --- a/resources/views/components/fo/breeding/section/oui-c-est-bon/search-breeders-section.blade.php +++ b/resources/views/components/fo/breeding/section/oui-c-est-bon/search-breeders-section.blade.php @@ -1,13 +1,13 @@ +@props(['titleSearch' => '', 'descriptionSearch' => '', 'ocbBreederModels'])

- {{ __('Retrouvez tous nos éleveurs Oui c\'est Bon !') }} + {!! clean(__($titleSearch)) !!}

-

{{ __('Parce que nous sommes fiers de notre savoir-faire français et de l\'origine France de nos produits, - nous vous dévoilons les éleveurs partenaires et engagés au quotidien dans notre démarche Oui c\'est Bon Le Gaulois') }}

+

{!! clean(__($descriptionSearch)) !!}

@php diff --git a/resources/views/components/fo/breeding/section/sortant-a-l-exterieur/cahier-des-charges-section.blade.php b/resources/views/components/fo/breeding/section/sortant-a-l-exterieur/cahier-des-charges-section.blade.php index 3831eda2..0a4bcd3e 100644 --- a/resources/views/components/fo/breeding/section/sortant-a-l-exterieur/cahier-des-charges-section.blade.php +++ b/resources/views/components/fo/breeding/section/sortant-a-l-exterieur/cahier-des-charges-section.blade.php @@ -22,19 +22,16 @@
-

- {{ __(strip_tags($staticPageModel->data['description']['value'])) }} -

+
+ {!! clean($staticPageModel->data['description']['value']) !!} +
{{-- Buttons --}} -
+
@foreach ($items as $categoryKey => $categoryItems) - @endforeach @@ -43,16 +40,16 @@
@foreach ($items as $categoryKey => $categoryItems) -
@foreach ($categoryItems as $item) - +
+ +
@endforeach
@endforeach diff --git a/resources/views/components/fo/breeding/section/sortant-a-l-exterieur/galery-section.blade.php b/resources/views/components/fo/breeding/section/sortant-a-l-exterieur/galery-section.blade.php index e73ce63c..932a2fbb 100644 --- a/resources/views/components/fo/breeding/section/sortant-a-l-exterieur/galery-section.blade.php +++ b/resources/views/components/fo/breeding/section/sortant-a-l-exterieur/galery-section.blade.php @@ -1,10 +1,10 @@ -@props(['sliderImages' => []]) +@props(['sliderImages' => [], 'title'])
-

{{ __("Galerie sortant à l'extérieur") }}

+

{!! clean(__($title)) !!}

diff --git a/resources/views/components/fo/page-tdf/au-coeur-de-la-caravane.blade.php b/resources/views/components/fo/page-tdf/au-coeur-de-la-caravane.blade.php index cf361f8d..940b78ec 100644 --- a/resources/views/components/fo/page-tdf/au-coeur-de-la-caravane.blade.php +++ b/resources/views/components/fo/page-tdf/au-coeur-de-la-caravane.blade.php @@ -1,62 +1,74 @@ @php $anecdotes = [ [ - 'picto_url' => Vite::asset('resources/assets/images/page-tdf/caravane/Picto-soleil-jaune-météo.svg'), - 'picto_alt' => 'Pictogramme d\'un soleil pour les anecdoctes météo sur le Tour de France', - 'picto_title' => 'Pictogramme d\'un soleil', - 'title' => 'La caravane par tous les temps !', - 'content' => - 'Le 26 juillet 2019, lors de l\'étape Saint-Jean-de-Maurienne et Tignes, les chars terminent leur parade quand un orage de grêle s\'invite et entraîne une coulée de boue qui bloque la route et l’accès aux cyclistes. L’organisation décide l\'arrêt de l’étape et marquera l’histoire du Tour de France.', + 'picto_url' => asset($model->data['fun_facts_picture_1']['value']), + 'picto_alt' => $model->data['fun_facts_picture_1']['alt'], + 'picto_title' => $model->data['fun_facts_picture_1']['title'], + 'title' => $model->data['fun_facts_title_1']['value'], + 'content' => $model->data['fun_facts_description_1']['value'], ], [ - 'picto_url' => Vite::asset('resources/assets/images/page-tdf/caravane/Picto-enfant-brun-famille.svg'), - 'picto_alt' => 'Pictogramme d\'une tête d\'enfant pour les liens de parenté au sein de l\'équipe des caravaniers', - 'picto_title' => 'Pictogramme d\'un enfant', - 'title' => 'La transmission d’une passion entre Père & Fils !', - 'content' => - 'Avec plus de 10 tours de France à son actif, Jean-Marie a transmis sa passion à son fils. Léo assure : « Sur le Tour, nous sommes collègues, mais il y a toujours cette fierté personnelle de partager ces moments ensemble sur les routes de France. ».', + 'picto_url' => asset($model->data['fun_facts_picture_2']['value']), + 'picto_alt' => $model->data['fun_facts_picture_2']['alt'], + 'picto_title' => $model->data['fun_facts_picture_2']['title'], + 'title' => $model->data['fun_facts_title_2']['value'], + 'content' => $model->data['fun_facts_description_2']['value'], ], [ - 'picto_url' => Vite::asset('resources/assets/images/page-tdf/caravane/Picto-poulet-policier-bleu.svg'), - 'picto_alt' => 'Pictogramme d\'un poulet policier pour les histoires poulets-policiers pendants le Tour de France', - 'picto_title' => 'Pictogramme d\'un poulet policier', - 'title' => 'Histoire de poulet', - 'content' => - 'Avec un sens de l’humour aguerri, Cocotte rencontre un sympathique collègue au détour d’un passage dans un village sur les routes du Tour de France.', + 'picto_url' => asset($model->data['fun_facts_picture_3']['value']), + 'picto_alt' => $model->data['fun_facts_picture_3']['alt'], + 'picto_title' => $model->data['fun_facts_picture_3']['title'], + 'title' => $model->data['fun_facts_title_3']['value'], + 'content' => $model->data['fun_facts_description_3']['value'], ], [ - 'picto_url' => Vite::asset('resources/assets/images/page-tdf/caravane/Picto-sirène-pompier-rouge.svg'), - 'picto_alt' => 'Pictogramme d\'une sirène d\'alarme pour les anecdoctes insolites pendant le Tour de France', - 'picto_title' => 'Pictorgramme d\'une alarme', - 'title' => 'Un pompier en tant que chauffeur d’un char Le Gaulois !', - 'content' => - 'Nicolas, pompier engagé, a procédé à une intervention de secours pour une jeune caravanière Le Gaulois. Depuis, Nicolas, rebaptisé Pimpon Le Gaulois, sillonne toujours les routes de France à bord d\'un char Cocotte.', + 'picto_url' => asset($model->data['fun_facts_picture_4']['value']), + 'picto_alt' => $model->data['fun_facts_picture_4']['alt'], + 'picto_title' => $model->data['fun_facts_picture_4']['title'], + 'title' => $model->data['fun_facts_title_4']['value'], + 'content' => $model->data['fun_facts_description_4']['value'], ], ]; @endphp
-

Au cœur de la caravane Le Gaulois

+

+ {{ $model->data['heart_title']['value'] }} +

- Char 'La crousty mobile' qui traverse un village français pendant le Tour de France + {{ $model->data['heart_picture']['alt'] }}
-

Nos petites anecdotes

-
+

+ {{ $model->data['heart_subtitle']['value'] }} +

+
@foreach ($anecdotes as $a)
- {{ $a['picto_alt'] }} + {{ $a['picto_alt'] }}
-
{{ $a['title'] }}
-

{!! $a['content'] !!}

+
+ {!! clean($a['title']) !!} +
+
+ {!! clean($a['content']) !!} +
@endforeach @@ -68,5 +80,5 @@
- Crédit photo - ASO Aurélien Vialatte + {{ $model->data['heart_picture_author']['value'] }}
diff --git a/resources/views/components/fo/page-tdf/char-slider.blade.php b/resources/views/components/fo/page-tdf/char-slider.blade.php index d9c8b198..33f80b02 100644 --- a/resources/views/components/fo/page-tdf/char-slider.blade.php +++ b/resources/views/components/fo/page-tdf/char-slider.blade.php @@ -1,74 +1,5 @@ @php - $sliders = [ - [ - 'img' => Vite::asset('resources/assets/images/page-tdf/chars-slider/Char-cocotte-roule-ma-poule-Le-Gaulois.png'), - 'alt' => - '"Char" La cocotte multiproduits" avec les packagings du filet de canard, du poulet à la mexicaine et des gésiers de volaille Le Gaulois', - 'title_img' => '"Char" La cocotte multiproduits" Le Gaulois', - 'title' => 'La Cocotte multiproduits', - 'content' => - "Variée et savoureuse, la Cocotte mutiproduits présente les incontournables de votre frigo, pour toute la famille et pour toute l'année. Et vous, quel est votre produit préféré Le Gaulois ?", - ], - [ - 'img' => Vite::asset('resources/assets/images/page-tdf/chars-slider/Char-cocotte-cordon-bleu-Le-Gaulois.png'), - 'alt' => 'Char "La cocotte panée"avec le packaging du cordon bleu de poulet Le Gaulois', - 'title_img' => 'Char "La cocotte panée" Le Gaulois', - 'title' => 'La Cocotte Panée', - 'content' => - 'Moelleuse, croustillante et fondante, la Cocotte Panée arpente les régions françaises à la découverte du nouveau Cordon Bleu culinaire ! Quel sera le nouveau chef cuisinier du Tour de France ?', - ], - [ - 'img' => Vite::asset('resources/assets/images/page-tdf/chars-slider/Char-cocotte-crousty-chicken-Le-Gaulois.png'), - 'alt' => 'Char "La crousty mobile" avec une box de crousty chicken Le Gaulois', - 'title_img' => 'Char "La crousty mobile" Le Gaulois', - 'title' => 'La Crousty Mobile', - 'content' => - 'Généreuse et gourmande, la Crousty Mobile saura vous régaler ! Et vous, à quelle occasion mangeriez-vous les Crousty Chicken ?', - ], - [ - 'img' => Vite::asset('resources/assets/images/page-tdf/chars-slider/Char-cocotte-cuisson-express-poulet-Le-Gaulois.png'), - 'alt' => 'Char "La cocotte express"avec le packaging du filet de poulet tranché Cuisson Express Le Gaulois', - 'title_img' => 'Char "La cocotte express" Le Gaulois', - 'title' => 'La Cocotte Express', - 'content' => - 'Rapide à cuisiner, la Cocotte Express est dans la course ! Battra-t\'elle suffisamment des ailes pour décrocher le maillot jaune ?', - ], - [ - 'img' => Vite::asset( - 'resources/assets/images/page-tdf/chars-slider/Char-cocotte-blanc-poulet-sortant à l\'extérieur-Le-Gaulois.png', - ), - 'alt' => 'Char " La cocotte Sortant à l\'Extérieur" avec le packaging du blanc de poulet sortant à l\'extérieur Le Gaulois', - 'title_img' => 'Char " La cocotte Sortant à l\'Extérieur" Le Gaulois', - 'title' => 'La Cocotte Sortant à l\'extérieur', - 'content' => - 'Sortant à l\'extérieur, la Cocotte profite de la lumière et de la nature pour observer nos plus belles régions de France. Selon vous, quelle est la meilleure étape du Tour ?', - ], - [ - 'img' => Vite::asset('resources/assets/images/page-tdf/chars-slider/Char-cocotte-filet-poulet-rôti-Le-Gaulois.png'), - 'alt' => 'Char "La cocotte rôtie"avec le packaging du filet de poulet rôti Le Gaulois', - 'title_img' => 'Char " La cocotte rôtie" Le Gaulois', - 'title' => 'La Cocotte Rôtie', - 'content' => - "Prête à consommer chaud ou froid, la Cocotte rôtie profite du Tour de France pour renforcer son bronzage. Et oui, c'est ça le secret du poulet rôti Le Gaulois !", - ], - [ - 'img' => Vite::asset('resources/assets/images/page-tdf/chars-slider/Char-cocotte-multiproduits-Le-Gaulois.png'), - 'alt' => - 'Char " La cocotte roule ma poule" avec les packagings du poulet fumé, des brochettes de dinde, du crousty chicken et de la belle escalope Le Gaulois', - 'title_img' => 'Char " La cocotte roule ma poule" Le Gaulois', - 'title' => 'La Cocotte Roule ma poule', - 'content' => - 'Sain et gourmand, le panier plaisir défile les étapes du Tour de France pour vous accompagner à mieux manger. Et vous, quelle est votre produit préféré Le Gaulois ?', - ], - [ - 'img' => Vite::asset('resources/assets/images/page-tdf/chars-slider/Char-cocotte-filet-poulet-Oui c\'est bon-Le-Gaulois.png'), - 'alt' => 'Char "La cocotte Oui c\'est Bon"avec le packaging du filet de poulet Oui c\'est Bon Le Gaulois', - 'title_img' => 'Char "La cocotte Oui c\'est Bon" Le Gaulois', - 'title' => 'La Cocotte Oui c\'est Bon', - 'content' => - 'Tendre et de qualité, la Cocotte Oui c\'est Bon s\'adapte à tous les repas du quotidien, pour les petits et les grands ! Alors avez-vous retrouvé votre éleveur grâce à la traçabilité ?', - ], - ]; + $sliders = $model->data['discover_items']['value']; @endphp
@@ -76,9 +7,8 @@
-

Découvrez nos - chars - "cocottes" +

{{ $model->data['discover_title_1']['value'] }} + {{ $model->data['discover_title_2']['value'] }}

@@ -90,13 +20,15 @@
- {{ $slide['alt'] }} + {{ $slide['picture_alt'] }}
-

{{ $slide['title'] }}

-

{{ $slide['content'] }}

+

{{ $slide['subtitle'] }}

+
+ {!! clean($slide['description']) !!} +
diff --git a/resources/views/components/fo/page-tdf/game.blade.php b/resources/views/components/fo/page-tdf/game.blade.php index 872a1fac..96ad3f1d 100644 --- a/resources/views/components/fo/page-tdf/game.blade.php +++ b/resources/views/components/fo/page-tdf/game.blade.php @@ -1,93 +1,112 @@
-
+
!$model->data['play_display_section']['value'] + ])>
-
-
-
-
- 100% Gagnant + @if ($model->data['play_display_section']['value']) +
+
+
+
+ {{ $model->data['play_picture']['alt'] }} +
-
-
-

Jouez et tentez de gagner !

-

Participez à notre jeu 100% gagnant - Le Gaulois pendant le - Tour de France 2025.

- Je tente - ma chance - ! -
-
- Ensemble TV-Home cinéma à gagner pendant le jeu TDF 100% gagnant Le Gaulois -
Ensembles TV + Home Cinema
+
+

{{ $model->data['play_title']['value'] }}

+
+ {!! clean($model->data['play_description']['value']) !!}
-
- Casques audios oreilles libres à gagner pendant le jeu TDF 100% gagnant Le Gaulois -
casques audios oreilles libres
-
-
-  Bons de réduction à gagner pendant le jeu TDF 100% gagnant Le Gaulois -
Bons d'achat
+ + {{ $model->data['play_btn_text']['value'] }} + +
+
+ {{ $model->data['prize_picture_1']['alt'] }} +
{{ $model->data['prize_title_1']['value'] }}
+
+
+ {{ $model->data['prize_picture_2']['alt'] }} +
{{ $model->data['prize_title_2']['value'] }}
+
+
+ {{ $model->data['prize_picture_3']['alt'] }} +
{{ $model->data['prize_title_3']['value'] }}
+
-
-
-
+ @endif +
+
$model->data['play_display_section']['value'] + ]) id="come">
- Point d'exclamation + {{ $model->data['find_us_picture']['alt'] }}
- Venez nous retrouver sur le parcours du Tour de France + {{ $model->data['find_us_title']['value'] }} +
+
+ {!! $model->data['find_us_description']['value'] !!}
-

Télécharger notre pancarte et retrouver nous sur la route du tour de France !

-

Le Tour de France est un rendez-vous immanquable qui marque le début de la pause estivale. Venez - nous rejoindre au bord des routes avec votre pancarte Cocotte Le Gaulois ! Lorsque l’animateur du - char - d’ouverture de la caravane, Arthur, et ses acolytes caravaniers et caravanières vous repèrent, ils vous - enverront des petits cadeaux.

-

Petit conseil : En agitant fièrement votre pancarte, vous augmenterez vos chances de recevoir - des cadeaux !

- Chars de la caravane Le Gaulois + {{ $model->data['find_us_picture_1']['alt'] }}
- Char Cuisson Express Le Gaulois + {{ $model->data['find_us_picture_2']['alt'] }}
-
+
!$model->data['play_display_section']['value'] + ])>
- Crédit photo - ASO Aurélien Vialatte + {{ $model->data['find_us_picture_author']['value'] }}
diff --git a/resources/views/components/fo/page-tdf/hero.blade.php b/resources/views/components/fo/page-tdf/hero.blade.php index f5e81a62..6f644834 100644 --- a/resources/views/components/fo/page-tdf/hero.blade.php +++ b/resources/views/components/fo/page-tdf/hero.blade.php @@ -2,39 +2,29 @@
- TOUR DE FRANCE 2025 -
Accueil / Le Gaulois Le sponsor du Tour de France
+ {{ $model->data['highlight_text']['value'] }} +
{{ $model->subtitle }}
-

Le Gaulois en selle pour le tour de - France

+

{{ $model->data['banner_title']['value'] }}

-

- Depuis 2015, Le Gaulois est fier d’être la volaille officielle du Tour de France. Un évènement - populaire marquant le début de la pause estivale qui s’adresse à tous les Français, un rendez-vous immanquable pour des - milliers de passionnés aux bords des routes ou devant leur télévision. La convivialité, le partage et la bonne - humeur - sont au rendez-vous et c’est ce bon vivre à la française que la caravane Le Gaulois véhicule en - sillonnant les routes de - France chaque année. Des milliers de cadeaux sont distribués pour ravir les petits comme les plus grands. La - participation à cet évènement est également l’occasion de réaffirmer auprès du public, l’engagement sur - l’origine 100% - française des volailles Le Gaulois ! -

+
+ {!! clean($model->content) !!} +
- Logo volaille officielle de Le Gaulois et le Tour de France + {{ $model->data['banner_picture']['alt'] }}
- Crédit photo - ASO Aurélien Vialatte + {{ $model->data['find_us_picture_author']['value'] }}
diff --git a/resources/views/components/fo/page-tdf/ten-years.blade.php b/resources/views/components/fo/page-tdf/ten-years.blade.php index 05aeffd8..1c296e47 100644 --- a/resources/views/components/fo/page-tdf/ten-years.blade.php +++ b/resources/views/components/fo/page-tdf/ten-years.blade.php @@ -1,45 +1,48 @@
-

Le Gaulois et le Tour de France

+

{{ $model->data['tdf_title']['value'] }}

-

Plus de 10 années de complicité avec le - public +

+ {{ $model->data['tdf_subtitle_1']['value'] }} + {{ $model->data['tdf_subtitle_2']['value'] }}

-

Les chars « Cocottes » sont devenus emblématiques de la caravane du Tour de France. - Dix-huit - caravaniers passionnés, - dont huit femmes et dix hommes de tous âges et venus de différentes régions de France, auront l’opportunité unique - de piloter les mythiques « Cocottes » à travers le pays. Représentant la diversité et l’esprit de - partage, ces - caravaniers formeront une véritable famille pendant toute la durée du Tour, unis par leur - amour du sport et leur - engagement envers Le Gaulois.

- Les huit chars Le Gaulois, représentant les produits phares de la marque, offrent au public l'occasion de découvrir - ou redécouvrir la diversité des produits proposés : Crousty Chicken, Oui c’est Bon !, Cordon Bleu, Filets de - Poulet - Rôti, Blanc de Poulet Sortant à l’Extérieur, et Le Filet de Poulet Tranché Cuisson Express seront à - l’honneur. Deux - chars multiproduits, mettant en avant la diversité de la gamme, défileront également en tête de cortège avec à leur - bord l’animateur Arthur pour enflammer les foules gauloises. En fin de défilé, le char « Roule ma Poule » viendra - clore le spectacle, un clin d’œil toujours apprécié du public.

- Les chars iront à la rencontre des Français pour distribuer plus de 600 000 goodies Le Gaulois dans une atmosphère - joyeuse et conviviale. Cette année, la marque offrira des capes supporters, des magnets décapsuleurs, et des - milliers de bons de réduction pour découvrir les produits Le Gaulois en magasin. -

+
+ {!! clean($model->data['tdf_description']['value']) !!} +
- @if (\App\Rules\IsValidYoutubeId::validates('hY0WPbkf4Ow')) - + @if (!empty($model->data['tdf_media']['value']['video'])) + @php + $videoId = $model->data['tdf_media']['value']['video']['id']; + @endphp + @if (\App\Rules\IsValidYoutubeId::validates($videoId)) + + @elseif (\App\Rules\IsValidVimeoId::validates($videoId)) + + @endif + @else + {{ $model->data['tdf_media']['value']['picture']['alt'] }} @endif
diff --git a/resources/views/components/fo/page-tdf/testimonials.blade.php b/resources/views/components/fo/page-tdf/testimonials.blade.php index 725135c6..b6b5c3ed 100644 --- a/resources/views/components/fo/page-tdf/testimonials.blade.php +++ b/resources/views/components/fo/page-tdf/testimonials.blade.php @@ -1,78 +1,15 @@ @php - $slides = [ - [ - 'name' => 'Nicolas', - 'alias' => 'Pimpom', - 'sign' => 'L\'ambianceur', - 'anecdote' => - 'Nous cherchions un cri de guerre pour se motiver pour les étapes. Après avoir trouvé celui-ci, je ne sais pas pourquoi j’ai conclu par un cri de coq ! Résultat : il est resté jusqu\'à la fin du tour et même plus, il est passé au JT 19/20 sur France 3 Rhône-Alpes Auvergne.', - 'adventure' => - 'Cette année 2023, je l’avoue, ce fût le meilleur de tous, grâce à une équipe hyper soudée, bosseuse et jamais fatiguée.', - 'img_url' => Vite::asset( - 'resources/assets/images/page-tdf/testimonials/Nicolas-Joly-caravanier-Le-Gaulois-Etienne-Coudret.jpg', - ), - 'img_alt' => 'Photo de Nicolas en tenue de caravanier Le Gaulois', - 'img_title' => 'Nicolas Joly caravanier Le Gaulois', - 'advice' => - 'Etre à 200% du matin au soir, avoir le sourire en permanence et surtout ne pas avoir peur d’aller vers les autres !', - 'credit' => 'Crédit photo - Etienne Coudret', - ], - [ - 'name' => 'Mylène', - 'alias' => null, - 'sign' => 'Le boute-en-train', - 'anecdote' => " - Dans mes meilleurs moments de cette année, il y a le moment de convivialité entre nous sur le parking de l’hôtel après avoir terminé le rechargement des cadeaux pour l’étape du lendemain. Nous avons mis la musique sur une enceinte et nous avons fait la chenille sur le parking. Tout le monde s’est pris au jeu et c’était vraiment un bon moment de rigolade. Il faut savoir que la chenille était notre danse de l’année avec les caravaniers Le Gaulois, on a lancé des chenilles un peu partout et même à une fête de village.", - 'adventure' => - 'Faire partie de la caravane du Tour de France est avant tout une aventure humaine inoubliable. On y fait la rencontre de personnes toutes différentes mais avec la même envie de travailler dans la bonne humeur pendant 3 semaines de folie ! Le retour à la réalité a d’ailleurs été assez compliqué quand j’ai quitté les copains de la caravane Le Gaulois pour rentrer chez moi.', - 'img_url' => Vite::asset('resources/assets/images/page-tdf/testimonials/Mylène-Cornillet-caravaniere-Le-Gaulois.jpeg'), - 'img_alt' => 'Photo de Mylène sur un char Cocotte Le Gaulois', - 'img_title' => 'Mylène Cornillet caravanière Le Gaulois', - 'advice' => - 'Je dirais que si c’est vraiment une expérience que l’on a envie de vivre, il faut persévérer et ne pas s’arrêter au premier refus. Il faut aussi se démarquer des autres candidats qui sont souvent très nombreux avec un CV qui attire le regard ou une lettre de motivation qui sort du lot. Mais le plus important, c’est surtout d’être authentique et de montrer sa véritable personnalité !', - 'credit' => 'Crédit photo - ASO Aurélien Vialatte', - ], - [ - 'name' => 'Thierry', - 'alias' => 'Titi', - 'sign' => 'Le sage', - 'anecdote' => " - Sur une étape du Tour féminin, ma coéquipière est photographiée à proximité de Marion ROUSSE et elle ne la reconnait pas !! A l'arrivée du Tour féminin, je m'aperçois que j'ai fait tout le Tour avec mon accréditation du Tour de France masculin (signé Titi).", - 'adventure' => - 'C\'est une chance de pouvoir vivre cet événement exceptionnel de l\'intérieur avec une équipe conviviale, soudée et sympathique.', - 'img_url' => Vite::asset( - 'resources/assets/images/page-tdf/testimonials/Thierry-Gilles-caravanier-Le-Gaulois-Etienne-Coudret.jpg', - ), - 'img_alt' => 'Photo de Thierry sur le parking des chars Le Gaulois', - 'img_title' => 'Thierry Gilles caravanier Le Gaulois', - 'advice' => - 'Même si vous n\'y participez qu\'une seule fois, profitez de vivre ce moment exceptionnel tout en suivant attentivement les directives de l\'encadrement.', - 'credit' => 'Crédit photo - Etienne Coudret', - ], - [ - 'name' => 'Justine', - 'alias' => 'Ça percute !', - 'sign' => 'La floflo de Florence Foresti', - 'anecdote' => " - Comme scène marquante, je dirais le nombre de spectateurs sur la route nous regardant comme des « stars ». Je n'ai pas de scène drôle en particulier dans ma tête, mais tous les soirs au « cul du camion » comme nous le disons, un débrief avec rigolade et humour est organisé avec toute l'équipe.", - 'adventure' => 'Une expérience INOUBLIABLE, INCROYABLE, MAGIQUE, MAGNIFIQUE', - 'img_url' => Vite::asset( - 'resources/assets/images/page-tdf/testimonials/Justine-Le-Guillou-caravanière-Le-Gaulois-A.S.O-Aurélien-Vialatte.jpg', - ), - 'img_alt' => 'Photo de Justine entourée de l\'équipe des caravaniers Le Gaulois', - 'img_title' => 'Justine Le Guillou caravanière Le Gaulois', - 'advice' => 'D’être soi-même, profiter pleinement de son aventure, d’être dynamique et avoir l’esprit d’équipe.', - 'credit' => 'Crédit photo - ASO Aurélien Vialatte', - ], - ]; + $slides = $model->data['testimonials_items']['value']; @endphp
-

Les témoignages des caravaniers

+

+ {{ $model->data['testimonials_title']['value'] }} +

@foreach ($slides as $index => $slide) @endforeach
@@ -86,42 +23,34 @@
- {{ $slide['img_alt'] }} + {{ $slide['picture_alt'] }}
- {{ $slide['credit'] }} + {{ $slide['picture_author'] }}
-
{{ $slide['name'] }}
- @if (!empty($slide['alias'])) -
alias {{ $slide['alias'] }}
+
{{ $slide['title'] }}
+ @if (!empty($slide['subtitle'])) +
{{ $slide['subtitle'] }}
@endif
-

Son signe distinctif : {{ $slide['sign'] }}

- -
-

Son anecdote du Tour de France :

-

{{ $slide['anecdote'] }}

-
+ {!! clean($slide['description']) !!}
- -

{{ _('Son aventure Le Gaulois') }}

-

{{ $slide['adventure'] }}

- Le conseil de - {{ $slide['name'] }} + {{ $slide['subtitle_2'] }} + {{ $slide['title'] }}

- {{ $slide['advice'] }} + {!! clean($slide['description_2']) !!}
diff --git a/resources/views/fo/pages/breeding/oui-c-est-bon.blade.php b/resources/views/fo/pages/breeding/oui-c-est-bon.blade.php index c66806a6..0badd149 100644 --- a/resources/views/fo/pages/breeding/oui-c-est-bon.blade.php +++ b/resources/views/fo/pages/breeding/oui-c-est-bon.blade.php @@ -12,8 +12,10 @@
- + :sections="$sections" /> +
{{--
diff --git a/resources/views/fo/pages/breeding/sortant-a-l-exterieur.blade.php b/resources/views/fo/pages/breeding/sortant-a-l-exterieur.blade.php index b3aab457..73561f4b 100644 --- a/resources/views/fo/pages/breeding/sortant-a-l-exterieur.blade.php +++ b/resources/views/fo/pages/breeding/sortant-a-l-exterieur.blade.php @@ -8,8 +8,8 @@ alt_img="{{ $staticPageModel->picture_alt }}" title_img="{{ $staticPageModel->picture_title }}" />
- + :sections="$sections" /> +
{{--
diff --git a/resources/views/fo/pages/tdf.blade.php b/resources/views/fo/pages/tdf.blade.php index b8badbb5..0115948b 100644 --- a/resources/views/fo/pages/tdf.blade.php +++ b/resources/views/fo/pages/tdf.blade.php @@ -1,17 +1,16 @@ -@extends('fo.layout') +@extends('fo.layout', ['brParam' => $staticPageModel]) -@section('title', 'Le Gaulois | Volaille officielle du Tour de France') -@section('description', 'Immergez-vous dans l\'ambiance du Tour de France avec Le Gaulois. Découvrez le jeu concours, les photos, anecdotes - et témoignages de notre équipe.') +@section('title', $staticPageModel->seo_title) +@section('description', $staticPageModel->seo_description) @section('bg-offset', true) @section('content')
- - - - - - + + + + + +
@endsection diff --git a/routes/web-fo.php b/routes/web-fo.php index 7e6f54dc..82d5a1db 100644 --- a/routes/web-fo.php +++ b/routes/web-fo.php @@ -185,5 +185,5 @@ Route::middleware(['throttle:web'])->name('fo.')->group(function () { ->name('ratings.store'); // * OTHERS - Route::view('/tour-de-france', 'fo.pages.tdf')->name('tdf'); + Route::get('/tour-de-france', [StaticPageController::class, 'tdf'])->name('tdf'); });