diff --git a/src/Controller/AppController.php b/src/Controller/AppController.php index 4a64f8c..c63822f 100644 --- a/src/Controller/AppController.php +++ b/src/Controller/AppController.php @@ -4,7 +4,6 @@ declare(strict_types=1); namespace CakeProducts\Controller; use App\Controller\AppController as BaseController; -use Cake\Log\Log; class AppController extends BaseController { diff --git a/src/Controller/ProductSkusController.php b/src/Controller/ProductSkusController.php index 4d6df0d..f57a611 100644 --- a/src/Controller/ProductSkusController.php +++ b/src/Controller/ProductSkusController.php @@ -5,7 +5,6 @@ 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; @@ -80,24 +79,6 @@ class ProductSkusController extends AppController for ($i = 0; $i < $numSkusToAdd; $i++) { $productSkus[$i] = $this->getTable()->newEmptyEntity(); } - if ($this->request->is('post')) { - $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)); - $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']); - } - $this->Flash->error(__('The product SKU(s) could not be saved. Please, try again.')); - } $this->set(compact( 'productSkus', 'productCategoryVariants', @@ -106,6 +87,43 @@ class ProductSkusController extends AppController 'variantNameMapping', 'numSkusToAdd' )); + + if ($this->request->is('post')) { + $postedSkus = $this->request->getData(); + $saveOptions = [ + 'associated' => [], + ]; + + $postedSkus = Hash::insert($postedSkus, '{n}.product_id', $productId); + + foreach ($postedSkus as $postedSkuCnt => $postedSku) { + if ($postedSku['add'] ?? false) { + continue; + } + unset($postedSkus[$postedSkuCnt]); + if ($productSkus[$postedSkuCnt] ?? false) { + unset($productSkus[$postedSkuCnt]); + } + } + + if (!$productSkus || !$postedSkus) { + $this->Flash->error('Nothing to save! Add at least one SKU next time.'); + + return; + } + + $productSkus = $table->patchEntities($productSkus, $postedSkus, $saveOptions); + if ($table->saveManyOrFail($productSkus, $saveOptions)) { + $this->Flash->success(__(count($productSkus) . ' New SKUs have been saved.')); + + return $this->redirect(['action' => 'index']); + } + + $this->Flash->error(__('The product SKU(s) could not be saved. Please, try again.')); + } + $this->set(compact( + 'productSkus' + )); } /** diff --git a/src/Model/Table/ProductSkusTable.php b/src/Model/Table/ProductSkusTable.php index 7e22c32..cbb349b 100644 --- a/src/Model/Table/ProductSkusTable.php +++ b/src/Model/Table/ProductSkusTable.php @@ -4,6 +4,7 @@ declare(strict_types=1); namespace CakeProducts\Model\Table; use Cake\Core\Configure; +use Cake\ORM\Query\SelectQuery; use CakeProducts\Model\Table\ProductsTable; use Cake\Datasource\EntityInterface; use Cake\Datasource\ResultSetInterface; @@ -60,6 +61,7 @@ class ProductSkusTable extends Table $this->addBehavior('Timestamp'); $this->belongsTo('Products', [ + 'className' => 'CakeProducts.Products', 'foreignKey' => 'product_id', 'joinType' => 'INNER', ]); diff --git a/templates/ProductSkus/add.php b/templates/ProductSkus/add.php index 24c06c7..9a30aed 100644 --- a/templates/ProductSkus/add.php +++ b/templates/ProductSkus/add.php @@ -4,8 +4,7 @@ use function BenTools\CartesianProduct\combinations; /** * @var \App\View\AppView $this - * @var \App\Model\Entity\ProductSku $productSku - * @var \Cake\Collection\CollectionInterface|string[] $products + * @var \App\Model\Entity\ProductSku[] $productSkus */ @@ -26,6 +25,7 @@ use function BenTools\CartesianProduct\combinations;
Add? | SKU | Barcode | Price | @@ -35,7 +35,6 @@ use function BenTools\CartesianProduct\combinations; foreach ($variantNameMapping as $singleVariantName) : ?>= $singleVariantName; ?> | -Add? | |||||
---|---|---|---|---|---|---|---|---|---|---|
= $this->Form->control('skus.' . $cnt . '.sku', $labelFalse); ?> | -= $this->Form->control('skus.' . $cnt . '.barcode', $labelFalse); ?> | -= $this->Form->control('skus.' . $cnt . '.price', $labelFalse); ?> | -= $this->Form->control('skus.' . $cnt . '.cost', $labelFalse); ?> | - $singleVariantName) : ?> += $this->Form->control($cnt . '.add', ['label' => false, 'type' => 'checkbox', 'checked' => true]); ?> | += $this->Form->control($cnt . '.sku', $labelFalse); ?> | += $this->Form->control($cnt . '.barcode', $labelFalse); ?> | += $this->Form->control($cnt . '.price', $labelFalse); ?> | += $this->Form->control($cnt . '.cost', $labelFalse); ?> | + $singleVariantName) : ?>- = $this->Form->hidden('skus.' . $cnt . '.variants.' . $singleVariantId, ['value' => $combination[$singleVariantId] ?? null]); ?> + = $this->Form->hidden($cnt . '.product_skus_variant_values.' . $variantCnt . '.product_category_variant_id', ['value' => $singleVariantId ?? null]); ?> + = $this->Form->hidden($cnt . '.product_skus_variant_values.' . $variantCnt . '.product_category_variant_option_id', ['value' => $combination[$singleVariantId] ?? null]); ?> = $optionMapping[$combination[$singleVariantId]]; ?> | - -= $this->Form->control('add', ['label' => false, 'type' => 'checkbox', 'checked' => true]); ?> | +