From 4ba106bd0be6c2f24f1b680215dff0fc039a9e7c Mon Sep 17 00:00:00 2001 From: Philipp Kitzberger Date: Sat, 25 Oct 2025 10:48:09 +0200 Subject: [PATCH 1/6] Raise version constraints --- composer.json | 4 ++-- ext_emconf.php | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/composer.json b/composer.json index 79cad28..a030bf9 100644 --- a/composer.json +++ b/composer.json @@ -40,8 +40,8 @@ }, "require": { "php": "^8.2", - "typo3/cms-core": "^12.4", - "extcode/cart": "^9.0", + "typo3/cms-core": "^13.4", + "extcode/cart": "^11.5", "tecnickcom/tcpdf": "^6.7" }, "replace": { diff --git a/ext_emconf.php b/ext_emconf.php index 9a19e8c..c69e3bc 100644 --- a/ext_emconf.php +++ b/ext_emconf.php @@ -22,9 +22,9 @@ 'version' => '5.0.0', 'constraints' => [ 'depends' => [ - 'typo3' => '10.4.0-11.5.999', - 'cart' => '7.0.0-8.99.999', - 'tcpdf' => '3.0.0-3.99.999', + 'typo3' => '13.4.0-13.4.999', + 'cart' => '11.5', + 'tcpdf' => '6.7.0-6.99.999', ], 'conflicts' => [], 'suggests' => [], From 8433642a5c6ce6867e6adf9f8a736fcbbf27b136 Mon Sep 17 00:00:00 2001 From: Philipp Kitzberger Date: Sat, 25 Oct 2025 11:08:53 +0200 Subject: [PATCH 2/6] Applied rector migrations --- Classes/Service/TcpdfWrapper.php | 6 +++--- Tests/Unit/Domain/Model/Dto/PdfDemandTest.php | 16 ++++++++-------- ext_emconf.php | 11 +---------- 3 files changed, 12 insertions(+), 21 deletions(-) diff --git a/Classes/Service/TcpdfWrapper.php b/Classes/Service/TcpdfWrapper.php index a86b630..6970981 100644 --- a/Classes/Service/TcpdfWrapper.php +++ b/Classes/Service/TcpdfWrapper.php @@ -222,8 +222,8 @@ public function getStandaloneView(string $templatePath, string $templateFileName $view->setFormat($format); if (!empty($this->pdfSettings['view'])) { - $view->setLayoutRootPaths($this->pdfSettings['view']['layoutRootPaths']); - $view->setPartialRootPaths($this->pdfSettings['view']['partialRootPaths']); + $view->getRenderingContext()->getTemplatePaths()->setLayoutRootPaths($this->pdfSettings['view']['layoutRootPaths']); + $view->getRenderingContext()->getTemplatePaths()->setPartialRootPaths($this->pdfSettings['view']['partialRootPaths']); if ($this->pdfSettings['view']['templateRootPaths']) { foreach ($this->pdfSettings['view']['templateRootPaths'] as $pathNameKey => $pathNameValue) { @@ -234,7 +234,7 @@ public function getStandaloneView(string $templatePath, string $templateFileName $completePath = $templateRootPath . $templatePathAndFileName; if (file_exists($completePath)) { - $view->setTemplatePathAndFilename($completePath); + $view->getRenderingContext()->getTemplatePaths()->setTemplatePathAndFilename($completePath); } } } diff --git a/Tests/Unit/Domain/Model/Dto/PdfDemandTest.php b/Tests/Unit/Domain/Model/Dto/PdfDemandTest.php index 6a7ef38..8a99e75 100644 --- a/Tests/Unit/Domain/Model/Dto/PdfDemandTest.php +++ b/Tests/Unit/Domain/Model/Dto/PdfDemandTest.php @@ -26,7 +26,7 @@ protected function tearDown(): void /** * @test */ - public function getDebugInitiallyReturnsZero() + public function getDebugInitiallyReturnsZero(): void { $this->assertSame( 0, @@ -37,7 +37,7 @@ public function getDebugInitiallyReturnsZero() /** * @test */ - public function setDebugSetsDebug() + public function setDebugSetsDebug(): void { $debug = 1; @@ -51,7 +51,7 @@ public function setDebugSetsDebug() /** * @test */ - public function getFontSizeInitiallyReturnsDefaultFontSize() + public function getFontSizeInitiallyReturnsDefaultFontSize(): void { $this->assertSame( 8, @@ -62,7 +62,7 @@ public function getFontSizeInitiallyReturnsDefaultFontSize() /** * @test */ - public function setFontSizeSetsFontSize() + public function setFontSizeSetsFontSize(): void { $fontSize = 10; @@ -76,7 +76,7 @@ public function setFontSizeSetsFontSize() /** * @test */ - public function getFoldMarksEnabledInitiallyReturnsTrue() + public function getFoldMarksEnabledInitiallyReturnsTrue(): void { $this->assertTrue( $this->fixture->getFoldMarksEnabled() @@ -86,7 +86,7 @@ public function getFoldMarksEnabledInitiallyReturnsTrue() /** * @test */ - public function setFoldMarksEnabledSetsFoldMarksEnabled() + public function setFoldMarksEnabledSetsFoldMarksEnabled(): void { $this->fixture->setFoldMarksEnabled(false); $this->assertFalse( @@ -102,7 +102,7 @@ public function setFoldMarksEnabledSetsFoldMarksEnabled() /** * @test */ - public function getAddressFieldMarksEnabledInitiallyReturnsTrue() + public function getAddressFieldMarksEnabledInitiallyReturnsTrue(): void { $this->assertTrue( $this->fixture->getAddressFieldMarksEnabled() @@ -112,7 +112,7 @@ public function getAddressFieldMarksEnabledInitiallyReturnsTrue() /** * @test */ - public function setAddressFieldMarksEnabledSetsAddressFieldMarksEnabled() + public function setAddressFieldMarksEnabledSetsAddressFieldMarksEnabled(): void { $this->fixture->setAddressFieldMarksEnabled(false); $this->assertFalse( diff --git a/ext_emconf.php b/ext_emconf.php index c69e3bc..1b39d7a 100644 --- a/ext_emconf.php +++ b/ext_emconf.php @@ -9,20 +9,11 @@ 'author' => 'Daniel Gohlke', 'author_email' => 'ext.cart@extco.de', 'author_company' => 'extco.de UG (haftungsbeschränkt)', - 'shy' => '', - 'priority' => '', - 'module' => '', 'state' => 'beta', - 'internal' => '', - 'uploadfolder' => '0', - 'createDirs' => '', - 'modify_tables' => '', - 'clearCacheOnLoad' => 0, - 'lockType' => '', 'version' => '5.0.0', 'constraints' => [ 'depends' => [ - 'typo3' => '13.4.0-13.4.999', + 'typo3' => '13.4.0-13.4.99', 'cart' => '11.5', 'tcpdf' => '6.7.0-6.99.999', ], From 0e643d5996c7f3fe4a45b6bb8841297f43d7e56e Mon Sep 17 00:00:00 2001 From: Philipp Kitzberger Date: Sat, 25 Oct 2025 15:46:39 +0200 Subject: [PATCH 3/6] Update version constraints --- composer.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/composer.json b/composer.json index a030bf9..1d2258a 100644 --- a/composer.json +++ b/composer.json @@ -42,7 +42,7 @@ "php": "^8.2", "typo3/cms-core": "^13.4", "extcode/cart": "^11.5", - "tecnickcom/tcpdf": "^6.7" + "tecnickcom/tcpdf": "^6.10" }, "replace": { "extcode/cart-pdf": "self.version" From 002a3874c35a302b275011cafdf939cf7983a7ca Mon Sep 17 00:00:00 2001 From: Philipp Kitzberger Date: Sat, 25 Oct 2025 15:47:07 +0200 Subject: [PATCH 4/6] Cleanup --- Classes/Domain/Model/Dto/PdfDemand.php | 6 +++++- Configuration/TCA/Overrides/sys_template.php | 11 ++++++----- Tests/Unit/Domain/Model/Dto/PdfDemandTest.php | 3 ++- 3 files changed, 13 insertions(+), 7 deletions(-) diff --git a/Classes/Domain/Model/Dto/PdfDemand.php b/Classes/Domain/Model/Dto/PdfDemand.php index 41a06cd..0548dfc 100644 --- a/Classes/Domain/Model/Dto/PdfDemand.php +++ b/Classes/Domain/Model/Dto/PdfDemand.php @@ -1,7 +1,11 @@ Date: Sat, 25 Oct 2025 15:54:32 +0200 Subject: [PATCH 5/6] FIX: preg_replace(): Argument #3 ($subject) must be of type array|string, null given --- Classes/Service/PdfService.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Classes/Service/PdfService.php b/Classes/Service/PdfService.php index 2396902..694c309 100644 --- a/Classes/Service/PdfService.php +++ b/Classes/Service/PdfService.php @@ -256,7 +256,7 @@ protected function renderCartHeader(OrderItem $orderItem, string $pdfType): stri $view->assign('orderItem', $orderItem); $header = $view->render(); - return trim(preg_replace('~[\\n]+~', '', $header)); + return trim(preg_replace('~[\\n]+~', '', $header ?? '')); } protected function renderCartBody(OrderItem $orderItem, string $pdfType): string @@ -270,7 +270,7 @@ protected function renderCartBody(OrderItem $orderItem, string $pdfType): string $view->assign('product', $product); $product = $view->render(); - $bodyOut .= trim(preg_replace('~[\\n]+~', '', $product)); + $bodyOut .= trim(preg_replace('~[\\n]+~', '', $product ?? '')); } return $bodyOut; @@ -283,7 +283,7 @@ protected function renderCartFooter(OrderItem $orderItem, string $pdfType): stri $view->assign('orderItem', $orderItem); $footer = $view->render(); - return trim(preg_replace('~[\\n]+~', '', $footer)); + return trim(preg_replace('~[\\n]+~', '', $footer ?? '')); } /** From 7295cb67621828bcd852297b23b2b56924fc00f3 Mon Sep 17 00:00:00 2001 From: Philipp Kitzberger Date: Sat, 25 Oct 2025 18:08:00 +0200 Subject: [PATCH 6/6] Refactor EventListener The registration of the EventListener is compatible to both having and not having EXT:cart_payone installed. --- .../Finish}/DocumentRenderer.php | 16 ++++--- Configuration/Services.php | 44 +++++++++++++++++++ Configuration/Services.yaml | 15 ------- 3 files changed, 54 insertions(+), 21 deletions(-) rename Classes/EventListener/{ProcessOrderCreate => Order/Finish}/DocumentRenderer.php (76%) create mode 100644 Configuration/Services.php delete mode 100644 Configuration/Services.yaml diff --git a/Classes/EventListener/ProcessOrderCreate/DocumentRenderer.php b/Classes/EventListener/Order/Finish/DocumentRenderer.php similarity index 76% rename from Classes/EventListener/ProcessOrderCreate/DocumentRenderer.php rename to Classes/EventListener/Order/Finish/DocumentRenderer.php index 9b2536e..fd348ea 100644 --- a/Classes/EventListener/ProcessOrderCreate/DocumentRenderer.php +++ b/Classes/EventListener/Order/Finish/DocumentRenderer.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Extcode\CartPdf\EventListener\ProcessOrderCreate; +namespace Extcode\CartPdf\EventListener\Order\Finish; /* * This file is part of the package extcode/cart-pdf. @@ -11,13 +11,17 @@ * LICENSE file that was distributed with this source code. */ -use Extcode\Cart\Domain\Repository\Order\ItemRepository as OrderItemRepository; -use Extcode\Cart\Event\ProcessOrderCreateEvent; use Extcode\CartPdf\Service\PdfService; +use Extcode\Cart\Domain\Repository\Order\ItemRepository as OrderItemRepository; +use Extcode\Cart\Event\Order\EventInterface; +use Psr\Log\LoggerAwareInterface; +use Psr\Log\LoggerAwareTrait; use TYPO3\CMS\Extbase\Persistence\Generic\PersistenceManager; -class DocumentRenderer +class DocumentRenderer implements LoggerAwareInterface { + use LoggerAwareTrait; + public function __construct( protected PersistenceManager $persistenceManager, protected OrderItemRepository $orderItemRepository, @@ -25,11 +29,11 @@ public function __construct( ) { } - public function __invoke(ProcessOrderCreateEvent $event): void + public function __invoke(EventInterface $event): void { $orderItem = $event->getOrderItem(); $settings = $event->getSettings(); - + $this->logger->debug('DocumentRenderer', $settings); $generateDocuments = (array)($settings['autoGenerateDocuments'] ?? []); if (empty($generateDocuments)) { diff --git a/Configuration/Services.php b/Configuration/Services.php new file mode 100644 index 0000000..491b970 --- /dev/null +++ b/Configuration/Services.php @@ -0,0 +1,44 @@ +services(); + $services->defaults() + ->private() + ->autowire() + ->autoconfigure(); + + $services->load('Extcode\\CartPdf\\', __DIR__ . '/../Classes/') + ->exclude(__DIR__ . '/../Classes/Domain/Model/'); + + // Make PdfService public + $services->set(\Extcode\CartPdf\Service\PdfService::class) + ->public(); + + // Conditionally register event listeners based on cart_payone availability + if (class_exists('\\Extcode\\CartPayone\\Event\\Order\\FinishEvent')) { + // Register listeners for cart_payone events + $services->set('cart_pdf.event_listener.document_renderer.payone') + ->class(\Extcode\CartPdf\EventListener\Order\Finish\DocumentRenderer::class) + ->tag('event.listener', [ + 'identifier' => 'cart-pdf--order--finish--document-renderer-payone', + 'event' => \Extcode\CartPayone\Event\Order\FinishEvent::class, + 'before' => 'cart--order--finish--email', + ]); + } else { + // Register listeners for standard cart events + $services->set('cart_pdf.event_listener.document_renderer.cart') + ->class(\Extcode\CartPdf\EventListener\Order\Finish\DocumentRenderer::class) + ->tag('event.listener', [ + 'identifier' => 'cart--order--finish--document-renderer', + 'event' => \Extcode\Cart\Event\Order\FinishEvent::class, + 'before' => 'cart--order--finish--email', + ]); + } +}; diff --git a/Configuration/Services.yaml b/Configuration/Services.yaml deleted file mode 100644 index 620cd64..0000000 --- a/Configuration/Services.yaml +++ /dev/null @@ -1,15 +0,0 @@ -services: - _defaults: - autowire: true - autoconfigure: true - public: false - - Extcode\CartPdf\EventListener\ProcessOrderCreate\DocumentRenderer: - tags: - - name: event.listener - identifier: 'cart-pdf--process-order-create--document-renderer' - after: 'cart--process-order-create--order-number' - before: 'cart--process-order-create--email' - - Extcode\CartPdf\Service\PdfService: - public: true