diff --git a/app/Http/Controllers/Fo/ProductController.php b/app/Http/Controllers/Fo/ProductController.php index c6ca1440..d7adb5f5 100644 --- a/app/Http/Controllers/Fo/ProductController.php +++ b/app/Http/Controllers/Fo/ProductController.php @@ -42,11 +42,11 @@ class ProductController extends Controller ): \Illuminate\Contracts\View\View { /** @var \Illuminate\Contracts\Pagination\LengthAwarePaginator $productModels */ - $productModels = $productModelsFiltered ?? Product::query() + $productModels = $productModelsFiltered ?? Product::query() ->where('published', true) ->orderBy('slug') ->paginate($this->productModelsPerPage); - + $productDiscoverModels = Product::getPublishedDiscovered(); $staticPageModel = StaticPage::getCachedStaticPage(StaticPageType::products); $rangeModels = Range::getPublishedOrderedWithSubranges(); @@ -122,9 +122,9 @@ class ProductController extends Controller */ public function getSiblingModels(Product $productModel): array { - $filter = Cache::get('productsFilter'); + $filter = Cache::get('productsFilter'); $cleanedFilter = $this->cleanSubSubFilter($filter); - + /** @var string $slug */ $slug = $filter ? ((is_null($productModel->{$filter}) @@ -132,7 +132,7 @@ class ProductController extends Controller : $productModel->{$filter})->slug ?? "") : ""; - // FIXME: the previous element are added on 30/10/24 to avoid error when productFilters was set on "submeat" for example and user access to product which not have submeat relation -> "Attempt to read property 'sub***' on null" + // FIXME: the previous element are added on 30/10/24 to avoid error when productFilters was set on "submeat" for example and user access to product which not have submeat relation -> "Attempt to read property 'sub***' on null" // this fix will just avoid the error, but in this case, product.show have no previous or next product. /** @var \Illuminate\Support\Collection $productModelsList */ @@ -159,7 +159,7 @@ class ProductController extends Controller ->where('published', true) ->orderBy('slug') ->get(); - $collectionIndex = $productModelsList->search(function ($productModelItem, $key) use ($productModel) { + $collectionIndex = $productModelsList->search(function ($productModelItem, $key) use ($productModel) { if ($productModelItem->getKey() === $productModel->getKey()) { return $key; }; @@ -260,15 +260,15 @@ class ProductController extends Controller ->with(['range', 'subrange', 'meat', 'submeat']) ->where('published', true) ->when(!is_null($rangeModel), function (Builder $q) use ($rangeModel, $request) { - if ($request->child_slug) { - $q->whereHas('subrange', function (Builder $q) use ($request) { + $q->whereHas('range', function (Builder $q) use ($rangeModel) { + $q->where('published', true)->where('id', $rangeModel->getKey()); + })->orWhereHas('subrange', function (Builder $q) use ($rangeModel, $request) { + if ($request->child_slug) { $q->where('published', true)->where("slug", $request->child_slug); - }); - } else { - $q->whereHas('range', function (Builder $q) use ($rangeModel) { - $q->where('published', true)->where('id', $rangeModel->getKey()); - }); - } + } else { + $q->where('published', true)->whereIn('id', $rangeModel->subranges->pluck('id')->toArray()); + } + }); }) ->where('published', true) ->orderBy('slug') @@ -278,9 +278,10 @@ class ProductController extends Controller return response()->json([ 'viewsPaginate' => $this->getViewsFromPaginateModels($productModels), 'children' => $subrangeModels, + 'productModels' => $productModels, ]); } - + return $this->index($productModels, $subrangeModels); } @@ -295,17 +296,19 @@ class ProductController extends Controller Request $request ): \Illuminate\Http\JsonResponse|\Illuminate\Contracts\View\View { Cache::put('productsFilter', 'subrange'); - $rangeModel = Range::query() + $rangeModel = Range::query() ->where('slug', $request->model_slug) ->where('published', true) ->first(); - $subrangeModel = Subrange::query() + + $subrangeModel = Subrange::query() ->when(!is_null($rangeModel), function (Builder $q) use ($rangeModel) { $q->where('range_id', $rangeModel->getKey()); }) ->where('slug', $request->child_slug) ->where('published', true) ->first(); + $subrangeModels = Subrange::query() ->when(!is_null($rangeModel), function (Builder $q) use ($rangeModel) { $q->where('range_id', $rangeModel->getKey()); @@ -323,10 +326,12 @@ class ProductController extends Controller }) ->orderBy('slug') ->paginate($this->productModelsPerPage); + if ($request->ajax()) { return response()->json([ + 'productModels' => $productModels, 'viewsPaginate' => $this->getViewsFromPaginateModels($productModels), - 'children' => [], + 'children' => $subrangeModels, ]); } return $this->index($productModels, $subrangeModels); @@ -417,7 +422,7 @@ class ProductController extends Controller if ($request->ajax()) { return response()->json([ 'viewsPaginate' => $this->getViewsFromPaginateModels($productModels), - 'children' => [], + 'children' => $submeatModels, ]); } return $this->index($productModels, null, $submeatModels); @@ -550,12 +555,15 @@ class ProductController extends Controller } - /** - * Delete the "sub" start filter to avoid "subsubrange" when user has some filters and hard visit a total different product filter - * @var string $filter - * - */ - private function cleanSubSubFilter($filter) { + /** + * Delete the "sub" start filter to avoid "subsubrange" when user has some filters + * and hard visit a total different product filter + * + * @var string $filter + * @return mixed + */ + private function cleanSubSubFilter($filter): mixed + { return str_starts_with($filter, "sub") ? preg_replace('/^sub/', '', $filter) : $filter; } } diff --git a/resources/ts/fo/components/SearchModelComponent.vue b/resources/ts/fo/components/SearchModelComponent.vue index 05012db8..1b96c233 100644 --- a/resources/ts/fo/components/SearchModelComponent.vue +++ b/resources/ts/fo/components/SearchModelComponent.vue @@ -556,6 +556,17 @@ function initChildrenSwiper(): void { }); } +/** + * Choose between "sub" or root route. + * e.g fo.search.subrange or fo.search.range + * @return string + */ +const routeOrSubRouteSearch = () => { + if(filtersDetailsParameters.selectedChildModel) { + return filters.value[getFilterById(filtersDetailsParameters.selectedFilterId)].children?.route ?? filters.value[getFilterById(filtersDetailsParameters.selectedFilterId)].route; + } + return filters.value[getFilterById(filtersDetailsParameters.selectedFilterId)].route; +}; /** * Check if all models are loaded, * if not, get next models. @@ -571,16 +582,19 @@ function checkScroll(): void { ) { paginationParameters.page++; paginationParameters.loading = true; + + let routeCustom = (searchParameters.selectedList?.length) ? (getRouteFilter(searchParameters.routeWords) + `?page=${paginationParameters.page}&words=${searchParameters.selectedList.join(",")}`) : getRouteFilter( - filters.value[getFilterById(filtersDetailsParameters.selectedFilterId)].route, + routeOrSubRouteSearch(), (filtersDetailsParameters.selectedChildFilter.length) ? { model_slug: filtersDetailsParameters.selectedFilter, child_slug: filtersDetailsParameters.selectedChildFilter, page: paginationParameters.page } : (filtersDetailsParameters.selectedFilter.length) ? { model_slug: filtersDetailsParameters.selectedFilter, page: paginationParameters.page } : { page: paginationParameters.page } ); + let url = (filtersDetailsParameters.selectedChildFilter.length) ? filtersDetailsParameters.selectedChildFilter : ((filtersDetailsParameters.selectedFilter.length) @@ -693,6 +707,7 @@ function ajaxCall( filtersDetailsParameters.viewsPaginate = (concatResult) ? filtersDetailsParameters.viewsPaginate.concat(newViewsPaginate) : newViewsPaginate; + if (updateChildren) { filters.value[getFilterById(filtersDetailsParameters.selectedFilterId)].children!.models = reponse.data.children; }