From 43a7805b5ea8f45b5d9a9d6565851cd25482df8d Mon Sep 17 00:00:00 2001 From: Brandon Shipley Date: Fri, 5 Sep 2025 02:51:43 -0700 Subject: [PATCH] require cartesian product library, product skus add update --- composer.json | 3 +- .../ProductCategoryVariantsController.php | 17 ------ src/Controller/ProductSkusController.php | 46 ++++++++++++---- templates/ProductSkus/add.php | 55 +++++++++++++++++-- 4 files changed, 87 insertions(+), 34 deletions(-) diff --git a/composer.json b/composer.json index 6d9e879..ee109aa 100644 --- a/composer.json +++ b/composer.json @@ -9,7 +9,8 @@ "dereuromark/cakephp-tools": "^3.9", "muffin/trash": "^4.2", "hi-powered-dev/cheese-cake": "dev-prod", - "cakephp/cakephp": "^5.0.1" + "cakephp/cakephp": "^5.0.1", + "bentools/cartesian-product": "dev-master" }, "require-dev": { "phpunit/phpunit": "^10.1", diff --git a/src/Controller/ProductCategoryVariantsController.php b/src/Controller/ProductCategoryVariantsController.php index beb6843..184cf94 100644 --- a/src/Controller/ProductCategoryVariantsController.php +++ b/src/Controller/ProductCategoryVariantsController.php @@ -150,21 +150,4 @@ class ProductCategoryVariantsController extends AppController return $this->redirect(['action' => 'index']); } - - /** - * Gets the users table instance - * - * @return Table - */ - public function getTable() - { - if ($this->_table instanceof Table) { - return $this->_table; - } - $this->_table = TableRegistry::getTableLocator()->get( - Configure::read('CakeProducts.ProductCategoryVariants.table', 'CakeProducts.ProductCategoryVariants') - ); - - return $this->_table; - } } diff --git a/src/Controller/ProductSkusController.php b/src/Controller/ProductSkusController.php index 3ec6b41..4d6df0d 100644 --- a/src/Controller/ProductSkusController.php +++ b/src/Controller/ProductSkusController.php @@ -4,8 +4,10 @@ declare(strict_types=1); namespace CakeProducts\Controller; use Cake\Log\Log; +use Cake\Utility\Hash; use CakeProducts\Controller\AppController; use CheeseCake\Controller\Traits\OverrideTableTrait; +use function BenTools\CartesianProduct\combinations; /** * ProductSkus Controller @@ -58,30 +60,52 @@ class ProductSkusController extends AppController * * @return \Cake\Http\Response|null|void Redirects on successful add, renders view otherwise. */ - public function add() + public function add($productId = null) { - $productSku = $this->ProductSkus->newEmptyEntity(); + $toGetCartesianProductsFrom = []; + $productSkus = []; + $table = $this->getTable(); + + $productCategoryVariants = $table->Products->ProductCategoryVariants->find() + ->contain(['ProductCategoryVariantOptions']) + ->where(['product_id' => $productId]) + ->toArray(); + $optionMapping = Hash::combine($productCategoryVariants, '{n}.product_category_variant_options.{n}.id', '{n}.product_category_variant_options.{n}.variant_value'); + $variantNameMapping = Hash::combine($productCategoryVariants, '{n}.id', '{n}.name'); + foreach ($productCategoryVariants as $productCategoryVariant) { + $options = Hash::extract($productCategoryVariant->product_category_variant_options ?? [], '{n}.id'); + $toGetCartesianProductsFrom[$productCategoryVariant->id] = $options; + } + $numSkusToAdd = count(combinations($toGetCartesianProductsFrom)); + for ($i = 0; $i < $numSkusToAdd; $i++) { + $productSkus[$i] = $this->getTable()->newEmptyEntity(); + } if ($this->request->is('post')) { - $postData = $this->request->getData(); + $postData = $this->request->getData('skus', []); $saveOptions = [ 'associated' => [], ]; + $postData = Hash::insert($postData, '{n}.product_id', $productId); // Log::debug(print_r('$postData', true)); // Log::debug(print_r($postData, true)); // Log::debug(print_r('$saveOptions', true)); // Log::debug(print_r($saveOptions, true)); - $productSku = $this->ProductSkus->patchEntity($productSku, $postData, $saveOptions); - if ($this->ProductSkus->save($productSku)) { - $this->Flash->success(__('The product sku has been saved.')); + $productSkus = $table->patchEntities($productSkus, $postData, $saveOptions); + if ($table->saveManyOrFail($productSkus)) { + $this->Flash->success(__('The product SKU(s) have been saved.')); return $this->redirect(['action' => 'index']); } - Log::debug(print_r('$productSku->getErrors() next - failed in productSkus/add', true)); - Log::debug(print_r($productSku->getErrors(), true)); - $this->Flash->error(__('The product skus could not be saved. Please, try again.')); + $this->Flash->error(__('The product SKU(s) could not be saved. Please, try again.')); } - $products = $this->ProductSkus->Products->find('list', limit: 200)->all(); - $this->set(compact('productSku', 'products')); + $this->set(compact( + 'productSkus', + 'productCategoryVariants', + 'toGetCartesianProductsFrom', + 'optionMapping', + 'variantNameMapping', + 'numSkusToAdd' + )); } /** diff --git a/templates/ProductSkus/add.php b/templates/ProductSkus/add.php index eef1695..24c06c7 100644 --- a/templates/ProductSkus/add.php +++ b/templates/ProductSkus/add.php @@ -1,22 +1,67 @@
- Form->create($productSku) ?> + Form->create($productSkus) ?>
- - element('ProductSkus/form'); ?> + +
+ + + + + + + + + + + + + + + false]; + foreach (combinations($toGetCartesianProductsFrom) as $c => $combination) : ?> + + + + + + $singleVariantName) : ?> + + + + + + +
SKUBarcodePriceCostAdd?
Form->control('skus.' . $cnt . '.sku', $labelFalse); ?>Form->control('skus.' . $cnt . '.barcode', $labelFalse); ?>Form->control('skus.' . $cnt . '.price', $labelFalse); ?>Form->control('skus.' . $cnt . '.cost', $labelFalse); ?> + Form->hidden('skus.' . $cnt . '.variants.' . $singleVariantId, ['value' => $combination[$singleVariantId] ?? null]); ?> + + Form->control('add', ['label' => false, 'type' => 'checkbox', 'checked' => true]); ?>
+
Form->button(__('Submit')) ?> Form->end() ?>