ILIAS  trunk Revision v11.0_alpha-3011-gc6b235a2e85
class.ilCtrlAbstractPath.php
Go to the documentation of this file.
1<?php
2
19declare(strict_types=1);
20
26abstract class ilCtrlAbstractPath implements ilCtrlPathInterface
27{
32
36 protected ?ilCtrlException $exception = null;
37
41 protected ?string $cid_path = null;
42
49 {
50 $this->structure = $structure;
51 }
52
56 public function getCidPath(): ?string
57 {
58 // cannot use empty(), since '0' would be considered
59 // empty and that's an actual cid.
60 if (null !== $this->cid_path && '' !== $this->cid_path) {
61 return $this->cid_path;
62 }
63
64 return null;
65 }
66
70 public function getCurrentCid(): ?string
71 {
72 if (null !== $this->getCidPath()) {
73 // use default order (command- to baseclass) and
74 // retrieve the last command class (index 0).
75 return $this->getCidArray()[0];
76 }
77
78 return null;
79 }
80
84 public function getNextCid(string $current_class): ?string
85 {
86 $current_cid = $this->structure->getClassCidByName($current_class);
87 $cid_array = $this->getCidArray(SORT_ASC);
88 $cid_count = count($cid_array);
89
90 foreach ($cid_array as $index => $cid) {
91 if ($current_cid === $cid && ($index + 1) < $cid_count) {
92 return $cid_array[$index + 1];
93 }
94 }
95
96 return null;
97 }
98
102 public function getCidPaths(int $order = SORT_DESC): array
103 {
104 if (null === $this->getCidPath()) {
105 return [];
106 }
107
108 // cid array must be ascending, because the
109 // paths should always begin at the baseclass.
110 $cid_array = $this->getCidArray(SORT_ASC);
111 $cid_paths = [];
112
113 foreach ($cid_array as $index => $cid) {
114 $cid_paths[] = (0 !== $index) ?
115 $this->appendCid($cid, $cid_paths[$index - 1]) :
116 $cid
117 ;
118 }
119
120 if (SORT_DESC === $order) {
121 $cid_paths = array_reverse($cid_paths);
122 }
123
124 return $cid_paths;
125 }
126
130 public function getCidArray(int $order = SORT_DESC): array
131 {
132 if (null === $this->getCidPath()) {
133 return [];
134 }
135
136 $cid_array = explode(self::CID_PATH_SEPARATOR, $this->cid_path);
137 if (SORT_DESC === $order) {
138 $cid_array = array_reverse($cid_array);
139 }
140
141 return $cid_array;
142 }
143
147 public function getBaseClass(): ?string
148 {
149 if (null !== $this->cid_path) {
150 $cid_array = $this->getCidArray(SORT_ASC);
151 $class_name = $this->structure->getClassNameByCid($cid_array[0]);
152 if (null !== $class_name && $this->structure->isBaseClass($class_name)) {
153 return $class_name;
154 }
155 }
156
157 return null;
158 }
159
163 public function getException(): ?ilCtrlException
164 {
165 return $this->exception;
166 }
167
176 protected function getPathToRelatedClassInContext(ilCtrlContextInterface $context, string $target_class): ?string
177 {
178 if (null !== $context->getPath()->getCidPath()) {
179 foreach ($context->getPath()->getCidArray() as $index => $cid) {
180 $current_class = $this->structure->getClassNameByCid($cid);
181 if (null !== $current_class && $this->isClassChildOf($target_class, $current_class)) {
182 $cid_paths = $context->getPath()->getCidPaths();
183
184 // return the path to the class related to the
185 // target class.
186 return $cid_paths[$index];
187 }
188 }
189 }
190
191 return null;
192 }
193
202 protected function isClassChildOf(string $child_class, string $parent_class): bool
203 {
204 $children = $this->structure->getChildrenByName($parent_class);
205 if (null !== $children) {
206 return in_array(strtolower($child_class), $children, true);
207 }
208
209 return false;
210 }
211
220 protected function isClassParentOf(string $parent_class, string $child_class): bool
221 {
222 $parents = $this->structure->getParentsByName($child_class);
223 if (null !== $parents) {
224 return in_array(strtolower($parent_class), $parents, true);
225 }
226
227 return false;
228 }
229
237 protected function appendCid(string $cid, ?string $path = null): string
238 {
239 if (null === $path) {
240 return $cid;
241 }
242
243 return $path . self::CID_PATH_SEPARATOR . $cid;
244 }
245}
Class ilCtrlAbstractPath.
getPathToRelatedClassInContext(ilCtrlContextInterface $context, string $target_class)
Returns the path to a class within the given contexts current path that has a relation to the given t...
appendCid(string $cid, ?string $path=null)
Helper function to add CIDs to a given path.
ilCtrlStructureInterface $structure
isClassParentOf(string $parent_class, string $child_class)
Returns whether the given target class is a parent of the other given class.
getCidArray(int $order=SORT_DESC)
@inheritDoc
getNextCid(string $current_class)
@inheritDoc
__construct(ilCtrlStructureInterface $structure)
ilCtrlAbstractPath Constructor
isClassChildOf(string $child_class, string $parent_class)
Returns whether the given target class is a child of the other given class.
getCidPaths(int $order=SORT_DESC)
@inheritDoc
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
$path
Definition: ltiservices.php:30
$context
Definition: webdav.php:31