ILIAS  trunk Revision v12.0_alpha-1227-g7ff6d300864
Collections.php
Go to the documentation of this file.
1<?php
2
19declare(strict_types=1);
20
22
30
38{
39 private array $cache = [];
40 private array $rid_cache = [];
41
45 public function __construct(private ResourceBuilder $resource_builder, private CollectionBuilder $collection_builder, private RepositoryPreloader $preloader, private Subject $events)
46 {
47 }
48
53 public function id(
54 ?string $collection_identification = null,
55 ?int $owner = null
57 if ($collection_identification === null
58 || $collection_identification === ''
59 || !$this->collection_builder->has(new ResourceCollectionIdentification($collection_identification))
60 ) {
61 $collection = $this->collection_builder->new($owner);
62 $identification = $collection->getIdentification();
63 $this->cache[$identification->serialize()] = $collection;
64
65 return $identification;
66 }
67
68 return new ResourceCollectionIdentification($collection_identification);
69 }
70
71 public function exists(string $collection_identification): bool
72 {
73 return $this->collection_builder->has(new ResourceCollectionIdentification($collection_identification));
74 }
75
76 public function idOrNull(
77 ?string $collection_identification = null,
78 ?int $owner = null
80 if ($this->exists($collection_identification)) {
81 return $this->id($collection_identification, $owner);
82 }
83 return null;
84 }
85
86 public function get(
88 ?int $owner = null
90 $rcid = $identification->serialize();
91
92 $collection = $this->cache[$rcid] ?? $this->collection_builder->get(
93 $identification,
94 $owner
95 );
96
97 $preload = [];
98
99 $rids = isset($this->cache[$rcid])
100 ? $this->cache[$rcid]->getResourceIdentifications()
101 : $this->rid_cache[$rcid]
102 ?? iterator_to_array($this->collection_builder->getResourceIds($identification));
103
104 $this->rid_cache[$rcid] = []; // reset cache for identification, rebuild it now
105 $collection->clear();
106
107 foreach ($rids as $resource_identification) {
108 if ($this->resource_builder->has($resource_identification)) {
109 $collection->add($resource_identification);
110 $preload[] = $resource_identification;
111 }
112 $this->rid_cache[$rcid][] = $resource_identification;
113 }
114 $this->preloader->preload($preload);
115
116 return $this->cache[$rcid] = $collection;
117 }
118
119 public function findIdentificationByNameIn(ResourceCollection $collection, string $name): ?ResourceIdentification
120 {
121 foreach ($collection->getResourceIdentifications() as $identification) {
122 $resource = $this->resource_builder->get($identification);
123 if ($resource->getCurrentRevisionIncludingDraft()->getTitle() === $name) {
124 return $identification;
125 }
126 }
127 return null;
128 }
129
130 public function store(ResourceCollection $collection): bool
131 {
132 $this->cache[$collection->getIdentification()->serialize()] = $collection;
133
134 return $this->collection_builder->store($collection);
135 }
136
138 {
139 $target_collection_id = $this->id();
140 $target_collection = $this->get($target_collection_id);
141 $source_collection = $this->get($source_collection_id);
142
143 foreach ($source_collection->getResourceIdentifications() as $identification) {
144 $resource = $this->resource_builder->get($identification);
145 $cloned_resource = $this->resource_builder->clone($resource);
146 $target_collection->add($cloned_resource->getIdentification());
147 }
148 $this->store($target_collection);
149
150 return $target_collection_id;
151 }
152
153 public function remove(
155 ResourceStakeholder $stakeholder,
156 bool $delete_resources_as_well = false
157 ): bool {
158 $collection = $this->get($collection_id);
159 if ($delete_resources_as_well) {
160 foreach ($collection->getResourceIdentifications() as $resource_identification) {
161 $resource = $this->resource_builder->get($resource_identification);
162 $this->resource_builder->remove($resource, $stakeholder);
163 }
164 }
165 unset($this->cache[$collection_id->serialize()]);
166
167 return $this->collection_builder->delete($collection_id);
168 }
169
173 public function rangeAsArray(ResourceCollection $collection, int $from, int $amout): array
174 {
175 $return = [];
176 foreach ($collection->getResourceIdentifications() as $position => $identification) {
177 if ($position >= $from && $position < $from + $amout) {
178 $return[] = $identification;
179 }
180 }
181 return $return;
182 }
183
187 public function rangeAsGenerator(ResourceCollection $collection, int $from, int $to): \Generator
188 {
189 foreach ($collection->getResourceIdentifications() as $position => $identification) {
190 if ($position >= $from && $position <= $to) {
191 yield $identification;
192 }
193 }
194 }
195
196 public function sort(ResourceCollection $collection): Sorter
197 {
198 return new Sorter(
199 $this->resource_builder,
200 $this->collection_builder,
201 $collection
202 );
203 }
204}
__construct(private ResourceBuilder $resource_builder, private CollectionBuilder $collection_builder, private RepositoryPreloader $preloader, private Subject $events)
Consumers constructor.
Definition: Collections.php:45
store(ResourceCollection $collection)
clone(ResourceCollectionIdentification $source_collection_id)
sort(ResourceCollection $collection)
exists(string $collection_identification)
Definition: Collections.php:71
idOrNull(?string $collection_identification=null, ?int $owner=null)
Definition: Collections.php:76
rangeAsArray(ResourceCollection $collection, int $from, int $amout)
rangeAsGenerator(ResourceCollection $collection, int $from, int $to)
id(?string $collection_identification=null, ?int $owner=null)
Definition: Collections.php:53
findIdentificationByNameIn(ResourceCollection $collection, string $name)
has(string $class_name)
if(!file_exists('../ilias.ini.php'))