Skip to content

Commit

Permalink
fix: Use NodeSourceXlsxSerializer in Export and Search node controllers
Browse files Browse the repository at this point in the history
  • Loading branch information
ambroisemaupate committed Jul 11, 2024
1 parent 5da1a44 commit 00b96e4
Show file tree
Hide file tree
Showing 5 changed files with 28 additions and 89 deletions.
8 changes: 1 addition & 7 deletions lib/RoadizCoreBundle/src/Xlsx/AbstractXlsxSerializer.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

/**
Expand Down
30 changes: 6 additions & 24 deletions lib/RoadizCoreBundle/src/Xlsx/NodeSourceXlsxSerializer.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,50 +4,36 @@

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;

/**
* @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<NodesSources>|null $nodeSource
* @return array
*/
public function toArray($nodeSource): array
Expand All @@ -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
*/
Expand Down Expand Up @@ -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;
}
}
8 changes: 1 addition & 7 deletions lib/RoadizCoreBundle/src/Xlsx/XlsxExporter.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
}

/**
Expand Down
5 changes: 1 addition & 4 deletions lib/Rozier/src/Controllers/Nodes/ExportController.php
Original file line number Diff line number Diff line change
Expand Up @@ -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);

Expand Down Expand Up @@ -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(
Expand Down
66 changes: 19 additions & 47 deletions lib/Rozier/src/Controllers/SearchController.php
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand All @@ -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
Expand Down Expand Up @@ -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);

Expand All @@ -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;
}

Expand Down Expand Up @@ -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',
Expand All @@ -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' => [
Expand Down Expand Up @@ -363,14 +365,15 @@ protected function handleNodeTypeForm(FormInterface $nodeTypeForm): ?RedirectRes
}

/**
* @param Request $request
* @param FormInterface $form
* @param NodeType $nodetype
*
* @return null|Response
* @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 = [];
Expand Down Expand Up @@ -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,
[]
);
Expand All @@ -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;
}

Expand All @@ -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
Expand Down

0 comments on commit 00b96e4

Please sign in to comment.