From 00b96e437fb03842a5f9caee2d542e6b6a7d8b13 Mon Sep 17 00:00:00 2001 From: Ambroise Maupate Date: Thu, 11 Jul 2024 18:44:18 +0200 Subject: [PATCH] fix: Use NodeSourceXlsxSerializer in Export and Search node controllers --- .../src/Xlsx/AbstractXlsxSerializer.php | 8 +-- .../src/Xlsx/NodeSourceXlsxSerializer.php | 30 ++------- .../src/Xlsx/XlsxExporter.php | 8 +-- .../Controllers/Nodes/ExportController.php | 5 +- .../src/Controllers/SearchController.php | 66 ++++++------------- 5 files changed, 28 insertions(+), 89 deletions(-) diff --git a/lib/RoadizCoreBundle/src/Xlsx/AbstractXlsxSerializer.php b/lib/RoadizCoreBundle/src/Xlsx/AbstractXlsxSerializer.php index d0c05487..664457b4 100644 --- a/lib/RoadizCoreBundle/src/Xlsx/AbstractXlsxSerializer.php +++ b/lib/RoadizCoreBundle/src/Xlsx/AbstractXlsxSerializer.php @@ -12,14 +12,8 @@ */ abstract class AbstractXlsxSerializer implements SerializerInterface { - protected TranslatorInterface $translator; - - /** - * @param TranslatorInterface $translator - */ - public function __construct(TranslatorInterface $translator) + public function __construct(protected readonly TranslatorInterface $translator) { - $this->translator = $translator; } /** diff --git a/lib/RoadizCoreBundle/src/Xlsx/NodeSourceXlsxSerializer.php b/lib/RoadizCoreBundle/src/Xlsx/NodeSourceXlsxSerializer.php index 437f9e11..40747f99 100644 --- a/lib/RoadizCoreBundle/src/Xlsx/NodeSourceXlsxSerializer.php +++ b/lib/RoadizCoreBundle/src/Xlsx/NodeSourceXlsxSerializer.php @@ -4,14 +4,12 @@ namespace RZ\Roadiz\CoreBundle\Xlsx; -use Doctrine\Common\Collections\Collection; use Doctrine\Persistence\ObjectManager; use RZ\Roadiz\Contracts\NodeType\NodeTypeInterface; use RZ\Roadiz\Core\AbstractEntities\AbstractField; use RZ\Roadiz\CoreBundle\Entity\NodesSources; use RZ\Roadiz\CoreBundle\Entity\NodeTypeField; use Symfony\Cmf\Component\Routing\RouteObjectInterface; -use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Contracts\Translation\TranslatorInterface; @@ -19,35 +17,23 @@ * @deprecated XLSX serialization is deprecated and will be removed in next major version. * XLSX Serialization handler for NodeSource. */ -class NodeSourceXlsxSerializer extends AbstractXlsxSerializer +final class NodeSourceXlsxSerializer extends AbstractXlsxSerializer { - protected ObjectManager $objectManager; - protected Request $request; - protected UrlGeneratorInterface $urlGenerator; - protected bool $forceLocale = false; protected bool $addUrls = false; protected bool $onlyTexts = false; - /** - * - * @param ObjectManager $objectManager - * @param TranslatorInterface $translator - * @param UrlGeneratorInterface $urlGenerator - */ public function __construct( - ObjectManager $objectManager, TranslatorInterface $translator, - UrlGeneratorInterface $urlGenerator + private readonly ObjectManager $objectManager, + private readonly UrlGeneratorInterface $urlGenerator ) { parent::__construct($translator); - $this->objectManager = $objectManager; - $this->urlGenerator = $urlGenerator; } /** * Create a simple associative array with a NodeSource. * - * @param NodesSources|Collection|array|null $nodeSource + * @param NodesSources|iterable|null $nodeSource * @return array */ public function toArray($nodeSource): array @@ -72,7 +58,7 @@ public function toArray($nodeSource): array $data['meta_description'] = $nodeSource->getMetaDescription(); $data = array_merge($data, $this->getSourceFields($nodeSource)); - } elseif ($nodeSource instanceof Collection || is_array($nodeSource)) { + } elseif (is_iterable($nodeSource)) { /* * If asked to serialize a nodeSource collection */ @@ -166,15 +152,11 @@ public function setOnlyTexts(bool $onlyTexts = true): self } /** - * @param Request $request - * @param bool $forceLocale * @return NodeSourceXlsxSerializer */ - public function addUrls(Request $request, bool $forceLocale = false): self + public function addUrls(): self { $this->addUrls = true; - $this->request = $request; - $this->forceLocale = $forceLocale; return $this; } } diff --git a/lib/RoadizCoreBundle/src/Xlsx/XlsxExporter.php b/lib/RoadizCoreBundle/src/Xlsx/XlsxExporter.php index a6ec7a40..e82e931f 100644 --- a/lib/RoadizCoreBundle/src/Xlsx/XlsxExporter.php +++ b/lib/RoadizCoreBundle/src/Xlsx/XlsxExporter.php @@ -16,14 +16,8 @@ */ class XlsxExporter { - protected TranslatorInterface $translator; - - /** - * @param TranslatorInterface $translator - */ - public function __construct(TranslatorInterface $translator) + public function __construct(protected readonly TranslatorInterface $translator) { - $this->translator = $translator; } /** diff --git a/lib/Rozier/src/Controllers/Nodes/ExportController.php b/lib/Rozier/src/Controllers/Nodes/ExportController.php index 4ba71fd0..abc4d1f1 100644 --- a/lib/Rozier/src/Controllers/Nodes/ExportController.php +++ b/lib/Rozier/src/Controllers/Nodes/ExportController.php @@ -34,9 +34,6 @@ public function __construct(private readonly NodeSourceXlsxSerializer $xlsxSeria */ public function exportAllXlsxAction(Request $request, int $translationId, ?int $parentNodeId = null): Response { - /* - * Get translation - */ $translation = $this->em() ->find(Translation::class, $translationId); @@ -69,7 +66,7 @@ public function exportAllXlsxAction(Request $request, int $translationId, ?int $ ->findBy($criteria, $order); $this->xlsxSerializer->setOnlyTexts(true); - $this->xlsxSerializer->addUrls($request, $this->getSettingsBag()->get('force_locale')); + $this->xlsxSerializer->addUrls(); $xlsx = $this->xlsxSerializer->serialize($sources); $response = new Response( diff --git a/lib/Rozier/src/Controllers/SearchController.php b/lib/Rozier/src/Controllers/SearchController.php index 1cff1ec9..e615d884 100644 --- a/lib/Rozier/src/Controllers/SearchController.php +++ b/lib/Rozier/src/Controllers/SearchController.php @@ -5,7 +5,6 @@ namespace Themes\Rozier\Controllers; use DateTime; -use IteratorAggregate; use PhpOffice\PhpSpreadsheet\Exception; use RZ\Roadiz\Core\AbstractEntities\AbstractField; use RZ\Roadiz\CoreBundle\Entity\Node; @@ -18,7 +17,7 @@ use RZ\Roadiz\CoreBundle\Form\NodeStatesType; use RZ\Roadiz\CoreBundle\Form\NodeTypesType; use RZ\Roadiz\CoreBundle\Form\SeparatorType; -use RZ\Roadiz\CoreBundle\Xlsx\XlsxExporter; +use RZ\Roadiz\CoreBundle\Xlsx\NodeSourceXlsxSerializer; use Symfony\Component\Form\ClickableInterface; use Symfony\Component\Form\Extension\Core\Type\CheckboxType; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; @@ -44,6 +43,10 @@ class SearchController extends RozierApp protected bool $pagination = true; protected ?int $itemPerPage = null; + public function __construct(protected readonly NodeSourceXlsxSerializer $xlsxSerializer) + { + } + /** * @param mixed $var * @return bool @@ -265,7 +268,6 @@ public function searchNodeSourceAction(Request $request, int $nodetypeId): Respo $this->extendForm($builder, $nodetype); $this->addButtons($builder, true); - /** @var Form $form */ $form = $builder->getForm(); $form->handleRequest($request); @@ -277,7 +279,7 @@ public function searchNodeSourceAction(Request $request, int $nodetypeId): Respo return $response; } - if (null !== $response = $this->handleNodeForm($form, $nodetype)) { + if (null !== $response = $this->handleNodeForm($request, $form, $nodetype)) { return $response; } @@ -314,11 +316,11 @@ protected function buildNodeTypeForm(?int $nodetypeId = null): FormBuilderInterf /** * @param FormBuilderInterface $builder - * @param bool $exportXlsx + * @param bool $export * * @return FormBuilderInterface */ - protected function addButtons(FormBuilderInterface $builder, bool $exportXlsx = false): FormBuilderInterface + protected function addButtons(FormBuilderInterface $builder, bool $export = false): FormBuilderInterface { $builder->add('search', SubmitType::class, [ 'label' => 'search.a.node', @@ -327,7 +329,7 @@ protected function addButtons(FormBuilderInterface $builder, bool $exportXlsx = ], ]); - if ($exportXlsx) { + if ($export) { $builder->add('export', SubmitType::class, [ 'label' => 'export.all.nodesSource', 'attr' => [ @@ -363,6 +365,7 @@ protected function handleNodeTypeForm(FormInterface $nodeTypeForm): ?RedirectRes } /** + * @param Request $request * @param FormInterface $form * @param NodeType $nodetype * @@ -370,7 +373,7 @@ protected function handleNodeTypeForm(FormInterface $nodeTypeForm): ?RedirectRes * @throws Exception * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception */ - protected function handleNodeForm(FormInterface $form, NodeType $nodetype): ?Response + protected function handleNodeForm(Request $request, FormInterface $form, NodeType $nodetype): ?Response { if ($form->isSubmitted() && $form->isValid()) { $data = []; @@ -416,8 +419,13 @@ protected function handleNodeForm(FormInterface $form, NodeType $nodetype): ?Res */ $button = $form->get('export'); if ($button instanceof ClickableInterface && $button->isClicked()) { + $filename = 'search-' . $nodetype->getName() . '-' . date("YmdHis") . '.xlsx'; + $this->xlsxSerializer->setOnlyTexts(true); + $this->xlsxSerializer->addUrls(); + $xlsx = $this->xlsxSerializer->serialize($entities); + $response = new Response( - $this->getXlsxResults($nodetype, $entities), + $xlsx, Response::HTTP_OK, [] ); @@ -426,10 +434,11 @@ protected function handleNodeForm(FormInterface $form, NodeType $nodetype): ?Res 'Content-Disposition', $response->headers->makeDisposition( ResponseHeaderBag::DISPOSITION_ATTACHMENT, - 'search.xlsx' + $filename ) ); + $response->prepare($request); return $response; } @@ -441,43 +450,6 @@ protected function handleNodeForm(FormInterface $form, NodeType $nodetype): ?Res return null; } - /** - * @param NodeType $nodetype - * @param array|IteratorAggregate $entities - * - * @return string - * @throws Exception - * @throws \PhpOffice\PhpSpreadsheet\Writer\Exception - */ - protected function getXlsxResults(NodeType $nodetype, iterable $entities): string - { - $fields = $nodetype->getFields(); - $keys = []; - $answers = []; - $keys[] = "title"; - /** @var NodeTypeField $field */ - foreach ($fields as $field) { - if (!$field->isVirtual() && !$field->isCollection()) { - $keys[] = $field->getName(); - } - } - foreach ($entities as $idx => $nodesSource) { - $array = []; - foreach ($keys as $key) { - $getter = 'get' . str_replace('_', '', ucwords($key)); - $tmp = $nodesSource->$getter(); - if (is_array($tmp)) { - $tmp = implode(',', $tmp); - } - $array[] = $tmp; - } - $answers[$idx] = $array; - } - - $exporter = new XlsxExporter($this->getTranslator()); - return $exporter->exportXlsx($answers, $keys); - } - /** * @param string $prefix * @return FormBuilderInterface