ILIAS  release_8 Revision v8.19
All Data Structures Namespaces Files Functions Variables Modules Pages
Collections.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
22 
29 
37 {
38  private array $cache = [];
42 
46  public function __construct(
47  ResourceBuilder $resource_builder,
48  CollectionBuilder $collection_builder,
49  RepositoryPreloader $preloader
50  ) {
51  $this->resource_builder = $resource_builder;
52  $this->collection_builder = $collection_builder;
53  $this->preloader = $preloader;
54  }
55 
60  public function id(
61  ?string $collection_identification = null,
62  ?int $owner = null
64  if ($collection_identification === null
65  || $collection_identification === ''
66  || !$this->collection_builder->has(new ResourceCollectionIdentification($collection_identification))
67  ) {
68  $collection = $this->collection_builder->new($owner);
69  $identification = $collection->getIdentification();
70  $this->cache[$identification->serialize()] = $collection;
71 
72  return $identification;
73  }
74 
75  return new ResourceCollectionIdentification($collection_identification);
76  }
77 
78  public function exists(string $collection_identification): bool
79  {
80  return $this->collection_builder->has(new ResourceCollectionIdentification($collection_identification));
81  }
82 
83  public function idOrNull(
84  ?string $collection_identification = null,
85  ?int $owner = null
87  if ($this->exists($collection_identification)) {
88  return $this->id($collection_identification, $owner);
89  }
90  return null;
91  }
92 
93  public function get(
94  ResourceCollectionIdentification $identification,
95  ?int $owner = null
97  $collection = $this->cache[$identification->serialize()]
98  ?? $this->collection_builder->get(
99  $identification,
100  $owner
101  );
102 
103  $preload = [];
104  foreach ($this->collection_builder->getResourceIds($identification) as $resource_identification) {
105  if ($this->resource_builder->has($resource_identification)) {
106  $collection->add($resource_identification);
107  $preload[] = $resource_identification;
108  }
109  }
110  $this->preloader->preload($preload);
111 
112  return $this->cache[$identification->serialize()] = $collection;
113  }
114 
115  public function store(ResourceCollection $collection): bool
116  {
117  return $this->collection_builder->store($collection);
118  }
119 
121  {
122  $target_collection_id = $this->id();
123  $target_collection = $this->get($target_collection_id);
124  $source_collection = $this->get($source_collection_id);
125 
126  foreach ($source_collection->getResourceIdentifications() as $identification) {
127  $resource = $this->resource_builder->get($identification);
128  $cloned_resource = $this->resource_builder->clone($resource);
129  $target_collection->add($cloned_resource->getIdentification());
130  }
131  $this->store($target_collection);
132 
133  return $target_collection_id;
134  }
135 
136  public function remove(
137  ResourceCollectionIdentification $collection_id,
138  ResourceStakeholder $stakeholder,
139  bool $delete_resources_as_well = false
140  ): bool {
141  $collection = $this->get($collection_id);
142  if ($delete_resources_as_well) {
143  foreach ($collection->getResourceIdentifications() as $resource_identification) {
144  $resource = $this->resource_builder->get($resource_identification);
145  $this->resource_builder->remove($resource, $stakeholder);
146  }
147  }
148  return $this->collection_builder->delete($collection_id);
149  }
150 
154  public function rangeAsArray(ResourceCollection $collection, int $from, int $amout): array
155  {
156  $return = [];
157  foreach ($collection->getResourceIdentifications() as $position => $identification) {
158  if ($position >= $from && $position < $from + $amout) {
159  $return[] = $identification;
160  }
161  }
162  return $return;
163  }
164 
168  public function rangeAsGenerator(ResourceCollection $collection, int $from, int $to): \Generator
169  {
170  foreach ($collection->getResourceIdentifications() as $position => $identification) {
171  if ($position >= $from && $position <= $to) {
172  yield $identification;
173  }
174  }
175  }
176 
177  public function sort(ResourceCollection $collection): Sorter
178  {
179  return new Sorter(
180  $this->resource_builder,
181  $this->collection_builder,
182  $collection
183  );
184  }
185 }
clone(ResourceCollectionIdentification $source_collection_id)
sort(ResourceCollection $collection)
__construct(ResourceBuilder $resource_builder, CollectionBuilder $collection_builder, RepositoryPreloader $preloader)
Consumers constructor.
Definition: Collections.php:46
rangeAsGenerator(ResourceCollection $collection, int $from, int $to)
id(?string $collection_identification=null, ?int $owner=null)
Definition: Collections.php:60
add(ResourceIdentification $identification)
rangeAsArray(ResourceCollection $collection, int $from, int $amout)
idOrNull(?string $collection_identification=null, ?int $owner=null)
Definition: Collections.php:83
store(ResourceCollection $collection)
exists(string $collection_identification)
Definition: Collections.php:78