Skip to content

Commit bffe931

Browse files
authored
Merge pull request #77 from itk-dev/feature/SUPP0RT-1246-export-filter
SUPP0RT-1246: Fixed and refactored filter query
2 parents dfa0134 + 2460208 commit bffe931

File tree

3 files changed

+87
-73
lines changed

3 files changed

+87
-73
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ Versioning](https://semver.org/spec/v2.0.0.html).
88

99
## [Unreleased]
1010

11+
* [PR-77](https://github.com/itk-dev/kunstdatabasen/pull/77)
12+
Applied search filter on export
1113
* [PR-76](https://github.com/itk-dev/kunstdatabasen/pull/76)
1214
Updated composer packages
1315

src/Controller/ItemController.php

Lines changed: 84 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
use App\Repository\ArtworkRepository;
1717
use App\Repository\ItemRepository;
1818
use Doctrine\ORM\EntityManagerInterface;
19+
use Doctrine\ORM\Query;
1920
use DoctrineBatchUtils\BatchProcessing\SimpleBatchIteratorAggregate;
2021
use Knp\Component\Pager\PaginatorInterface;
2122
use OpenSpout\Common\Entity\Row;
@@ -63,70 +64,9 @@ public function index(Request $request, ItemRepository $itemRepository, Paginato
6364
#[Route(path: '/list/{itemType}', name: 'item_list', methods: ['GET'], defaults: ['itemType' => Artwork::ITEM_TYPE])]
6465
public function list(string $itemType, Request $request, ItemRepository $itemRepository, ArtworkRepository $artworkRepository, PaginatorInterface $paginator): Response
6566
{
66-
$parameters = [];
6767
$parameters['display_advanced_filters'] = false;
6868

69-
$itemTypeClass = $this->getItemTypeClass($itemType);
70-
$form = $this->getSearchForm($itemTypeClass);
71-
72-
$form->handleRequest($request);
73-
74-
if ($form->isSubmitted() && $form->isValid()) {
75-
$data = $form->getData();
76-
77-
$width = null !== $data['width'] ? json_decode($data['width']) : null;
78-
$height = null !== $data['height'] ? json_decode($data['height']) : null;
79-
80-
switch ($itemType) {
81-
case 'artwork':
82-
$query = $artworkRepository->getQuery(
83-
$data['search'],
84-
$data['type'],
85-
$data['status'] ?? null,
86-
null,
87-
$data['building'] ?? null,
88-
$data['yearFrom'] ?? null,
89-
$data['yearTo'] ?? null,
90-
$width->min ?? null,
91-
$width->max ?? null,
92-
$height->min ?? null,
93-
$height->max ?? null,
94-
$data['artistGender'] ?? null,
95-
$data['priceFrom'] ?? null,
96-
$data['priceTo'] ?? null
97-
);
98-
break;
99-
case 'furniture':
100-
default:
101-
$query = $itemRepository->getQuery(
102-
$itemTypeClass,
103-
$data['search'],
104-
$data['type'],
105-
null,
106-
$data['building']
107-
);
108-
}
109-
110-
if (null !== $data['width']
111-
|| null !== $data['height']
112-
|| null !== $data['status']
113-
|| null !== $data['yearFrom']
114-
|| null !== $data['yearTo']
115-
|| null !== $data['artistGender']
116-
|| null !== $data['priceFrom']
117-
|| null !== $data['priceTo']) {
118-
$parameters['display_advanced_filters'] = true;
119-
}
120-
} else {
121-
switch ($itemType) {
122-
case 'artwork':
123-
$query = $artworkRepository->getQuery();
124-
break;
125-
case 'furniture':
126-
default:
127-
$query = $itemRepository->getQuery($itemTypeClass);
128-
}
129-
}
69+
[$query, $form] = $this->getFilteredQuery($itemType, $request, $itemRepository, $artworkRepository, $parameters);
13070

13171
$pagination = $paginator->paginate(
13272
$query,
@@ -160,20 +100,15 @@ public function list(string $itemType, Request $request, ItemRepository $itemRep
160100
* @return Response
161101
*/
162102
#[Route(path: '/{itemType}/export', name: 'item_export', methods: ['GET'])]
163-
public function export(string $itemType, EntityManagerInterface $entityManager): Response
103+
public function export(string $itemType, Request $request, ItemRepository $itemRepository, ArtworkRepository $artworkRepository): Response
164104
{
105+
[$query] = $this->getFilteredQuery($itemType, $request, $itemRepository, $artworkRepository);
106+
165107
// Avoid php timeout errors.
166108
set_time_limit(0);
167109
$response = new StreamedResponse();
168110

169-
$itemTypeClass = $this->getItemTypeClass($itemType);
170-
$itemRepository = $entityManager->getRepository($itemTypeClass);
171-
172-
$response->setCallback(function () use ($itemRepository) {
173-
$query = $itemRepository
174-
->createQueryBuilder('e')
175-
->getQuery();
176-
111+
$callback = function () use ($query) {
177112
$iterableItems = SimpleBatchIteratorAggregate::fromQuery(
178113
$query,
179114
100
@@ -267,7 +202,9 @@ public function export(string $itemType, EntityManagerInterface $entityManager):
267202
}
268203

269204
$writer->close();
270-
});
205+
};
206+
207+
$response->setCallback($callback);
271208

272209
$filename = sprintf('%s-eksport-%s', $itemType, (new \DateTimeImmutable())->format('d-m-Y'));
273210
$response->headers->set('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
@@ -572,4 +509,79 @@ private function getItemTypeClass(string $itemType): string
572509
default => Item::class
573510
};
574511
}
512+
513+
/**
514+
* @return array
515+
* [Query, Form]
516+
*/
517+
private function getFilteredQuery(string $itemType, Request $request, ItemRepository $itemRepository, ArtworkRepository $artworkRepository, array &$parameters = []): array
518+
{
519+
$itemTypeClass = $this->getItemTypeClass($itemType);
520+
$form = $this->getSearchForm($itemTypeClass);
521+
522+
$form->handleRequest($request);
523+
524+
if ($form->isSubmitted() && $form->isValid()) {
525+
$data = $form->getData();
526+
527+
if (null !== $data['width']
528+
|| null !== $data['height']
529+
|| null !== $data['status']
530+
|| null !== $data['yearFrom']
531+
|| null !== $data['yearTo']
532+
|| null !== $data['artistGender']
533+
|| null !== $data['priceFrom']
534+
|| null !== $data['priceTo']) {
535+
$parameters['display_advanced_filters'] = true;
536+
}
537+
538+
$width = null !== $data['width'] ? json_decode($data['width']) : null;
539+
$height = null !== $data['height'] ? json_decode($data['height']) : null;
540+
541+
switch ($itemType) {
542+
case 'artwork':
543+
$query = $artworkRepository->getQuery(
544+
$data['search'],
545+
$data['type'],
546+
$data['status'] ?? null,
547+
null,
548+
$data['building'] ?? null,
549+
$data['yearFrom'] ?? null,
550+
$data['yearTo'] ?? null,
551+
$width->min ?? null,
552+
$width->max ?? null,
553+
$height->min ?? null,
554+
$height->max ?? null,
555+
$data['artistGender'] ?? null,
556+
$data['priceFrom'] ?? null,
557+
$data['priceTo'] ?? null
558+
);
559+
break;
560+
561+
case 'furniture':
562+
default:
563+
$query = $itemRepository->getQuery(
564+
$itemTypeClass,
565+
$data['search'],
566+
$data['type'],
567+
null,
568+
$data['building']
569+
);
570+
break;
571+
}
572+
} else {
573+
switch ($itemType) {
574+
case 'artwork':
575+
$query = $artworkRepository->getQuery();
576+
break;
577+
578+
case 'furniture':
579+
default:
580+
$query = $itemRepository->getQuery($itemTypeClass);
581+
break;
582+
}
583+
}
584+
585+
return [$query, $form];
586+
}
575587
}

templates/admin/item/index.html.twig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
<div class="d-flex gap-3">
1212
{% if itemType %}
1313
<a class="btn btn-sm btn-outline-primary" href="{{ path('item_new', {itemType: itemType}) }}" role="button"><i class="fas fa-plus-circle me-1"></i>{{ 'admin.index.new'|trans }}</a>
14-
<a class="btn btn-sm btn-outline-dark" href="{{ path('item_export', {itemType: itemType}) }}" role="button"><i class="fas fa-file-export me-1"></i>{{ 'admin.index.export'|trans }}</a>
14+
<a class="btn btn-sm btn-outline-dark" href="{{ path('item_export', {itemType: itemType}|merge(app.request.query.all)) }}" role="button"><i class="fas fa-file-export me-1"></i>{{ 'admin.index.export'|trans }}</a>
1515
{% endif %}
1616
</div>
1717
</div>

0 commit comments

Comments
 (0)