Skip to content

Commit fc5bc7a

Browse files
author
a.dmitryuk
committed
[feature] Pass entityDto to queryBuilderCallable in AssociationField
1 parent fd6be13 commit fc5bc7a

File tree

3 files changed

+12
-4
lines changed

3 files changed

+12
-4
lines changed

doc/fields/AssociationField.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ If you already define custom queries in repository methods, you can reuse them
122122
inside the callable::
123123

124124
yield AssociationField::new('...')->setQueryBuilder(
125-
fn (QueryBuilder $queryBuilder): QueryBuilder => $queryBuilder->getEntityManager()->getRepository(Foo::class)->getSomeQueryBuilder();
125+
fn (QueryBuilder $queryBuilder, ?EntityDto $dto): QueryBuilder => $queryBuilder->getEntityManager()->getRepository(Foo::class)->getSomeQueryBuilder();
126126
);
127127

128128
Alternatively, you can use the `query_builder option`_ of Symfony's

src/Controller/AbstractCrudController.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -482,7 +482,13 @@ public function autocomplete(AdminContext $context): JsonResponse
482482
$queryBuilderCallable = $field?->getCustomOption(AssociationField::OPTION_QUERY_BUILDER_CALLABLE);
483483

484484
if (null !== $queryBuilderCallable) {
485-
$queryBuilderCallable($queryBuilder);
485+
$entityId = $autocompleteContext['entityId'] ?: null;
486+
$entityFcqn = $autocompleteContext['entityFqcn'] ?: null;
487+
if (null !== $entityId && null !== $entityFcqn) {
488+
$entityDto = $this->container->get(EntityFactory::class)->create($entityFcqn, $entityId);
489+
}
490+
491+
$queryBuilderCallable($queryBuilder, $entityDto ?? null);
486492
}
487493

488494
$paginator = $this->container->get(PaginatorFactory::class)->create($queryBuilder);

src/Field/Configurator/AssociationConfigurator.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,8 @@ public function configure(FieldDto $field, EntityDto $entityDto, AdminContext $c
168168
EA::CRUD_CONTROLLER_FQCN => $context->getRequest()->attributes->get(EA::CRUD_CONTROLLER_FQCN) ?? $context->getRequest()->query->get(EA::CRUD_CONTROLLER_FQCN),
169169
'propertyName' => $propertyName,
170170
'originatingPage' => $context->getCrud()->getCurrentPage(),
171+
EA::ENTITY_ID => $entityDto->getPrimaryKeyValueAsString(),
172+
EA::ENTITY_FQCN => $entityDto->getFqcn(),
171173
])
172174
->generateUrl();
173175
} catch (RouteNotFoundException $e) {
@@ -177,12 +179,12 @@ public function configure(FieldDto $field, EntityDto $entityDto, AdminContext $c
177179

178180
$field->setFormTypeOption('attr.data-ea-autocomplete-endpoint-url', $autocompleteEndpointUrl ?? null);
179181
} else {
180-
$field->setFormTypeOptionIfNotSet('query_builder', static function (EntityRepository $repository) use ($field) {
182+
$field->setFormTypeOptionIfNotSet('query_builder', static function (EntityRepository $repository) use ($entityDto, $field) {
181183
// TODO: should this use `createIndexQueryBuilder` instead, so we get the default ordering etc.?
182184
// it would then be identical to the one used in autocomplete action, but it is a bit complex getting it in here
183185
$queryBuilder = $repository->createQueryBuilder('entity');
184186
if (null !== $queryBuilderCallable = $field->getCustomOption(AssociationField::OPTION_QUERY_BUILDER_CALLABLE)) {
185-
$queryBuilderCallable($queryBuilder);
187+
$queryBuilderCallable($queryBuilder, $entityDto);
186188
}
187189

188190
return $queryBuilder;

0 commit comments

Comments
 (0)