diff --git a/composer.json b/composer.json index b4faa3b0..b10325d8 100644 --- a/composer.json +++ b/composer.json @@ -8,6 +8,7 @@ "php": "^8.2", "knplabs/knp-snappy-bundle": "^1.10", "ramsey/uuid": "^4.7", + "sensiolabs/gotenberg-bundle": "^1.0", "sylius/grid-bundle": "^1.13", "sylius/resource-bundle": "^1.12", "sylius/sylius": "^2.0", diff --git a/config/services/generators.xml b/config/services/generators.xml index cfca0642..541fe8dc 100644 --- a/config/services/generators.xml +++ b/config/services/generators.xml @@ -50,6 +50,7 @@ @SyliusInvoicingPlugin/shared/download/pdf.html.twig %sylius_invoicing.template.logo_file% + %sylius_invoicing.pdf_generator.generate_with_gotenberg% diff --git a/src/DependencyInjection/Configuration.php b/src/DependencyInjection/Configuration.php index c458f559..4e3897bb 100644 --- a/src/DependencyInjection/Configuration.php +++ b/src/DependencyInjection/Configuration.php @@ -173,6 +173,7 @@ private function addPdfGeneratorSection(ArrayNodeDefinition $node): void ->children() ->booleanNode('enabled')->defaultTrue() ->end() + ->booleanNode('generate_with_gotenberg')->defaultFalse() ->end() ->end() ; diff --git a/src/DependencyInjection/SyliusInvoicingExtension.php b/src/DependencyInjection/SyliusInvoicingExtension.php index 66981182..536c7682 100644 --- a/src/DependencyInjection/SyliusInvoicingExtension.php +++ b/src/DependencyInjection/SyliusInvoicingExtension.php @@ -15,11 +15,14 @@ use Sylius\Bundle\CoreBundle\DependencyInjection\PrependDoctrineMigrationsTrait; use Sylius\Bundle\ResourceBundle\DependencyInjection\Extension\AbstractResourceExtension; +use Sylius\InvoicingPlugin\Generator\TwigToGotenbergPdfGenerator; use Symfony\Component\Config\Definition\ConfigurationInterface; use Symfony\Component\Config\FileLocator; use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Definition; use Symfony\Component\DependencyInjection\Extension\PrependExtensionInterface; use Symfony\Component\DependencyInjection\Loader\XmlFileLoader; +use Symfony\Component\DependencyInjection\Reference; final class SyliusInvoicingExtension extends AbstractResourceExtension implements PrependExtensionInterface { @@ -35,6 +38,15 @@ public function load(array $configs, ContainerBuilder $container): void $config = $this->processConfiguration($configuration, $configs); $container->setParameter('sylius_invoicing.pdf_generator.allowed_files', $config['pdf_generator']['allowed_files']); + $container->setParameter('sylius_invoicing.pdf_generator.generate_with_gotenberg', $config['pdf_generator']['generate_with_gotenberg']); + + if ($config['pdf_generator']['generate_with_gotenberg'] === true) { + $definition = new Definition(TwigToGotenbergPdfGenerator::class); + $definition->addArgument(new Reference('sensiolabs_gotenberg')); + $definition->setDecoratedService('sylius_invoicing.generator.twig_to_pdf'); + + $container->setDefinition('sylius_invoicing.gotenberg_generator.twig_to_pdf', $definition); + } } public function prepend(ContainerBuilder $container): void diff --git a/src/Generator/InvoicePdfFileGenerator.php b/src/Generator/InvoicePdfFileGenerator.php index b211caef..242ce862 100644 --- a/src/Generator/InvoicePdfFileGenerator.php +++ b/src/Generator/InvoicePdfFileGenerator.php @@ -25,6 +25,7 @@ public function __construct( private readonly InvoiceFileNameGeneratorInterface $invoiceFileNameGenerator, private readonly string $template, private readonly string $invoiceLogoPath, + private readonly bool $generateWithGotenberg, ) { } @@ -38,6 +39,7 @@ public function generate(InvoiceInterface $invoice): InvoicePdf 'invoice' => $invoice, 'channel' => $invoice->channel(), 'invoiceLogoPath' => $this->fileLocator->locate($this->invoiceLogoPath), + 'generateWithGotenberg' => $this->generateWithGotenberg, ], ); diff --git a/src/Generator/TwigToGotenbergPdfGenerator.php b/src/Generator/TwigToGotenbergPdfGenerator.php new file mode 100644 index 00000000..18373c56 --- /dev/null +++ b/src/Generator/TwigToGotenbergPdfGenerator.php @@ -0,0 +1,50 @@ +gotenberg->pdf() + ->html() + ->content($templateName, $templateParams) + ->processor( + new class implements ProcessorInterface { + public function __invoke(?string $fileName): \Generator + { + $file = ''; + + do { + $chunk = yield; + $file .= $chunk->getContent(); + } while (!$chunk->isLast()); + + return $file; + } + } + ) + ; + + return $builder->generate()->process(); + } +} diff --git a/templates/shared/download/pdf_layout.html.twig b/templates/shared/download/pdf_layout.html.twig index 78ad181a..e0f91fc9 100644 --- a/templates/shared/download/pdf_layout.html.twig +++ b/templates/shared/download/pdf_layout.html.twig @@ -113,7 +113,7 @@
- + {% block header %}{% endblock %}