-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathObjectListBuilder.php
More file actions
127 lines (100 loc) · 3.66 KB
/
ObjectListBuilder.php
File metadata and controls
127 lines (100 loc) · 3.66 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
115
116
117
118
119
120
121
122
123
124
125
126
127
<?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\ObjectListingQueryEvent;
use Pimcore\Model\DataObject;
use Pimcore\Model\Element\ElementInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
class ObjectListBuilder 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 ($object = DataObject::getById($idList[$i])) {
yield $object;
}
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);
$objects = $list->getObjects();
if (count($objects) === 0) {
return null;
}
return $objects[0];
}
public function buildById(int $id): ?ElementInterface
{
return DataObject::getById($id);
}
protected function getList(array $options): DataObject\Listing
{
$allowedTypes = $options['object_types'];
$allowedClasses = $options['object_class_names'];
$limit = $options['object_limit'] ?? 0;
$additionalParams = $options['object_additional_params'];
$list = new DataObject\Listing();
$list->setUnpublished(true);
foreach ($additionalParams as $additionalParam => $additionalValue) {
$list->addConditionParam($additionalParam, $additionalValue);
}
if ($limit > 0) {
$list->setLimit($limit);
}
$this->addObjectTypeRestriction($list, $allowedTypes);
$this->addClassNameRestriction($list, $allowedClasses);
$event = new ObjectListingQueryEvent($list, $options);
$this->eventDispatcher->dispatch($event, DsTrinityDataEvents::LISTING_QUERY_OBJECTS);
return $event->getListing();
}
protected function addObjectTypeRestriction(DataObject\Listing $listing, ?array $allowedTypes): DataObject\Listing
{
if ($allowedTypes === null) {
$allowedTypes = array_filter(DataObject::getTypes(), static function ($type) {
return $type !== 'folder';
});
}
if (count($allowedTypes) === 0) {
return $listing;
}
$listing->setObjectTypes($allowedTypes);
return $listing;
}
protected function addClassNameRestriction(DataObject\Listing $listing, array $allowedClasses): DataObject\Listing
{
if (count($allowedClasses) === 0) {
return $listing;
}
$quotedClassNames = [];
foreach ($allowedClasses as $cName) {
$quotedClassNames[] = $this->db->quote($cName);
}
$listing->addConditionParam(sprintf('className IN (%s)', implode(',', $quotedClassNames)), '');
return $listing;
}
}