From 42c39985cd5371602a02a926b7882bb20f5de8e2 Mon Sep 17 00:00:00 2001 From: indy koning Date: Thu, 16 Nov 2023 16:33:54 +0100 Subject: [PATCH 1/3] Respect the position per category --- resources/views/components/listing.blade.php | 22 +++++++++++++++++++- src/Commands/IndexProductsCommand.php | 18 +++++++++++++--- src/Models/Product.php | 10 +++++++++ 3 files changed, 46 insertions(+), 4 deletions(-) diff --git a/resources/views/components/listing.blade.php b/resources/views/components/listing.blade.php index 51900ebe7..74f8b9300 100644 --- a/resources/views/components/listing.blade.php +++ b/resources/views/components/listing.blade.php @@ -10,7 +10,7 @@
@endisset + {{ $before ?? '' }} @if ($slot->isEmpty()) diff --git a/src/Commands/IndexProductsCommand.php b/src/Commands/IndexProductsCommand.php index 8c243289e..172047a48 100644 --- a/src/Commands/IndexProductsCommand.php +++ b/src/Commands/IndexProductsCommand.php @@ -9,6 +9,7 @@ use Rapidez\Core\Events\IndexBeforeEvent; use Rapidez\Core\Facades\Rapidez; use Rapidez\Core\Models\Category; +use Rapidez\Core\Models\CategoryProduct; use TorMorten\Eventy\Facades\Eventy; class IndexProductsCommand extends ElasticsearchIndexCommand @@ -42,9 +43,15 @@ public function handle() ], ], ]), Eventy::filter('index.product.settings', [])); - try { + $maxPositions = CategoryProduct::query() + ->selectRaw('GREATEST(MAX(position), 0) as position') + ->addSelect('category_id') + ->groupBy('category_id') + ->pluck('position', 'category_id'); + $productQuery = $productModel::selectOnlyIndexable() + ->with('categoryProducts') ->withEventyGlobalScopes('index.product.scopes') ->withExists('options AS has_options'); @@ -58,8 +65,8 @@ public function handle() $showOutOfStock = (bool) Rapidez::config('cataloginventory/options/show_out_of_stock', 0); $indexVisibility = config('rapidez.indexer.visibility'); - $productQuery->chunk($this->chunkSize, function ($products) use ($store, $bar, $categories, $showOutOfStock, $indexVisibility) { - $this->indexer->index($products, function ($product) use ($store, $categories, $showOutOfStock, $indexVisibility) { + $productQuery->chunk($this->chunkSize, function ($products) use ($store, $bar, $categories, $showOutOfStock, $indexVisibility, $maxPositions) { + $this->indexer->index($products, function ($product) use ($store, $categories, $showOutOfStock, $indexVisibility, $maxPositions) { if (! in_array($product->visibility, $indexVisibility)) { return; } @@ -78,6 +85,11 @@ public function handle() $data = $this->withCategories($data, $categories); + $data['positions'] = $product->categoryProducts + ->pluck('position', 'category_id') + // Turn all positions positive + ->mapWithKeys(fn($position, $category_id) => [$category_id => (($position * -1) + $maxPositions[$category_id])]); + return Eventy::filter('index.product.data', $data, $product); }); diff --git a/src/Models/Product.php b/src/Models/Product.php index a4fc372bd..160ad2f7b 100644 --- a/src/Models/Product.php +++ b/src/Models/Product.php @@ -6,6 +6,7 @@ use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\HasMany; +use Illuminate\Database\Eloquent\Relations\HasManyThrough; use Rapidez\Core\Casts\Children; use Rapidez\Core\Casts\CommaSeparatedToArray; use Rapidez\Core\Casts\CommaSeparatedToIntegerArray; @@ -108,6 +109,15 @@ public function options(): HasMany ); } + public function categoryProducts(): HasMany + { + return $this + ->hasMany( + config('rapidez.models.category_product'), + 'product_id', + ); + } + public function rewrites(): HasMany { return $this From 9785544eed6fe131c09a4ab4e903fbf0c578920a Mon Sep 17 00:00:00 2001 From: indykoning Date: Thu, 16 Nov 2023 15:34:31 +0000 Subject: [PATCH 2/3] Apply fixes from Duster --- src/Commands/IndexProductsCommand.php | 2 +- src/Models/Product.php | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Commands/IndexProductsCommand.php b/src/Commands/IndexProductsCommand.php index 172047a48..757eeec8f 100644 --- a/src/Commands/IndexProductsCommand.php +++ b/src/Commands/IndexProductsCommand.php @@ -88,7 +88,7 @@ public function handle() $data['positions'] = $product->categoryProducts ->pluck('position', 'category_id') // Turn all positions positive - ->mapWithKeys(fn($position, $category_id) => [$category_id => (($position * -1) + $maxPositions[$category_id])]); + ->mapWithKeys(fn ($position, $category_id) => [$category_id => (($position * -1) + $maxPositions[$category_id])]); return Eventy::filter('index.product.data', $data, $product); }); diff --git a/src/Models/Product.php b/src/Models/Product.php index 160ad2f7b..626d99e1c 100644 --- a/src/Models/Product.php +++ b/src/Models/Product.php @@ -6,7 +6,6 @@ use Illuminate\Database\Eloquent\Casts\Attribute; use Illuminate\Database\Eloquent\Relations\BelongsToMany; use Illuminate\Database\Eloquent\Relations\HasMany; -use Illuminate\Database\Eloquent\Relations\HasManyThrough; use Rapidez\Core\Casts\Children; use Rapidez\Core\Casts\CommaSeparatedToArray; use Rapidez\Core\Casts\CommaSeparatedToIntegerArray; From d12faed254013c7e9196370829a0a81aa6bf4e74 Mon Sep 17 00:00:00 2001 From: indykoning <15870933+indykoning@users.noreply.github.com> Date: Fri, 17 Nov 2023 09:51:17 +0100 Subject: [PATCH 3/3] Shorten position math --- src/Commands/IndexProductsCommand.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Commands/IndexProductsCommand.php b/src/Commands/IndexProductsCommand.php index 757eeec8f..301380115 100644 --- a/src/Commands/IndexProductsCommand.php +++ b/src/Commands/IndexProductsCommand.php @@ -88,7 +88,7 @@ public function handle() $data['positions'] = $product->categoryProducts ->pluck('position', 'category_id') // Turn all positions positive - ->mapWithKeys(fn ($position, $category_id) => [$category_id => (($position * -1) + $maxPositions[$category_id])]); + ->mapWithKeys(fn ($position, $category_id) => [$category_id => $maxPositions[$category_id] - $position]); return Eventy::filter('index.product.data', $data, $product); });