- npm i sweetalert2 --save-dev - create confirm module - replace all natives confirm with sweet alert
193 lines
6.6 KiB
PHP
193 lines
6.6 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Bo;
|
|
|
|
use App\Enums\ArticleCategory;
|
|
use App\Enums\NotificationType;
|
|
use App\Events\NewNotification;
|
|
use App\Http\Controllers\Controller;
|
|
use App\Http\Requests\SearchRequest;
|
|
use App\Http\Requests\StoreRecipe;
|
|
use App\Http\Requests\UpdateRecipe;
|
|
use App\Models\Articles;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Str;
|
|
use App\Models\Recipes;
|
|
use App\Models\ConsumptionTimes;
|
|
use App\Models\Products;
|
|
use App\Traits\UpdateModelStatus;
|
|
|
|
class RecipesController extends Controller
|
|
{
|
|
use UpdateModelStatus;
|
|
|
|
public function index(SearchRequest $request)
|
|
{
|
|
$r = Recipes::with('products.range');
|
|
if ($request->search) {
|
|
$r = $this->searchQuery(
|
|
$r,
|
|
$request->search,
|
|
'title',
|
|
'catch_phrase',
|
|
'seo_title',
|
|
'seo_description',
|
|
'ingredients',
|
|
'preparation',
|
|
'advice'
|
|
);
|
|
}
|
|
$r = $this->sortQuery($r, ['range_id']);
|
|
// handle ignore columns (range_id which depends on the product used)
|
|
if ($request->sort_col === 'range_id' and $request->sort_way) {
|
|
$r = $r->select('recipes.*');
|
|
$r = $r->join('recipes_products', 'recipes.id', '=', 'recipes_products.recipe_id');
|
|
$r = $r->join('products', 'products.id', '=', 'recipes_products.product_id');
|
|
$r = $r->join('ranges', 'products.range_id', '=', 'ranges.id');
|
|
$r = $r->orderBy('ranges.name', $request->sort_way);
|
|
}
|
|
$searchFields = trans('Titre, Description, Ingredient, Préparation, Conseils');
|
|
$r = $r->paginate();
|
|
return view('bo.recipes.index', compact('r', 'searchFields'));
|
|
}
|
|
|
|
public function create()
|
|
{
|
|
$c = ConsumptionTimes::all();
|
|
$p = Products::all();
|
|
$a = Articles::where('type', ArticleCategory::actu())->get();
|
|
return view('bo.recipes.create', compact('c', 'p', 'a'));
|
|
}
|
|
|
|
public function store(StoreRecipe $request)
|
|
{
|
|
$associatedP = [];
|
|
if ($request->associated_product1) {
|
|
$associatedP[] = intval($request->associated_product1);
|
|
}
|
|
if ($request->associated_product2) {
|
|
$associatedP[] = intval($request->associated_product2);
|
|
}
|
|
$r = new Recipes($request->validated());
|
|
$imageName = Str::slug($r->title) . '.' . $request->picture->extension();
|
|
$request->picture->move(
|
|
public_path('uploads/images/recettes/' . date('Y') . '/' . date('m') . '/'),
|
|
$imageName
|
|
);
|
|
$r->picture = '/uploads/images/recettes/' . date('Y') . '/' . date('m') . '/' . $imageName;
|
|
|
|
$r->consumption_times_id = $request->consumption_times;
|
|
$r->saveOrFail();
|
|
$r->products()->sync($associatedP);
|
|
$r->articles()->sync($request->associated_news);
|
|
if ($request->notification) {
|
|
event(new NewNotification(
|
|
NotificationType::recipe(),
|
|
route('recipes.show', Str::slug($r->title)),
|
|
$r
|
|
));
|
|
return redirect()->route('bo.recipes.edit', $r)
|
|
->with('success', 'Notification envoyée');
|
|
}
|
|
return redirect()->route('bo.recipes.edit', $r)
|
|
->with('success', 'Recette enregistrée');
|
|
}
|
|
|
|
public function edit(Recipes $r)
|
|
{
|
|
$c = ConsumptionTimes::all();
|
|
$p = Products::with(['recipes', 'consumptionTimes'])->get();
|
|
$a = Articles::where('type', ArticleCategory::actu())->get();
|
|
$raIds = [];
|
|
foreach ($r->articles as $recipe_article) {
|
|
$raIds[] = $recipe_article->id;
|
|
}
|
|
return view('bo.recipes.edit', compact('c', 'r', 'a', 'p'))->with('raIds', $raIds);
|
|
}
|
|
|
|
public function update(UpdateRecipe $request, Recipes $r)
|
|
{
|
|
$r->fill($request->validated());
|
|
$associatedP = [];
|
|
if ($request->associated_product1) {
|
|
$associatedP[] = intval($request->associated_product1);
|
|
}
|
|
if ($request->associated_product2) {
|
|
$associatedP[] = intval($request->associated_product2);
|
|
}
|
|
|
|
if ($request->picture !== null) {
|
|
if (file_exists(public_path() . '/' . $r->picture)) {
|
|
unlink(public_path() . '/' . $r->picture);
|
|
}
|
|
$imageName = Str::slug($r->title) . '.' . $request->picture->extension();
|
|
$request->picture->move(
|
|
public_path('uploads/images/recettes/' . date('Y') . '/' . date('m') . '/'),
|
|
$imageName
|
|
);
|
|
$r->picture = '/uploads/images/recettes/' . date('Y') . '/' . date('m') . '/' . $imageName;
|
|
}
|
|
|
|
$r->saveOrFail();
|
|
$r->products()->sync($associatedP);
|
|
$r->articles()->sync($request->associated_news);
|
|
if ($request->notification) {
|
|
event(new NewNotification(
|
|
NotificationType::recipe(),
|
|
route('recipes.show', Str::slug($r->title)),
|
|
$r
|
|
));
|
|
return redirect()->route('bo.recipes.edit', $r)
|
|
->with('success', 'Notification envoyée, Enregistré !');
|
|
}
|
|
return redirect()->route('bo.recipes.edit', $r)
|
|
->with('success', 'Enregistré !');
|
|
}
|
|
|
|
public function destroy(Recipes $r)
|
|
{
|
|
if (file_exists(public_path() . '/' . $r->picture)) {
|
|
unlink(public_path() . '/' . $r->picture);
|
|
}
|
|
|
|
$r->notifiable()->delete();
|
|
$r->delete();
|
|
|
|
return redirect()->route('bo.recipes.index')
|
|
->with('warning', 'Le contenu à bien été supprimé');
|
|
}
|
|
|
|
public function highlights()
|
|
{
|
|
$r = Recipes::all();
|
|
return view('bo.recipes.highlights', compact('r'));
|
|
}
|
|
|
|
public function storeHighlights(Request $request)
|
|
{
|
|
$recipes = $request->recipes;
|
|
|
|
if ($recipes !== null) {
|
|
$oldHighlights = Recipes::select('id')->where('highlight', 1)->get();
|
|
|
|
foreach ($recipes as $recipe) {
|
|
if (!$oldHighlights->contains($recipe)) {
|
|
$r = Recipes::findOrFail($recipe);
|
|
$r->highlight = 1;
|
|
$r->save();
|
|
}
|
|
}
|
|
|
|
foreach ($oldHighlights as $oldHighlight) {
|
|
if (!in_array($oldHighlight->id, $recipes)) {
|
|
$oldHighlight->highlight = 0;
|
|
$oldHighlight->save();
|
|
}
|
|
}
|
|
} else {
|
|
Recipes::where('highlight', 1)->update(['highlight' => 0]);
|
|
}
|
|
|
|
return redirect()->route('bo.recipes.highlights')->with('success', 'Enregistré !');
|
|
}
|
|
}
|