From cedb0b7a4d5b1c1bd1139ffb64939ab8d5accb96 Mon Sep 17 00:00:00 2001 From: Olivier Legat Date: Wed, 14 Apr 2021 17:33:55 +0200 Subject: [PATCH] gestion sliders --- .gitignore | 2 +- app/Http/Controllers/Bo/SlidersController.php | 123 +++++++++ app/Http/Controllers/Bo/SlidesController.php | 247 ++++++++++++++++++ app/Http/Controllers/HomeController.php | 6 +- app/Models/Slide.php | 25 ++ app/Models/Slider.php | 31 +++ ...2021_04_14_115938_create_sliders_table.php | 39 +++ .../2021_04_14_115954_create_slides_table.php | 44 ++++ database/seeders/SlidersSeeder.php | 24 ++ resources/views/bo/promotions/index.blade.php | 4 +- resources/views/bo/sliders/create.blade.php | 36 +++ resources/views/bo/sliders/edit.blade.php | 90 +++++++ resources/views/bo/sliders/index.blade.php | 40 +++ resources/views/bo/slides/create.blade.php | 110 ++++++++ resources/views/bo/slides/edit.blade.php | 129 +++++++++ resources/views/bo/slides/index.blade.php | 69 +++++ .../canard/auth/register-success.blade.php | 2 +- resources/views/front/canard/home.blade.php | 2 +- .../canard/partials/main-slider.blade.php | 32 ++- resources/views/front/canard/theme.config.php | 3 + resources/views/layouts/bo-layout.blade.php | 18 ++ routes/web.php | 9 +- 22 files changed, 1066 insertions(+), 19 deletions(-) create mode 100644 app/Http/Controllers/Bo/SlidersController.php create mode 100644 app/Http/Controllers/Bo/SlidesController.php create mode 100644 app/Models/Slide.php create mode 100644 app/Models/Slider.php create mode 100644 database/migrations/2021_04_14_115938_create_sliders_table.php create mode 100644 database/migrations/2021_04_14_115954_create_slides_table.php create mode 100644 database/seeders/SlidersSeeder.php create mode 100644 resources/views/bo/sliders/create.blade.php create mode 100644 resources/views/bo/sliders/edit.blade.php create mode 100644 resources/views/bo/sliders/index.blade.php create mode 100644 resources/views/bo/slides/create.blade.php create mode 100644 resources/views/bo/slides/edit.blade.php create mode 100644 resources/views/bo/slides/index.blade.php diff --git a/.gitignore b/.gitignore index 6f5461e..4b3f96e 100644 --- a/.gitignore +++ b/.gitignore @@ -1,10 +1,10 @@ /node_modules -/integration /public/hot /public/storage /public/images/content /public/images/gammes /public/images/produits +/public/images/slides /storage/*.key /vendor .env diff --git a/app/Http/Controllers/Bo/SlidersController.php b/app/Http/Controllers/Bo/SlidersController.php new file mode 100644 index 0000000..6b30c2b --- /dev/null +++ b/app/Http/Controllers/Bo/SlidersController.php @@ -0,0 +1,123 @@ +label; + $slug = $request->slug; + if (empty($slug)) { + $slug = Str::slug($label); + } + $commentaire = $request->commentaire; + + + $request->validate([ + 'label' => 'required|string|max:255', + 'slug' => 'sometimes|unique:sliders', + ]); + + $slider = new Slider(); + $slider->label = $label; + $slider->slug = $slug; + $slider->commentaire = $commentaire; + $slider->save(); + return redirect()->route('bo.sliders.edit', $slider->id)->with('success', 'Slider créé !'); + } + + /** + * Display the specified resource. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function show($id) + { + // + } + + /** + * Show the form for editing the specified resource. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function edit($id) + { + $slider = Slider::findOrFail($id); + return view('bo.sliders.edit', compact('slider')); + } + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @param int $id + * @return \Illuminate\Http\Response + */ + public function update(Request $request, $id) + { + $slider = Slider::findOrFail($id); + $label = $request->label; + $slug = $request->slug; + $commentaire = $request->commentaire; + + + $request->validate([ + 'label' => 'required|string|max:255', + 'slug' => 'required|unique:sliders,slug,' . $slider->id, + ]); + + $slider->label = $label; + $slider->slug = $slug; + $slider->commentaire = $commentaire; + $slider->save(); + + return redirect()->route('bo.sliders.edit', $slider->id)->with('success', 'Modifications enregistrées !'); + } + + /** + * Remove the specified resource from storage. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function destroy($id) + { + // + } +} diff --git a/app/Http/Controllers/Bo/SlidesController.php b/app/Http/Controllers/Bo/SlidesController.php new file mode 100644 index 0000000..595b8ae --- /dev/null +++ b/app/Http/Controllers/Bo/SlidesController.php @@ -0,0 +1,247 @@ +get();; + return view('bo.slides.index', compact('slides')); + } + + /** + * Show the form for creating a new resource. + * + * @return \Illuminate\Http\Response + */ + public function create() + { + $sliders = Slider::all(); + return view('bo.slides.create', compact('sliders')); + } + + /** + * Store a newly created resource in storage. + * + * @todo : validation des dates + * + * @param \Illuminate\Http\Request $request + * @return \Illuminate\Http\Response + */ + public function store(Request $request) + { + $title = $request->title; + $picture = $request->picture; + $text = $request->text; + $linkLabel = $request->link_label; + $link = $request->link; + $newTab = $request->link_new_tab === null ? 0 : 1; + $sliderId = $request->slider_id; + + if (empty($request->date_start_date)) { + $date_start = null; + } else { + if(emty($request->date_start_time)) { + $date_start = $request->date_start_date . " 00:00"; + } else { + $date_start = $request->date_start_date . " " . $request->date_start_time; + } + } + + if (empty($request->date_end_date)) { + $date_end = null; + } else { + if(empty($request->date_end_time)) { + $date_end = $request->date_end_date . " 23:59"; + } else { + $date_end = $request->date_end_date . " " . $request->date_end_time; + } + + } + + $request->validate([ + 'title' => 'required|max:255', + 'picture' => 'image|mimes:jpeg,png,jpg|max:2048|dimensions:max-width=' . + config('theme.slide_image_maxwidth') . ',max-height=' . + config('theme.slide_image_maxheight'), + 'link_label' => 'sometimes|max:255', + 'link' => 'sometimes|max:255', + ]); + + $slide = new Slide(); + $slide->title = $title; + $slide->text = $text; + $slide->link_label = $linkLabel; + $slide->link = $link; + $slide->link_new_tab = $newTab; + $slide->date_start = $date_start; + $slide->date_end = $date_end; + $slide->slider_id = $sliderId; + $slide->order = $this->getLastOrder(); + $slide->save(); + + if ($picture !== null) { + $imageName = $slide->id . '.' . $picture->extension(); + $picture->move(public_path('images/slides'), $imageName); + $slide->picture = $imageName; + $slide->save(); + } + + return redirect()->route('bo.slides.edit', $slide->id)->with('success', 'Slide créé !'); + } + + /** + * Display the specified resource. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function show($id) + { + // + } + + /** + * Show the form for editing the specified resource. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function edit($id) + { + $slide = Slide::findOrFail($id); + $sliders = Slider::all(); + return view('bo.slides.edit', compact('slide','sliders')); + } + + /** + * Update the specified resource in storage. + * + * @param \Illuminate\Http\Request $request + * @param int $id + * @return \Illuminate\Http\Response + */ + public function update(Request $request, $id) + { + $title = $request->title; + $picture = $request->picture; + $text = $request->text; + $linkLabel = $request->link_label; + $link = $request->link; + $newTab = $request->link_new_tab === null ? 0 : 1; + $sliderId = $request->slider_id; + + if (empty($request->date_start_date)) { + $date_start = null; + } else { + if (empty($request->date_start_time)) { + $date_start = $request->date_start_date . " 00:00"; + } else { + $date_start = $request->date_start_date . " " . $request->date_start_time; + } + } + + if (empty($request->date_end_date)) { + $date_end = null; + } else { + if (empty($request->date_end_time)) { + $date_end = $request->date_end_date . " 23:59"; + } else { + $date_end = $request->date_end_date . " " . $request->date_end_time; + } + + } + + $request->validate([ + 'title' => 'required|max:255', + 'picture' => 'image|mimes:jpeg,png,jpg|max:2048|dimensions:max-width=' . + config('theme.slide_image_maxwidth') . ',max-height=' . + config('theme.slide_image_maxheight'), + 'link_label' => 'sometimes|max:255', + 'link' => 'sometimes|max:255', + ]); + + $slide = Slide::findOrFail($id); + $slide->title = $title; + $slide->text = $text; + $slide->link_label = $linkLabel; + $slide->link = $link; + $slide->link_new_tab = $newTab; + $slide->date_start = $date_start; + $slide->date_end = $date_end; + $slide->slider_id = $sliderId; + $slide->save(); + + if ($picture !== null) { + if(file_exists(public_path() . 'images/slides/' . $slide->picture)) + unlink(public_path() . 'images/slides/' . $slide->picture); + $imageName = $slide->id . '.' . $picture->extension(); + $picture->move(public_path('images/slides'), $imageName); + $slide->picture = $imageName; + $slide->save(); + } + + return redirect()->route('bo.slides.edit', $slide->id)->with('success', 'Modifications enregistrées !'); + } + + /** + * Remove the specified resource from storage. + * + * @param int $id + * @return \Illuminate\Http\Response + */ + public function destroy($id) + { + $s = Slide::findOrFail($id); + + $s->delete(); + + return redirect()->route('bo.slides.index'); + } + + + public function changeOrder($id, $action) + { + $current = Slide::findOrFail($id); + + if ($action === 'up'){ + $tmp = Slide::where('order', '<', $current->order)->orderBy('order', 'DESC')->first(); + $newOrder = $tmp->order; + $tmp->order = $current->order; + $current->order = $newOrder; + }else{ + $tmp = Slide::where('order', '>', $current->order)->orderBy('order', 'ASC')->first(); + $newOrder = $tmp->order; + $tmp->order = $current->order; + $current->order = $newOrder; + } + $tmp->save(); + $current->save(); + + return back(); + //return redirect()->route('bo.slides.index'); + } + + /** + * retreive order position to put a new slide to + */ + private function getLastOrder() + { + $order = Slide::select('order')->orderBy('order', 'DESC')->first(); + if ($order === NULL) + return 1; + return $order->order + 1; + } +} diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index c2157fd..4b1c521 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -4,6 +4,7 @@ namespace App\Http\Controllers; use App\Models\Content; use App\Models\Product; +use App\Models\Slider; use Illuminate\Http\Request; use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Validator; @@ -16,7 +17,10 @@ class HomeController extends Controller //star products $products = Product::where('status', 1)->where('star', 1)->get(); - return view('home', compact('content', 'products')); + $slider = Slider::where('slug','home')->first(); + $slides = $slider->showableSlides; + + return view('home', compact('content', 'products', 'slides')); } /** diff --git a/app/Models/Slide.php b/app/Models/Slide.php new file mode 100644 index 0000000..292a876 --- /dev/null +++ b/app/Models/Slide.php @@ -0,0 +1,25 @@ + 'datetime', + 'date_end' => 'datetime', + ]; + + public function slider() { + return $this->belongsTo(Slider::class); + } +} diff --git a/app/Models/Slider.php b/app/Models/Slider.php new file mode 100644 index 0000000..abfb30c --- /dev/null +++ b/app/Models/Slider.php @@ -0,0 +1,31 @@ +hasMany(Slide::class, 'slider_id')->orderBy('order', 'ASC'); + } + + public function showableSlides() + { + $now = Carbon::now(); + return $this->hasMany(Slide::class, 'slider_id') + ->orderBy('order', 'ASC')->where(function ($q) use ($now) { + $q->whereDate('date_start', '<=', $now) + ->orWhereNull('date_start'); + })->where(function ($q) use ($now) { + $q->whereDate('date_end', '>=', $now) + ->orWhereNull('date_end'); + }); + + } +} diff --git a/database/migrations/2021_04_14_115938_create_sliders_table.php b/database/migrations/2021_04_14_115938_create_sliders_table.php new file mode 100644 index 0000000..ab3d332 --- /dev/null +++ b/database/migrations/2021_04_14_115938_create_sliders_table.php @@ -0,0 +1,39 @@ +id(); + $table->string('label'); + $table->string('slug'); + $table->unique('slug'); + $table->string('commentaire')->nullable(); + $table->timestamps(); + }); + + $seeder = new SlidersSeeder(); + $seeder->run(); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('sliders'); + } +} diff --git a/database/migrations/2021_04_14_115954_create_slides_table.php b/database/migrations/2021_04_14_115954_create_slides_table.php new file mode 100644 index 0000000..f3a7111 --- /dev/null +++ b/database/migrations/2021_04_14_115954_create_slides_table.php @@ -0,0 +1,44 @@ +id(); + $table->foreignId('slider_id')->default(1)->constrained('sliders'); + + $table->string('title'); + $table->text('text')->nullable(); + $table->string('picture')->nullable(); + $table->string('link_label')->nullable(); + $table->string('link')->nullable(); + $table->boolean('link_new_tab')->default(false); + $table->integer('order')->default(1); + + $table->timestamp('date_start')->nullable(); + $table->timestamp('date_end')->nullable(); + + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('slides'); + } +} diff --git a/database/seeders/SlidersSeeder.php b/database/seeders/SlidersSeeder.php new file mode 100644 index 0000000..db0e439 --- /dev/null +++ b/database/seeders/SlidersSeeder.php @@ -0,0 +1,24 @@ +label = "Home"; + $homeslider->slug = Str::slug($homeslider->label); + $homeslider->commentaire = 'Slider de la home'; + $homeslider->save(); + } +} diff --git a/resources/views/bo/promotions/index.blade.php b/resources/views/bo/promotions/index.blade.php index ea20917..1660db4 100644 --- a/resources/views/bo/promotions/index.blade.php +++ b/resources/views/bo/promotions/index.blade.php @@ -23,8 +23,8 @@ @foreach ($promotions as $promotion) - {{$promotion->discountType->label}} - {{$promotion->discount_value}} + {{$promotion->discountType->label}} + {{$promotion->discount_value}} {{$promotion->date_start}} {{$promotion->date_end}} diff --git a/resources/views/bo/sliders/create.blade.php b/resources/views/bo/sliders/create.blade.php new file mode 100644 index 0000000..cdb2e7c --- /dev/null +++ b/resources/views/bo/sliders/create.blade.php @@ -0,0 +1,36 @@ +@extends('layouts.bo-layout') + +@section('content') +
+ @csrf +
+

< Sliders Création

+
+
+
+ @if ($errors->any()) +
+
    + @foreach ($errors->all() as $error) +
  • {{ $error }}
  • + @endforeach +
+
+ @endif + +
+ + +
+
+ + + laisser vide pour une génération automatique +
+
+ + +
+
+@endsection diff --git a/resources/views/bo/sliders/edit.blade.php b/resources/views/bo/sliders/edit.blade.php new file mode 100644 index 0000000..9f15e6d --- /dev/null +++ b/resources/views/bo/sliders/edit.blade.php @@ -0,0 +1,90 @@ +@extends('layouts.bo-layout') + +@section('content') +
+ @method('PUT') + @csrf +
+

< Slider Edition

+ @if (session('success')) + {{ session('success') }} + @endif +
+
+
+ @if ($errors->any()) +
+
    + @foreach ($errors->all() as $error) +
  • {{ $error }}
  • + @endforeach +
+
+ @endif +
+
+ + +
+
+ + +
+
+
+ + +
+
+
+

Slides

+
+ + + + + + + + + + + + + + + + @foreach($slider->slides as $slide) + + + + + + + + + + + + @endforeach + +
TitreTexteImageLienDébutFinSlider de regroupementOrdre
{{$slide->title}}{!! $slide->text !!}{{ $slide->link_label }}{{$slide->date_start}}{{$slide->date_end}}{{$slide->slider->label}} + @if ($loop->first) + + + + @elseif($loop->last) + + + + @else + + + + + + + @endif + Éditer
+@endsection diff --git a/resources/views/bo/sliders/index.blade.php b/resources/views/bo/sliders/index.blade.php new file mode 100644 index 0000000..313c382 --- /dev/null +++ b/resources/views/bo/sliders/index.blade.php @@ -0,0 +1,40 @@ +@extends('layouts.bo-layout') + +@section('content') +
+

Sliders Liste

+ + @if ($errors->any()) + @foreach($errors->all() as $error) + {{ $error }} + @endforeach + @endif + Créer un slider +
+ + + + + + + + + @foreach ($sliders as $slider) + + + + + + + @endforeach + +
LabelSlugCommentaire
{{$slider->label}}{{$slider->slug}}{{$slider->commentaire}} + Éditer +
+ @method('DELETE') + @csrf + +
+
+@endsection diff --git a/resources/views/bo/slides/create.blade.php b/resources/views/bo/slides/create.blade.php new file mode 100644 index 0000000..f1d0dc7 --- /dev/null +++ b/resources/views/bo/slides/create.blade.php @@ -0,0 +1,110 @@ +@extends('layouts.bo-layout') + +@section('content') +
+ @csrf +
+

< Slides Création

+
+
+
+ @if ($errors->any()) +
+
    + @foreach ($errors->all() as $error) +
  • {{ $error }}
  • + @endforeach +
+
+ @endif + +
+ + +
+
+ + +
+
+
+ +
+ +
+
+ + +
+
+
+
+
+ +
+

Période de parution

+
+
+
+ + + + Laisser vide pour un affichage immédiat +
+
+ + + + Laisser vide pour un affichage permanent +
+
+ +
+

Options de lien

+
+
+ + +
+
+ + +
+
+ + +
+ +
+@endsection + +@section('scripts') + +@endsection diff --git a/resources/views/bo/slides/edit.blade.php b/resources/views/bo/slides/edit.blade.php new file mode 100644 index 0000000..214a0e3 --- /dev/null +++ b/resources/views/bo/slides/edit.blade.php @@ -0,0 +1,129 @@ +@extends('layouts.bo-layout') + +@section('content') +
+ @method('PUT') + @csrf +
+

< Slides Création

+ @if (session('success')) + {{ session('success') }} + @endif +
+
+
+ @if ($errors->any()) +
+
    + @foreach ($errors->all() as $error) +
  • {{ $error }}
  • + @endforeach +
+
+ @endif + +
+ + +
+
+ + +
+
+
+ + @if ($slide->picture !== null) +
+
+ {{$slide->title}} + @endif +
+ +
+
+ + +
+
+
+
+
+ +
+

Période de parution

+
+
+
+ + @if($slide->date_start !== null) + + + @else + + + @endif + Laisser vide pour un affichage immédiat +
+
+ + @if($slide->date_end !== null) + + + @else + + + @endif + Laisser vide pour un affichage permanent +
+
+ +
+

Options de lien

+
+
+ + +
+
+ + +
+
+ link_new_tab) !== 0)checked @endif> + +
+ +
+@endsection + +@section('scripts') + +@endsection diff --git a/resources/views/bo/slides/index.blade.php b/resources/views/bo/slides/index.blade.php new file mode 100644 index 0000000..26028bb --- /dev/null +++ b/resources/views/bo/slides/index.blade.php @@ -0,0 +1,69 @@ +@extends('layouts.bo-layout') + +@section('content') +
+

Slides Liste

+ + @if ($errors->any()) + @foreach($errors->all() as $error) + {{ $error }} + @endforeach + @endif + Créer un slide +
+ + + + + + + + + + + + + + + + @foreach($slides as $slide) + + + + + + + + + + + + @endforeach + +
TitreTexteImageLienDébutFinSlider de regroupementOrdre
{{$slide->title}}{!! $slide->text !!}{{ $slide->link_label }}{{$slide->date_start}}{{$slide->date_end}}{{$slide->slider->label}} + @if ($loop->first) + + + + @elseif($loop->last) + + + + @else + + + + + + + @endif + + Éditer +
+ @method('DELETE') + @csrf + +
+
+@endsection diff --git a/resources/views/front/canard/auth/register-success.blade.php b/resources/views/front/canard/auth/register-success.blade.php index 62a9f07..8fba90b 100644 --- a/resources/views/front/canard/auth/register-success.blade.php +++ b/resources/views/front/canard/auth/register-success.blade.php @@ -14,7 +14,7 @@
Félicitations
Votre compte a bien été créé !
Vous allez recevoir un mail de confirmation
sur l’adresse {{ $mail }}
- Connexion + Connexion
diff --git a/resources/views/front/canard/home.blade.php b/resources/views/front/canard/home.blade.php index 55b5737..b3ba078 100644 --- a/resources/views/front/canard/home.blade.php +++ b/resources/views/front/canard/home.blade.php @@ -10,7 +10,7 @@
{{-- sert de spacer car ici pas de breadcrumb --}} {{-- Slider --}} - @yield('main-slider', view('partials.main-slider')) + @include('partials.main-slider') {{-- Fin du Slider --}}
diff --git a/resources/views/front/canard/partials/main-slider.blade.php b/resources/views/front/canard/partials/main-slider.blade.php index 49bd414..48ad45e 100644 --- a/resources/views/front/canard/partials/main-slider.blade.php +++ b/resources/views/front/canard/partials/main-slider.blade.php @@ -2,17 +2,27 @@
- -
-
-
-
Des saveurs qui donnent envie
-
Cras scelerisque imperdiet nisl, non malesuada felis. Fusce ullamcorper mi sed dapibus dignissim. Maecenas pellentesque auctor sem nec volutpat...
-
Accédez à la boutique
-
-
-
- + @foreach ($slides as $slide) +
+ @if(!empty($slide->picture)) +
+ @else +
+ @endif +
+
{{ $slide->title }}
+
{!! $slide->text !!}
+ @if(!empty($slide->link_label)) + + @endif +
+
+
+ @endforeach
diff --git a/resources/views/front/canard/theme.config.php b/resources/views/front/canard/theme.config.php index 7499784..4ae5ab6 100644 --- a/resources/views/front/canard/theme.config.php +++ b/resources/views/front/canard/theme.config.php @@ -18,4 +18,7 @@ return [ 'enum_product_types' => [ 'foodProduct' => 'Alimentaire', ], + 'slide_image_maxwidth' => '1180', + 'slide_image_maxheight' => '449', + ]; diff --git a/resources/views/layouts/bo-layout.blade.php b/resources/views/layouts/bo-layout.blade.php index 0346214..c584803 100644 --- a/resources/views/layouts/bo-layout.blade.php +++ b/resources/views/layouts/bo-layout.blade.php @@ -66,6 +66,24 @@
+
+
+

+ +

+
+ +
+
+ +
+
+

diff --git a/routes/web.php b/routes/web.php index 2ac6f06..6adcc31 100644 --- a/routes/web.php +++ b/routes/web.php @@ -83,8 +83,13 @@ Route::namespace('App\Http\Controllers\Bo') Route::get('/products/create/{product_type}', [\App\Http\Controllers\Bo\ProductsController::class, 'create']) ->name('products.create'); - Route::resource('ranges', RangesController::class); - Route::resource('promotions', PromotionsController::class); + Route::resources([ + 'ranges' => RangesController::class, + 'promotions' => PromotionsController::class, + 'sliders'=> SlidersController::class, + 'slides' => SlidesController::class, + ]); + Route::get('/slide/change-order/{id}/{action}', [App\Http\Controllers\Bo\SlidesController::class,'changeOrder'])->name('slides.change-order'); Route::get('/customer-info/{id}', [OrdersController::class, 'getCustomerInfo'])->name('get-customer-info');