Skip to content

Commit

Permalink
fix: Fixed NodesType form-type with embedded data-transformer
Browse files Browse the repository at this point in the history
  • Loading branch information
ambroisemaupate committed Feb 20, 2025
1 parent 5b517cc commit 5d064f6
Show file tree
Hide file tree
Showing 5 changed files with 35 additions and 47 deletions.
2 changes: 1 addition & 1 deletion lib/RoadizCoreBundle/src/Bag/Settings.php
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
use RZ\Roadiz\CoreBundle\Repository\SettingRepository;
use Symfony\Component\Stopwatch\Stopwatch;

class Settings extends LazyParameterBag
final class Settings extends LazyParameterBag
{
private ?SettingRepository $repository = null;

Expand Down
55 changes: 31 additions & 24 deletions lib/RoadizCoreBundle/src/Form/NodesType.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,44 +24,51 @@ public function __construct(private readonly ManagerRegistry $managerRegistry)

public function buildForm(FormBuilderInterface $builder, array $options): void
{
$builder->addModelTransformer(new CallbackTransformer(function ($mixedEntities) {
if ($mixedEntities instanceof Collection) {
return $mixedEntities->toArray();
}
if (!is_array($mixedEntities)) {
return [$mixedEntities];
}
$builder->addModelTransformer(new CallbackTransformer(
function (mixed $mixedEntities) use ($options): array {
if ($mixedEntities instanceof Collection) {
$mixedEntities = $mixedEntities->toArray();
}
if (!\is_array($mixedEntities)) {
$mixedEntities = [$mixedEntities];
}

return $mixedEntities;
}, function ($mixedIds) use ($options) {
/** @var NodeRepository $repository */
$repository = $this->managerRegistry
->getRepository(Node::class)
->setDisplayingAllNodesStatuses(true);
if (\is_array($mixedIds) && 0 === count($mixedIds)) {
return [];
} elseif (\is_array($mixedIds)) {
if (false === $options['multiple']) {
return $repository->findOneBy(['id' => $mixedIds]);
$mixedIds = array_map(fn (mixed $node) => $node instanceof Node ? $node->getId() : $node, $mixedEntities);

return $mixedIds;
},
function (array|int|string|null $mixedIds) use ($options) {
if (null === $mixedIds || (\is_array($mixedIds) && 0 === count($mixedIds))) {
return $options['asMultiple'] ? [] : null;
}

if (!\is_array($mixedIds)) {
$mixedIds = [$mixedIds];
} else {
$mixedIds = array_values($mixedIds);
}

return $repository->findBy(['id' => $mixedIds]);
} elseif (true === $options['multiple']) {
return [];
} else {
return $repository->findOneById($mixedIds);
/** @var NodeRepository $repository */
$repository = $this->managerRegistry
->getRepository(Node::class)
->setDisplayingAllNodesStatuses(true);

return $options['asMultiple'] ? $repository->findBy(['id' => $mixedIds]) : $repository->find($mixedIds[0]);
}
}));
));
}

public function configureOptions(OptionsResolver $resolver): void
{
$resolver->setDefaults([
'multiple' => true,
// Need to use a different option name to avoid early transformation exceptions
'asMultiple' => true,
'nodes' => [],
]);

$resolver->setAllowedTypes('multiple', ['boolean']);
$resolver->setAllowedTypes('asMultiple', ['boolean']);
}

public function finishView(FormView $view, FormInterface $form, array $options): void
Expand Down
2 changes: 1 addition & 1 deletion lib/RoadizCoreBundle/src/Form/WebhookType.php
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ public function buildForm(FormBuilderInterface $builder, array $options): void
'required' => false,
'label' => 'webhooks.rootNode',
'help' => 'webhooks.rootNode.help',
'multiple' => false,
'asMultiple' => false,
]);

$builder->get('payload')->addModelTransformer(new CallbackTransformer(function (?array $model) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -191,16 +191,12 @@ public function listAction(Request $request): JsonResponse
// Only requires Search permission for nodes
$this->denyAccessUnlessGranted(NodeVoter::SEARCH);

if (!$request->query->has('ids')) {
throw new InvalidParameterException('Ids should be provided within an array');
}

$cleanNodeIds = array_filter($request->query->filter('ids', [], \FILTER_DEFAULT, [
'flags' => \FILTER_FORCE_ARRAY,
]));
$nodesArray = [];

if (count($cleanNodeIds)) {
if (count($cleanNodeIds) > 0) {
/** @var EntityManager $em */
$em = $this->em();
$nodes = $em->getRepository(Node::class)
Expand Down
17 changes: 1 addition & 16 deletions lib/Rozier/src/Forms/UserSecurityType.php
Original file line number Diff line number Diff line change
Expand Up @@ -58,24 +58,9 @@ public function buildForm(FormBuilderInterface $builder, array $options): void
if (true === $options['canChroot']) {
$builder->add('chroot', NodesType::class, [
'label' => 'chroot',
'asMultiple' => false,
'required' => false,
]);
$builder->get('chroot')->addModelTransformer(new CallbackTransformer(
function (mixed $mixedEntities) {
if ($mixedEntities instanceof Node) {
return [$mixedEntities];
}

return [];
},
function (mixed $mixedIds) {
if (\is_array($mixedIds) && 1 === count($mixedIds)) {
return $mixedIds[0];
}

return null;
}
));
}
}

Expand Down

0 comments on commit 5d064f6

Please sign in to comment.