diff --git a/src/Controller/Component/ShoppingCartComponent.php b/src/Controller/Component/ShoppingCartComponent.php index 87997a3..0a47e94 100644 --- a/src/Controller/Component/ShoppingCartComponent.php +++ b/src/Controller/Component/ShoppingCartComponent.php @@ -8,9 +8,11 @@ use Cake\Core\Configure; use Cake\Datasource\EntityInterface; use Cake\Datasource\Exception\RecordNotFoundException; use Cake\Event\EventInterface; +use Cake\ORM\Table; use Cake\ORM\TableRegistry; use CakeCarts\Model\Entity\CartItem; use CakeCarts\Model\Enum\CartTypeId; +use CakeCarts\Model\Table\CartsTable; /** * ShoppingCart component @@ -22,11 +24,18 @@ class ShoppingCartComponent extends Component */ protected string $userIdField; + /** + * @var CartsTable|Table $Carts + */ + protected CartsTable|Table $Carts; + + public function initialize(array $config): void { parent::initialize($config); // TODO: Change the autogenerated stub $this->userIdField = Configure::readOrFail('CakeCarts.Users.user_id') === 'uuid' ? 'user_id_uuid' : 'user_id'; + $this->Carts = TableRegistry::getTableLocator()->get(Configure::readOrFail('CakeCarts.Carts.table')); } /** @@ -48,29 +57,50 @@ class ShoppingCartComponent extends Component $this->getController()->set(compact('cart')); } + /** + * @param string $cartId + * + * @return mixed + */ + public function getCartForUserById(string $cartId) + { + $identity = $this->getController()->getRequest()->getAttribute('identity'); + $sessionId = $this->getSessionId(); + + $cartsQ = $this->Carts + ->find() + ->contain(['CartItems']) + ->where(['Carts.id' => $cartId]); + if ($identity) { + $cartsQ->where([$this->userIdField => $identity->getIdentifier()]); + } else { + $cartsQ->where(['session_id' => $sessionId]); + } + + return $cartsQ->firstOrFail(); + } + public function findExistingCartOrCreate(string $sessionId, int $cartTypeId = null) { - $cartsTable = TableRegistry::getTableLocator()->get(Configure::readOrFail('CakeCarts.Carts.table')); - $userIdField = Configure::readOrFail('CakeCarts.Users.user_id') === 'integer' ? 'user_id' : 'user_id_uuid'; $identity = $this->getController()->getRequest()->getAttribute('identity'); $cartTypeId = $cartTypeId ?? CartTypeId::Cart->value; - $cart = $cartsTable + $cart = $this->Carts ->findBySessionId($sessionId) ->contain(['CartItems']) ->where(['cart_type_id' => $cartTypeId]) ->first(); if (isset($cart) && isset($identity) && !isset($cart[$this->userIdField])) { - $cart = $cartsTable->patchEntity([ + $cart = $this->Carts->patchEntity([ $this->userIdField => $identity->getIdentifier(), ]); - $cart = $cartsTable->saveOrFail($cart); + $cart = $this->Carts->saveOrFail($cart); } if (!isset($cart)) { - $cart = $cartsTable->newEntity([ + $cart = $this->Carts->newEntity([ 'cart_type_id' => $cartTypeId, 'session_id' => $sessionId, $this->userIdField => isset($identity) ? $identity->getIdentifier() : null, @@ -78,7 +108,7 @@ class ShoppingCartComponent extends Component 'cart_items' => [], ]); - $cart = $cartsTable->saveOrFail($cart); + $cart = $this->Carts->saveOrFail($cart); } return $cart; diff --git a/templates/Carts/index.php b/templates/Carts/index.php new file mode 100644 index 0000000..3d64f04 --- /dev/null +++ b/templates/Carts/index.php @@ -0,0 +1,83 @@ + +
| = '#' ?> | += 'Foreign Key' ?> | += 'Model' ?> | += 'Qty' ?> | += 'Price' ?> | += 'Subtotal' ?> | += __('Actions') ?> | +
|---|---|---|---|---|---|---|
| = $cartItem->position === null ? $cnt : $this->Number->format($cartItem->position) ?> | += $cartItem->foreign_key_uuid ?? $cartItem->foreign_key ?> | += $cartItem->model; ?> | ++ = $this->Form->control('qty', [ + 'label' => false, + 'min' => 1, + 'step' => 1, + 'default' => $cartItem->qty, + 'value' => $cartItem->qty, + 'style' => 'width: 120px;', + 'type' => 'number', + 'data-cart-item-id' => $cartItem->id, + 'hx-put' => $this->Url->build([ + 'controller' => 'CartItems', + 'action' => 'edit', + $cartItem->id, + ]), + 'hx-swap' => 'none', + 'hx-include' => '[name="_csrfToken"], [data-cart-item-id="' . $cartItem->id . '"]', + ]) ?> + | ++ = $this->Form->control('price', [ + 'label' => false, + 'min' => 0, + 'default' => $cartItem->price, + 'value' => $cartItem->price, + 'style' => 'width: 120px;', + 'type' => 'text', + 'data-cart-item-id' => $cartItem->id, + 'hx-put' => $this->Url->build([ + 'controller' => 'CartItems', + 'action' => 'edit', + $cartItem->id, + ]), + 'hx-swap' => 'none', + 'hx-include' => '[name="_csrfToken"], [data-cart-item-id="' . $cartItem->id . '"]', + ]) ?> + | += $cartItem->subtotal === null ? '' : $this->Number->currency($cartItem->subtotal, 'USD') ?> | ++ = $this->Form->postLink(__('Delete'), [ + 'controller' => 'CartItems', + 'action' => 'delete', + $cartItem->id + ], ['confirm' => __('Are you sure you want to delete # {0}?', $cartItem->id)]) ?> + | +