ILIAS  trunk Revision v11.0_alpha-1753-gb21ca8c4367
All Data Structures Namespaces Files Functions Variables Enumerations Enumerator Modules Pages
class.ilCtrlAbstractPath.php
Go to the documentation of this file.
1 <?php
2 
19 declare(strict_types=1);
20 
26 abstract class ilCtrlAbstractPath implements ilCtrlPathInterface
27 {
32 
37 
41  protected ?string $cid_path = null;
42 
48  public function __construct(ilCtrlStructureInterface $structure)
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 }
getCidPaths(int $order=SORT_DESC)
$context
Definition: webdav.php:31
getNextCid(string $current_class)
Class ilCtrlAbstractPath.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
isClassParentOf(string $parent_class, string $child_class)
Returns whether the given target class is a parent of the other given class.
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...
$path
Definition: ltiservices.php:29
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
getPath()
Returns the path of this context.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
isClassChildOf(string $child_class, string $parent_class)
Returns whether the given target class is a child of the other given class.
getCidArray(int $order=SORT_DESC)
appendCid(string $cid, ?string $path=null)
Helper function to add CIDs to a given path.
__construct(ilCtrlStructureInterface $structure)
ilCtrlAbstractPath Constructor
ilCtrlStructureInterface $structure
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...