input('type'); if (empty($currentType = AdviceTypeEnum::make(\intval($type)))) { abort(404); } $adviceModels->when(isset($type), function ($adviceModels) use ($currentType) { if ($currentType->value() !== AdviceTypeEnum::all->value()) { $adviceModels->where('type', '=', $currentType->value()); } }); /** @var string|null $search Search field */ $search = $request->input('search'); if ($search) { $this->searchQuery( $adviceModels, $search, null, 'title' ); } $searchFields = trans('Titre'); /** Sort columns with a query */ $this->sortQuery($adviceModels); /** Custom pagination */ $adviceModels = $this->paginate($adviceModels); return view('bo.pages.advice.index', compact('adviceModels', 'currentType', 'search', 'searchFields')); } /** * Show the form for creating a new resource. * * @param Request $request * @return \Illuminate\Contracts\View\View */ public function create(Request $request): \Illuminate\Contracts\View\View { $advice = new Advice(); $type = $request->type; $currentType = AdviceTypeEnum::make(\intval($type)); $adviceTags = Tag::query()->select(['id', 'label', 'slug'])->get(); $adviceProducts = Product::all(); $recipeList = Advice::query()->where('type', '=', AdviceTypeEnum::recipes)->get(); $tipList = Advice::query()->where('type', '=', AdviceTypeEnum::tips)->get(); $recipesSelected = collect(); $tipsSelected = collect(); collect($advice->advices) // @phpstan-ignore-next-line ->each(function (Advice $eltAdvice) use (&$recipesSelected, &$tipsSelected) { if ($eltAdvice->type->equals(AdviceTypeEnum::recipes)) { $recipesSelected = $recipesSelected->concat([$eltAdvice]); } elseif ($eltAdvice->type->equals(AdviceTypeEnum::tips)) { $tipsSelected = $tipsSelected->concat([$eltAdvice]); } }); return view('bo.pages.advice.create', [ 'adviceModel' => $advice, 'currentType' => $currentType, 'adviceTags' => $adviceTags, 'adviceProducts' => $adviceProducts, 'recipeList' => $recipeList, 'tipList' => $tipList, 'recipesSelected' => $recipesSelected, 'tipsSelected' => $tipsSelected, ]); } /** * Store a newly created resource in storage. * * @param \App\Http\Requests\Bo\Advice\StoreAdviceRequest $request * @return \Illuminate\Http\RedirectResponse */ public function store(StoreAdviceRequest $request): \Illuminate\Http\RedirectResponse { return DB::transaction(function () use ($request) { $advice = new Advice(); $advice->fill(Arr::except($request->validated(), [ 'tags', 'products', 'associated_tips_list', 'associated_recipes_list', ])); $currentType = AdviceTypeEnum::make(\intval($request->type)); if ($advice->saveOrFail()) { $advice->tags()->sync(collect($request->input('tags'))->pluck('id')); $advice->products()->sync($request->input('products_list')); $advice->advices()->sync(array_merge($request->input('recipes_list'), $request->input('tips_list'))); return redirect() ->route('bo.advice.edit', $advice) ->with('success', __( 'crud.messages.has_been_created', ['model' => Str::singular($currentType->label())] )); } return redirect() ->back() ->with('error', __( 'crud.messages.cannot_be_created', ['model' => Str::singular($currentType->label())] )); }); } /** * Show the form for editing the specified resource. * * @param \App\Models\Advice $advice * @return \Illuminate\Contracts\View\View */ public function edit(Advice $advice): \Illuminate\Contracts\View\View { $currentType = $advice->type; $adviceTags = Tag::query()->whereNotIn('id', $advice->tags()->pluck('id')) ->select(['id', 'label', 'slug'])->get(); $adviceProducts = Product::all(); $recipeList = Advice::query()->where([ ['type', '=', AdviceTypeEnum::recipes], ['id', '!=', $advice->id], ])->get(); $tipList = Advice::query()->where([ ['type', '=', AdviceTypeEnum::tips], ['id', '!=', $advice->id], ])->get(); return view('bo.pages.advice.edit', [ 'adviceModel' => $advice, 'currentType' => $currentType, 'adviceTags' => $adviceTags, 'adviceProducts' => $adviceProducts, 'recipeList' => $recipeList, 'tipList' => $tipList, 'recipesSelected' => $advice->recipes, 'tipsSelected' => $advice->tips, ]); } /** * Update the specified resource in storage. * * @param \App\Http\Requests\Bo\Advice\UpdateAdviceRequest $request * @param \App\Models\Advice $advice * @return \Illuminate\Http\RedirectResponse */ public function update(UpdateAdviceRequest $request, Advice $advice): \Illuminate\Http\RedirectResponse { return DB::transaction(function () use ($request, $advice) { $advice->tags()->sync(collect($request->input('tags'))->pluck('id')); $advice->products()->sync($request->input('products_list')); $advice->advices()->sync(array_merge($request->input('recipes_list'), $request->input('tips_list'))); $advice->fill(Arr::except($request->validated(), [ 'tags', 'products', 'associated_tips_list', 'associated_recipes_list', ])); $currentType = AdviceTypeEnum::make(\intval($request->type)); if ($advice->saveOrFail()) { return redirect() ->route('bo.advice.edit', $advice) ->with('success', trans( 'crud.messages.has_been_updated', ['model' => Str::singular($currentType->label())] )); } return redirect() ->back() ->with('error', trans( 'crud.messages.cannot_be_updated', ['model' => Str::singular($currentType->label())] )); }); } /** * Remove the specified resource from storage. * * @param \App\Models\Advice $advice * @return \Illuminate\Http\RedirectResponse */ public function destroy(Advice $advice): \Illuminate\Http\RedirectResponse { DB::table('advice_advice')->where($advice->advices()->getRelatedPivotKeyName(), $advice->id)->delete(); $advice->tags()->sync([]); $advice->products()->sync([]); $advice->advices()->sync([]); $currentType = AdviceTypeEnum::make(\intval($advice->type->value())); if ($advice->deleteOrFail()) { return redirect() ->route('bo.advice.index', ['type' => $currentType]) ->with('warning', trans( 'crud.messages.has_been_deleted', ['model' => Str::singular($currentType->label())] )); } return redirect() ->back() ->with('error', trans( 'crud.messages.cannot_be_deleted', ['model' => Str::singular($currentType->label())] )); } }