From b82dd6400f4480c73d9d275de3d44e27ac847f98 Mon Sep 17 00:00:00 2001 From: rintisch Date: Tue, 11 Jun 2024 08:11:48 +0200 Subject: [PATCH 1/6] [FEATURE] Enable link from cart to detail view This is a needed adaption to make it possible that a product detail view can be linked from the product list of the cart. Fixes: #167 --- Classes/Controller/ProductController.php | 4 ++++ Classes/EventListener/Create/CreateCartProduct.php | 7 ++++++- Resources/Private/Partials/Product/CartForm.html | 1 + Resources/Private/Templates/Product/ShowForm.html | 5 +++-- 4 files changed, 14 insertions(+), 3 deletions(-) diff --git a/Classes/Controller/ProductController.php b/Classes/Controller/ProductController.php index 55bf0c89..c7aad3b2 100644 --- a/Classes/Controller/ProductController.php +++ b/Classes/Controller/ProductController.php @@ -203,8 +203,12 @@ public function showFormAction(Product $product = null): ResponseInterface $product = $this->getProduct(); } + $frontendController = $this->request->getAttribute('frontend.controller'); + $detailViewPageUid = $frontendController->getRequestedId(); + $this->view->assign('product', $product); $this->view->assign('cartSettings', $this->cartConfiguration['settings']); + $this->view->assign('detailViewPageUid', $detailViewPageUid); $this->assignCurrencyTranslationData(); return $this->htmlResponse(); diff --git a/Classes/EventListener/Create/CreateCartProduct.php b/Classes/EventListener/Create/CreateCartProduct.php index eb92210b..aa1213fb 100644 --- a/Classes/EventListener/Create/CreateCartProduct.php +++ b/Classes/EventListener/Create/CreateCartProduct.php @@ -32,7 +32,8 @@ public function __invoke(RetrieveProductsFromRequestEvent $event): void $taxClasses[$productProduct->getTaxClassId()], (int)$request->getArgument('quantity'), $productProduct->getIsNetPrice(), - $event->getCartFeVariant() + $event->getCartFeVariant(), + $request->getArgument('detailViewParameter') ); $cartProduct->setMaxNumberInCart($productProduct->getMaxNumberInOrder()); @@ -53,6 +54,10 @@ public function __invoke(RetrieveProductsFromRequestEvent $event): void $cartProduct->setIsVirtualProduct(true); } + $cartProduct->addDetailViewParameter('extensionName', 'cartproducts'); + $cartProduct->addDetailViewParameter('pluginName', 'products'); + $cartProduct->addDetailViewParameter('controller', 'product'); + $event->setCartProduct($cartProduct); } } diff --git a/Resources/Private/Partials/Product/CartForm.html b/Resources/Private/Partials/Product/CartForm.html index 2765279f..50444a8a 100644 --- a/Resources/Private/Partials/Product/CartForm.html +++ b/Resources/Private/Partials/Product/CartForm.html @@ -17,6 +17,7 @@ additionalAttributes="{data-ajax: '{f:if(condition: \'{settings.addToCartByAjax}\', then: \'1\', else: \'0\')}', data-type: 'slot', data-id: '{slot.uid}'}"> + diff --git a/Resources/Private/Templates/Product/ShowForm.html b/Resources/Private/Templates/Product/ShowForm.html index 6705bee8..e6d2777c 100644 --- a/Resources/Private/Templates/Product/ShowForm.html +++ b/Resources/Private/Templates/Product/ShowForm.html @@ -6,7 +6,8 @@ - +
@@ -18,4 +19,4 @@ - \ No newline at end of file + From cac989cd51fd8668db827562374f3c2757f07160 Mon Sep 17 00:00:00 2001 From: rintisch Date: Wed, 19 Jun 2024 07:17:14 +0200 Subject: [PATCH 2/6] [TASK] Improve naming, do not use __construct() --- Classes/Controller/ProductController.php | 4 ++-- Classes/EventListener/Create/CreateCartProduct.php | 10 +++++----- Resources/Private/Partials/Product/CartForm.html | 2 +- Resources/Private/Templates/Product/ShowForm.html | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Classes/Controller/ProductController.php b/Classes/Controller/ProductController.php index c7aad3b2..7e672848 100644 --- a/Classes/Controller/ProductController.php +++ b/Classes/Controller/ProductController.php @@ -204,11 +204,11 @@ public function showFormAction(Product $product = null): ResponseInterface } $frontendController = $this->request->getAttribute('frontend.controller'); - $detailViewPageUid = $frontendController->getRequestedId(); + $detailPageUid = $frontendController->getRequestedId(); $this->view->assign('product', $product); $this->view->assign('cartSettings', $this->cartConfiguration['settings']); - $this->view->assign('detailViewPageUid', $detailViewPageUid); + $this->view->assign('detailPageUid', $detailPageUid); $this->assignCurrencyTranslationData(); return $this->htmlResponse(); diff --git a/Classes/EventListener/Create/CreateCartProduct.php b/Classes/EventListener/Create/CreateCartProduct.php index aa1213fb..37ad3d09 100644 --- a/Classes/EventListener/Create/CreateCartProduct.php +++ b/Classes/EventListener/Create/CreateCartProduct.php @@ -32,8 +32,7 @@ public function __invoke(RetrieveProductsFromRequestEvent $event): void $taxClasses[$productProduct->getTaxClassId()], (int)$request->getArgument('quantity'), $productProduct->getIsNetPrice(), - $event->getCartFeVariant(), - $request->getArgument('detailViewParameter') + $event->getCartFeVariant() ); $cartProduct->setMaxNumberInCart($productProduct->getMaxNumberInOrder()); @@ -54,9 +53,10 @@ public function __invoke(RetrieveProductsFromRequestEvent $event): void $cartProduct->setIsVirtualProduct(true); } - $cartProduct->addDetailViewParameter('extensionName', 'cartproducts'); - $cartProduct->addDetailViewParameter('pluginName', 'products'); - $cartProduct->addDetailViewParameter('controller', 'product'); + $cartProduct->addDetailPageParameter('pageUid', $request->getArgument('detailPageUid')); + $cartProduct->addDetailPageParameter('extensionName', 'cartproducts'); + $cartProduct->addDetailPageParameter('pluginName', 'products'); + $cartProduct->addDetailPageParameter('controller', 'product'); $event->setCartProduct($cartProduct); } diff --git a/Resources/Private/Partials/Product/CartForm.html b/Resources/Private/Partials/Product/CartForm.html index 50444a8a..a9d1429f 100644 --- a/Resources/Private/Partials/Product/CartForm.html +++ b/Resources/Private/Partials/Product/CartForm.html @@ -17,7 +17,7 @@ additionalAttributes="{data-ajax: '{f:if(condition: \'{settings.addToCartByAjax}\', then: \'1\', else: \'0\')}', data-type: 'slot', data-id: '{slot.uid}'}"> - + diff --git a/Resources/Private/Templates/Product/ShowForm.html b/Resources/Private/Templates/Product/ShowForm.html index e6d2777c..6eff0ccb 100644 --- a/Resources/Private/Templates/Product/ShowForm.html +++ b/Resources/Private/Templates/Product/ShowForm.html @@ -7,7 +7,7 @@ + arguments="{product: product, pid: cartSettings.cart.pid, detailPageUid: detailPageUid}"/>
From 20267dce9a061f28c24d6be6650d86ab0b372e9b Mon Sep 17 00:00:00 2001 From: rintisch Date: Thu, 20 Jun 2024 06:25:38 +0200 Subject: [PATCH 3/6] [TASK] Use `DetailPageLinkFactory` --- .../EventListener/Create/CreateCartProduct.php | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/Classes/EventListener/Create/CreateCartProduct.php b/Classes/EventListener/Create/CreateCartProduct.php index 37ad3d09..b9233489 100644 --- a/Classes/EventListener/Create/CreateCartProduct.php +++ b/Classes/EventListener/Create/CreateCartProduct.php @@ -11,11 +11,14 @@ * LICENSE file that was distributed with this source code. */ +use Extcode\Cart\Domain\Model\Cart\DetailPageLinkFactoryInterface; use Extcode\Cart\Domain\Model\Cart\Product; use Extcode\CartProducts\Event\RetrieveProductsFromRequestEvent; class CreateCartProduct { + public function __construct(protected DetailPageLinkFactoryInterface $detailPageLinkFactory) + {} public function __invoke(RetrieveProductsFromRequestEvent $event): void { $request = $event->getRequest(); @@ -53,10 +56,16 @@ public function __invoke(RetrieveProductsFromRequestEvent $event): void $cartProduct->setIsVirtualProduct(true); } - $cartProduct->addDetailPageParameter('pageUid', $request->getArgument('detailPageUid')); - $cartProduct->addDetailPageParameter('extensionName', 'cartproducts'); - $cartProduct->addDetailPageParameter('pluginName', 'products'); - $cartProduct->addDetailPageParameter('controller', 'product'); + if($request->getArgument('detailPageUid')){ + $detailPageLink = $this->detailPageLinkFactory->getDetailPageLink( + (int)$request->getArgument('detailPageUid'), + 'cartproducts', + 'products', + 'product' + ); + $cartProduct->setDetailPageLink($detailPageLink); + } + $event->setCartProduct($cartProduct); } From 1d139c2a2bdd89913be99bb2150df86624f9784f Mon Sep 17 00:00:00 2001 From: rintisch Date: Mon, 24 Jun 2024 06:36:35 +0200 Subject: [PATCH 4/6] [TASK] Satisfy coding guideline --- Classes/EventListener/Create/CreateCartProduct.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Classes/EventListener/Create/CreateCartProduct.php b/Classes/EventListener/Create/CreateCartProduct.php index b9233489..27494fb0 100644 --- a/Classes/EventListener/Create/CreateCartProduct.php +++ b/Classes/EventListener/Create/CreateCartProduct.php @@ -17,8 +17,7 @@ class CreateCartProduct { - public function __construct(protected DetailPageLinkFactoryInterface $detailPageLinkFactory) - {} + public function __construct(protected DetailPageLinkFactoryInterface $detailPageLinkFactory) {} public function __invoke(RetrieveProductsFromRequestEvent $event): void { $request = $event->getRequest(); @@ -56,7 +55,7 @@ public function __invoke(RetrieveProductsFromRequestEvent $event): void $cartProduct->setIsVirtualProduct(true); } - if($request->getArgument('detailPageUid')){ + if ($request->getArgument('detailPageUid')) { $detailPageLink = $this->detailPageLinkFactory->getDetailPageLink( (int)$request->getArgument('detailPageUid'), 'cartproducts', @@ -66,7 +65,6 @@ public function __invoke(RetrieveProductsFromRequestEvent $event): void $cartProduct->setDetailPageLink($detailPageLink); } - $event->setCartProduct($cartProduct); } } From 85621c686427bfdd59b80b98442de79ebaa10ab1 Mon Sep 17 00:00:00 2001 From: rintisch Date: Thu, 10 Oct 2024 15:55:26 +0200 Subject: [PATCH 5/6] [TASK] Adaption after split of ProductPlugin After the migration of switchableControllerActions the pluginName can differ which needs to be considered. --- Classes/Controller/ProductController.php | 28 +++++++++++++++++-- .../Create/CreateCartProduct.php | 5 ++-- .../Private/Partials/Product/CartForm.html | 5 +++- .../Private/Templates/Product/ShowForm.html | 2 +- 4 files changed, 33 insertions(+), 7 deletions(-) diff --git a/Classes/Controller/ProductController.php b/Classes/Controller/ProductController.php index 7e672848..1dcd2a99 100644 --- a/Classes/Controller/ProductController.php +++ b/Classes/Controller/ProductController.php @@ -203,12 +203,11 @@ public function showFormAction(Product $product = null): ResponseInterface $product = $this->getProduct(); } - $frontendController = $this->request->getAttribute('frontend.controller'); - $detailPageUid = $frontendController->getRequestedId(); + $detailLinkData = $this->getDetailLinkData($this->request); $this->view->assign('product', $product); $this->view->assign('cartSettings', $this->cartConfiguration['settings']); - $this->view->assign('detailPageUid', $detailPageUid); + $this->view->assign('detailLinkData', $detailLinkData); $this->assignCurrencyTranslationData(); return $this->htmlResponse(); @@ -346,4 +345,27 @@ protected function restoreSession(): void $this->cart = $this->cartUtility->getNewCart($this->cartConfiguration); $this->sessionHandler->writeCart($this->cartConfiguration['settings']['cart']['pid'], $this->cart); } + + private function getDetailLinkData(Request $request): array + { + $frontendController = $request->getAttribute('frontend.controller'); + $requestArguments = $frontendController->getPageArguments()->getArguments(); + + $pluginNamespace = preg_grep('/tx_cartproducts_.*/', array_keys($requestArguments)); + $pluginNamespace = array_shift($pluginNamespace); + + $pluginArguments = $requestArguments[$pluginNamespace]; + $controller = $pluginArguments['controller']; + $action = $pluginArguments['action']; + $pluginName = preg_replace('/tx_cartproducts_/', '', $pluginNamespace); + + $detailPageUid = $frontendController->getRequestedId(); + + return [ + 'uid' => $detailPageUid, + 'pluginName' => $pluginName, + 'controller' => $controller, + 'action' => $action, + ]; + } } diff --git a/Classes/EventListener/Create/CreateCartProduct.php b/Classes/EventListener/Create/CreateCartProduct.php index 27494fb0..f1b75bf5 100644 --- a/Classes/EventListener/Create/CreateCartProduct.php +++ b/Classes/EventListener/Create/CreateCartProduct.php @@ -59,8 +59,9 @@ public function __invoke(RetrieveProductsFromRequestEvent $event): void $detailPageLink = $this->detailPageLinkFactory->getDetailPageLink( (int)$request->getArgument('detailPageUid'), 'cartproducts', - 'products', - 'product' + $request->getArgument('detailPagePluginName'), + $request->getArgument('detailPageController'), + $request->getArgument('detailPageAction') ); $cartProduct->setDetailPageLink($detailPageLink); } diff --git a/Resources/Private/Partials/Product/CartForm.html b/Resources/Private/Partials/Product/CartForm.html index a9d1429f..cb8a0377 100644 --- a/Resources/Private/Partials/Product/CartForm.html +++ b/Resources/Private/Partials/Product/CartForm.html @@ -17,7 +17,10 @@ additionalAttributes="{data-ajax: '{f:if(condition: \'{settings.addToCartByAjax}\', then: \'1\', else: \'0\')}', data-type: 'slot', data-id: '{slot.uid}'}"> - + + + + diff --git a/Resources/Private/Templates/Product/ShowForm.html b/Resources/Private/Templates/Product/ShowForm.html index 6eff0ccb..bb4e216d 100644 --- a/Resources/Private/Templates/Product/ShowForm.html +++ b/Resources/Private/Templates/Product/ShowForm.html @@ -7,7 +7,7 @@ + arguments="{product: product, pid: cartSettings.cart.pid, detailLinkData: detailLinkData}"/>
From 0f6750d9c53d81f1eff3f1082016091cb102af59 Mon Sep 17 00:00:00 2001 From: rintisch Date: Sun, 27 Oct 2024 09:09:04 +0100 Subject: [PATCH 6/6] [BUGFIX] Enable links for SingleProduct plugin Link from the cart product list to products which are put into the cart from a landing page (doktype `183`) via the plugin `cartproducts_singleproduct` are no correctly resolved. --- Classes/Controller/ProductController.php | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/Classes/Controller/ProductController.php b/Classes/Controller/ProductController.php index 1dcd2a99..723c0af2 100644 --- a/Classes/Controller/ProductController.php +++ b/Classes/Controller/ProductController.php @@ -185,7 +185,7 @@ public function showAction(Product $product = null): ResponseInterface { if ((int)$GLOBALS['TSFE']->page['doktype'] === 183) { $productUid = (int)$GLOBALS['TSFE']->page['cart_products_product']; - $product = $this->productRepository->findByUid($productUid); + $product = $this->productRepository->findByUid($productUid); } $this->view->assign('product', $product); @@ -349,18 +349,24 @@ protected function restoreSession(): void private function getDetailLinkData(Request $request): array { $frontendController = $request->getAttribute('frontend.controller'); + $detailPageUid = $frontendController->getRequestedId(); + $requestArguments = $frontendController->getPageArguments()->getArguments(); $pluginNamespace = preg_grep('/tx_cartproducts_.*/', array_keys($requestArguments)); $pluginNamespace = array_shift($pluginNamespace); + if (!$pluginNamespace) { + return [ + 'uid' => $detailPageUid, + ]; + } + $pluginArguments = $requestArguments[$pluginNamespace]; $controller = $pluginArguments['controller']; $action = $pluginArguments['action']; $pluginName = preg_replace('/tx_cartproducts_/', '', $pluginNamespace); - $detailPageUid = $frontendController->getRequestedId(); - return [ 'uid' => $detailPageUid, 'pluginName' => $pluginName,