-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathDocumentListBuilder.php
More file actions
114 lines (90 loc) · 3.23 KB
/
Copy pathDocumentListBuilder.php
File metadata and controls
114 lines (90 loc) · 3.23 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
<?php
/*
* This source file is available under two different licenses:
* - GNU General Public License version 3 (GPLv3)
* - DACHCOM Commercial License (DCL)
* Full copyright and license information is available in
* LICENSE.md which is distributed with this source code.
*
* @copyright Copyright (c) DACHCOM.DIGITAL AG (https://www.dachcom-digital.com)
* @license GPLv3 and DCL
*/
namespace DsTrinityDataBundle\Service\Builder;
use Doctrine\DBAL\Connection;
use DsTrinityDataBundle\DsTrinityDataEvents;
use DsTrinityDataBundle\Event\DocumentListingQueryEvent;
use Pimcore\Model\Document;
use Pimcore\Model\Element\ElementInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
class DocumentListBuilder implements DataBuilderInterface
{
public function __construct(
protected Connection $db,
protected EventDispatcherInterface $eventDispatcher
) {
}
public function buildByList(array $options): \Generator
{
$list = $this->getList($options);
$idList = $list->loadIdList();
$length = count($idList);
for ($i = 0; $i < $length; $i++) {
if ($doc = Document::getById($idList[$i])) {
yield $doc;
}
if ($i % 400 === 0) {
\Pimcore::collectGarbage();
}
}
}
public function buildByIdList(int $id, array $options): ?ElementInterface
{
$list = $this->getList($options);
$list->addConditionParam('id = ?', $id);
$list->setLimit(1);
$documents = $list->getDocuments();
if (count($documents) === 0) {
return null;
}
return $documents[0];
}
public function buildById(int $id): ?ElementInterface
{
return Document::getById($id);
}
protected function getList(array $options): Document\Listing
{
$allowedTypes = $options['document_types'];
$limit = $options['document_limit'] ?? 0;
$additionalParams = $options['document_additional_params'];
$list = new Document\Listing();
$list->setUnpublished(true);
foreach ($additionalParams as $additionalParam => $additionalValue) {
$list->addConditionParam($additionalParam, $additionalValue);
}
if ($limit > 0) {
$list->setLimit($limit);
}
$this->addDocumentTypeRestriction($list, $allowedTypes);
$event = new DocumentListingQueryEvent($list, $options);
$this->eventDispatcher->dispatch($event, DsTrinityDataEvents::LISTING_QUERY_DOCUMENTS);
return $list;
}
protected function addDocumentTypeRestriction(Document\Listing $listing, ?array $allowedTypes): Document\Listing
{
if ($allowedTypes === null) {
$allowedTypes = array_filter(Document::getTypes(), static function ($type) {
return $type !== 'folder';
});
}
if (count($allowedTypes) === 0) {
return $listing;
}
$quotedTypes = [];
foreach ($allowedTypes as $cName) {
$quotedTypes[] = $this->db->quote($cName);
}
$listing->addConditionParam(sprintf('type in(%s)', implode(',', $quotedTypes)), '');
return $listing;
}
}