1
|
|
|
<?php |
2
|
|
|
|
3
|
|
|
declare(strict_types=1); |
4
|
|
|
|
5
|
|
|
namespace Netgen\InformationCollection\Core\Mapper; |
6
|
|
|
|
7
|
|
|
use DateTimeImmutable; |
8
|
|
|
use DateTimeInterface; |
9
|
|
|
use eZ\Publish\API\Repository\Exceptions\NotFoundException; |
10
|
|
|
use eZ\Publish\API\Repository\Repository; |
11
|
|
|
use eZ\Publish\API\Repository\Values\Content\Content as APIContent; |
12
|
|
|
use eZ\Publish\API\Repository\Values\Content\Field; |
13
|
|
|
use eZ\Publish\API\Repository\Values\ContentType\FieldDefinition; |
14
|
|
|
use eZ\Publish\API\Repository\Values\ContentType\FieldDefinitionCollection; |
15
|
|
|
use eZ\Publish\API\Repository\Values\User\User; |
16
|
|
|
use eZ\Publish\Core\Repository\Values\ContentType\ContentType as CoreContentType; |
17
|
|
|
use Netgen\InformationCollection\API\Value\Attribute; |
18
|
|
|
use Netgen\InformationCollection\API\Value\AttributeValue; |
19
|
|
|
use Netgen\InformationCollection\API\Value\Collection; |
20
|
|
|
use Netgen\InformationCollection\API\Value\Content; |
21
|
|
|
use Netgen\InformationCollection\Doctrine\Entity\EzInfoCollection; |
22
|
|
|
use Netgen\InformationCollection\Doctrine\Entity\EzInfoCollectionAttribute; |
23
|
|
|
|
24
|
|
|
final class DomainObjectMapper |
25
|
|
|
{ |
26
|
|
|
/** |
27
|
|
|
* @var \eZ\Publish\API\Repository\Repository |
28
|
|
|
*/ |
29
|
|
|
private $repository; |
30
|
|
|
|
31
|
|
|
/** |
32
|
|
|
* @var \eZ\Publish\API\Repository\ContentService |
33
|
|
|
*/ |
34
|
|
|
private $contentService; |
35
|
|
|
|
36
|
|
|
/** |
37
|
|
|
* @var \eZ\Publish\API\Repository\ContentTypeService |
38
|
|
|
*/ |
39
|
|
|
private $contentTypeService; |
40
|
|
|
|
41
|
|
|
/** |
42
|
|
|
* @var \eZ\Publish\API\Repository\UserService |
43
|
|
|
*/ |
44
|
|
|
private $userService; |
45
|
|
|
|
46
|
|
|
public function __construct(Repository $repository) |
47
|
|
|
{ |
48
|
|
|
$this->repository = $repository; |
49
|
|
|
$this->contentService = $repository->getContentService(); |
50
|
|
|
$this->contentTypeService = $repository->getContentTypeService(); |
51
|
|
|
} |
52
|
|
|
|
53
|
|
|
public function mapContent(array $data, EzInfoCollection $first, EzInfoCollection $last, int $childCount): Content |
54
|
|
|
{ |
55
|
|
|
$content = $this->contentService->loadContent((int) $data['content_id']); |
56
|
|
|
$contentType = $this->contentTypeService->loadContentType($content->contentInfo->contentTypeId); |
57
|
|
|
$hasLocation = empty($object['main_node_id']) ? false : true; |
|
|
|
|
58
|
|
|
|
59
|
|
|
return new Content( |
60
|
|
|
$content, |
61
|
|
|
$contentType, |
62
|
|
|
$this->mapCollection($first, []), |
63
|
|
|
$this->mapCollection($last, []), |
64
|
|
|
$childCount, |
65
|
|
|
$hasLocation |
66
|
|
|
); |
67
|
|
|
} |
68
|
|
|
|
69
|
|
|
public function mapCollection(EzInfoCollection $collection, array $attributes): Collection |
70
|
|
|
{ |
71
|
|
|
$content = $this->contentService->loadContent($collection->getContentObjectId()); |
72
|
|
|
/** @var CoreContentType $contentType */ |
73
|
|
|
$contentType = $this->contentTypeService |
74
|
|
|
->loadContentType( |
75
|
|
|
$content->contentInfo->contentTypeId |
76
|
|
|
); |
77
|
|
|
|
78
|
|
|
$fieldDefinitions = $contentType->getFieldDefinitions(); |
79
|
|
|
$attributeValues = []; |
80
|
|
|
|
81
|
|
|
foreach ($attributes as $attr) { |
82
|
|
|
|
83
|
|
|
$fieldDefinition = $this->getFieldDefinition($fieldDefinitions, $attr); |
84
|
|
|
|
85
|
|
|
if (!$fieldDefinition instanceof FieldDefinition) { |
|
|
|
|
86
|
|
|
continue; |
87
|
|
|
} |
88
|
|
|
|
89
|
|
|
$attributeValues[] = $this->mapAttribute($attr, $content, $fieldDefinition); |
90
|
|
|
} |
91
|
|
|
|
92
|
|
|
$user = $this->getUser($collection->getCreatorId()); |
93
|
|
|
|
94
|
|
|
return new Collection( |
95
|
|
|
$collection->getId(), |
96
|
|
|
$content, |
97
|
|
|
$user, |
98
|
|
|
$this->getDateTime($collection->getCreated()), |
99
|
|
|
$this->getDateTime($collection->getModified()), |
100
|
|
|
$attributeValues |
101
|
|
|
); |
102
|
|
|
} |
103
|
|
|
|
104
|
|
|
public function mapAttribute(EzInfoCollectionAttribute $attribute, APIContent $content, FieldDefinition $fieldDefinition): Attribute |
105
|
|
|
{ |
106
|
|
|
$classField = new Field(); |
107
|
|
|
foreach ($content->getFields() as $field) { |
108
|
|
|
if ($field->id === $attribute->getContentObjectAttributeId()) { |
109
|
|
|
$classField = $field; |
110
|
|
|
|
111
|
|
|
break; |
112
|
|
|
} |
113
|
|
|
} |
114
|
|
|
|
115
|
|
|
$value = new AttributeValue($attribute->getDataInt(), $attribute->getDataFloat(), $attribute->getDataText()); |
116
|
|
|
return new Attribute( |
117
|
|
|
$attribute->getId(), |
118
|
|
|
$classField, |
119
|
|
|
$fieldDefinition, |
120
|
|
|
$value |
121
|
|
|
); |
122
|
|
|
} |
123
|
|
|
|
124
|
|
|
private function getUser($userId): ?User |
125
|
|
|
{ |
126
|
|
|
try { |
127
|
|
|
return $this->repository |
128
|
|
|
->getUserService() |
129
|
|
|
->loadUser($userId); |
130
|
|
|
} catch (NotFoundException $exception) { |
|
|
|
|
131
|
|
|
} |
132
|
|
|
} |
133
|
|
|
|
134
|
|
|
private function getDateTime(int $timestamp): DateTimeInterface |
135
|
|
|
{ |
136
|
|
|
return DateTimeImmutable::createFromFormat('U', (string) $timestamp); |
137
|
|
|
} |
138
|
|
|
|
139
|
|
|
private function getFieldDefinition(FieldDefinitionCollection $fieldDefinitionCollection, EzInfoCollectionAttribute $attribute): ?FieldDefinition |
140
|
|
|
{ |
141
|
|
|
/** @var FieldDefinitionCollection $collection */ |
142
|
|
|
$collection = $fieldDefinitionCollection->filter(function(FieldDefinition $definition) use ($attribute) { |
143
|
|
|
return $definition->id === $attribute->getContentClassAttributeId(); |
144
|
|
|
}); |
145
|
|
|
|
146
|
|
|
if ($collection->isEmpty()) { |
147
|
|
|
return null; |
148
|
|
|
} |
149
|
|
|
|
150
|
|
|
return $collection->first(); |
151
|
|
|
} |
152
|
|
|
} |
153
|
|
|
|
This check looks for calls to
isset(...)
orempty()
on variables that are yet undefined. These calls will always produce the same result and can be removed.This is most likely caused by the renaming of a variable or the removal of a function/method parameter.