ILIAS  trunk Revision v12.0_alpha-1227-g7ff6d300864
class.ilPCSection.php
Go to the documentation of this file.
1<?php
2
25{
27 protected ilCtrl $ctrl;
28 protected ilLanguage $lng;
29
30 public function init(): void
31 {
32 global $DIC;
33
34 $this->access = $DIC->access();
35 $this->ctrl = $DIC->ctrl();
36 $this->lng = $DIC->language();
37 $this->setType("sec");
38 }
39
40 public function create(
41 ilPageObject $a_pg_obj,
42 string $a_hier_id,
43 string $a_pc_id = ""
44 ): void {
46 $a_hier_id,
47 $a_pc_id,
48 "Section",
49 ["Characteristic" => "Block"]
50 );
51 }
52
53 public function setCharacteristic(string $a_char): void
54 {
55 $this->dom_util->setAttribute($this->getChildNode(), "Characteristic", $a_char);
56 }
57
58 public function getCharacteristic(): string
59 {
60 if (is_object($this->getChildNode())) {
61 $char = $this->getChildNode()->getAttribute("Characteristic");
62 if (substr($char, 0, 4) == "ilc_") {
63 $char = substr($char, 4);
64 }
65 return $char;
66 }
67 return "";
68 }
69
70 public static function getLangVars(): array
71 {
72 return array("ed_insert_section");
73 }
74
78 public static function afterPageUpdate(
79 ilPageObject $a_page,
80 DOMDocument $a_domdoc,
81 string $a_xml,
82 bool $a_creation
83 ): void {
84 self::saveTimings($a_page);
85 }
86
90 public function modifyPageContentPostXsl(
91 string $a_output,
92 string $a_mode,
93 bool $a_abstract_only = false
94 ): string {
95 $a_output = self::insertTimings($a_output);
96 $a_output = $this->handleAccess($a_output, $a_mode);
97
98 return $a_output;
99 }
100
101 public function setActiveFrom(int $a_unix_ts): void
102 {
103 $a_unix_ts = ($a_unix_ts > 0) ? (string) $a_unix_ts : null;
104 $this->dom_util->setAttribute($this->getChildNode(), "ActiveFrom", $a_unix_ts);
105 }
106
110 public function getActiveFrom(): int
111 {
112 if (is_object($this->getChildNode())) {
113 return (int) $this->getChildNode()->getAttribute("ActiveFrom");
114 }
115 return 0;
116 }
117
121 public function setActiveTo(int $a_unix_ts): void
122 {
123 $a_unix_ts = ($a_unix_ts > 0) ? (string) $a_unix_ts : null;
124 $this->dom_util->setAttribute($this->getChildNode(), "ActiveTo", $a_unix_ts);
125 }
126
127 public function getActiveTo(): int
128 {
129 if (is_object($this->getChildNode())) {
130 return (int) $this->getChildNode()->getAttribute("ActiveTo");
131 }
132 return 0;
133 }
134
139 public function setPermission(string $a_val): void
140 {
141 $this->dom_util->setAttribute($this->getChildNode(), "Permission", $a_val);
142 }
143
144 public function getPermission(): string
145 {
146 return $this->getChildNode()->getAttribute("Permission");
147 }
148
149 public function setPermissionRefId(int $a_ref_id): void
150 {
151 $this->dom_util->setAttribute($this->getChildNode(), "PermissionRefId", "il__ref_" . $a_ref_id);
152 }
153
154 public function getPermissionRefId(): int
155 {
156 $id = explode("_", $this->getChildNode()->getAttribute("PermissionRefId"));
157 if (isset($id[3]) && in_array($id[1], array("", 0, IL_INST_ID))) {
158 return (int) $id[3];
159 }
160 return 0;
161 }
162
166 public function setNoLink(): void
167 {
168 $this->dom_util->deleteAllChildsByName($this->getChildNode(), ["IntLink", "ExtLink"]);
169 }
170
174 public function setExtLink(string $a_href): void
175 {
176 $this->setNoLink();
177 if (trim($a_href) != "") {
178 $attributes = array("Href" => trim($a_href));
179 $this->dom_util->setFirstOptionalElement(
180 $this->getChildNode(),
181 "ExtLink",
182 [],
183 "",
184 $attributes
185 );
186 }
187 }
188
192 public function setIntLink(
193 string $a_type,
194 string $a_target,
195 string $a_target_frame,
196 string $a_anchor = ""
197 ): void {
198 $this->setNoLink();
199 $attributes = array("Type" => $a_type, "Target" => $a_target,
200 "TargetFrame" => $a_target_frame);
201 if ($a_anchor !== "") {
202 $attributes["Anchor"] = trim($a_anchor);
203 }
204 $this->dom_util->setFirstOptionalElement(
205 $this->getChildNode(),
206 "IntLink",
207 [],
208 "",
209 $attributes
210 );
211 }
212
213 public function getLink(): array
214 {
215 $childs = $this->getChildNode()->childNodes;
216 foreach ($childs as $child) {
217 if ($child->nodeName === "ExtLink") {
218 return array("LinkType" => "ExtLink",
219 "Href" => $child->getAttribute("Href"));
220 }
221 if ($child->nodeName === "IntLink") {
222 return array("LinkType" => "IntLink",
223 "Target" => $child->getAttribute("Target"),
224 "Type" => $child->getAttribute("Type"),
225 "TargetFrame" => $child->getAttribute("TargetFrame"),
226 "Anchor" => $child->getAttribute("Anchor")
227 );
228 }
229 }
230 return array("LinkType" => "NoLink");
231 }
232
233
234 public function handleAccess(
235 string $a_html,
236 string $a_mode
237 ): string {
238 $ilAccess = $this->access;
239
240 while (($start = strpos($a_html, "{{{{{Section;Access;")) > 0) {
241 $end = strpos($a_html, "}}}}}", $start);
242 $access_attr = explode(";", substr($a_html, $start, $end - $start));
243 $id = explode("_", $access_attr[3]);
244 $section_nr = $access_attr[6];
245 $access = true;
246 if (in_array($id[1], array("", 0, IL_INST_ID)) && $id[3] > 0) {
247 if ($access_attr[5] == "no_read") {
248 $access = !$ilAccess->checkAccess("read", "", $id[3]);
249 } else {
250 $access = $ilAccess->checkAccess($access_attr[5], "", $id[3]);
251 }
252 }
253 if ($a_mode == ilPageObjectGUI::EDIT) {
254 $access = true;
255 }
256 $end_limiter = "{{{{{Section;AccessEnd;" . $section_nr . "}}}}}";
257 if ($access) {
258 $a_html = substr($a_html, 0, $start) . substr($a_html, $end + 5);
259 $a_html = str_replace($end_limiter, "", $a_html);
260 } else {
261 $end = strpos($a_html, $end_limiter, $start);
262 $a_html = substr($a_html, 0, $start) . substr($a_html, $end + strlen($end_limiter));
263 }
264 }
265
266 $a_html = str_replace("{{{{{Section;Access}}}}}", "", $a_html);
267 return $a_html;
268 }
269
270 public static function saveTimings(
271 ilPageObject $a_page
272 ): void {
273 global $DIC;
274
275 $ilDB = $DIC->database();
276 $dom_util = $DIC->copage()->internal()->domain()->domUtil();
277
278 $ilDB->manipulate(
279 "DELETE FROM copg_section_timings WHERE " .
280 " page_id = " . $ilDB->quote($a_page->getId(), "integer") .
281 " AND parent_type = " . $ilDB->quote($a_page->getParentType(), "text")
282 );
283
284 $doc = $a_page->getDomDoc();
285
286 // media aliases
287 $path = "//Section";
288 $nodes = $dom_util->path($doc, $path);
289 foreach ($nodes as $node) {
290 $from = $node->getAttribute("ActiveFrom");
291 if ($from != "") {
292 $ilDB->replace(
293 "copg_section_timings",
294 array(
295 "page_id" => array("integer", $a_page->getId()),
296 "parent_type" => array("text", $a_page->getParentType()),
297 "unix_ts" => array("integer", $from)
298 ),
299 array()
300 );
301 }
302 $to = $node->getAttribute("ActiveTo");
303 if ($to != "") {
304 $ilDB->replace(
305 "copg_section_timings",
306 array(
307 "page_id" => array("integer", $a_page->getId()),
308 "parent_type" => array("text", $a_page->getParentType()),
309 "unix_ts" => array("integer", $to)
310 ),
311 array()
312 );
313 }
314 }
315 }
316
322 public static function getCacheTriggerString(
323 ilPageObject $a_page
324 ): string {
325 global $DIC;
326
327 $ilDB = $DIC->database();
328
329 $set = $ilDB->query(
330 "SELECT * FROM copg_section_timings " .
331 " WHERE page_id = " . $ilDB->quote($a_page->getId(), "integer") .
332 " AND parent_type = " . $ilDB->quote($a_page->getParentType(), "text")
333 );
334 $str = "1"; // changed to 1 to force cache miss for #24277
335 $current_ts = new ilDateTime(time(), IL_CAL_UNIX);
336 $current_ts = $current_ts->get(IL_CAL_UNIX);
337 while ($rec = $ilDB->fetchAssoc($set)) {
338 $unix_ts = $rec["unix_ts"];
339 if ($unix_ts < $current_ts) {
340 $unix_ts .= "a";
341 }
342 $str .= "-" . $unix_ts;
343 }
344
345 return $str;
346 }
347
352 public function insertTimings(
353 string $a_html
354 ): string {
355 $lng = $this->lng;
356
357 $end = 0;
358 $start = strpos($a_html, "{{{{{Section;ActiveFrom");
359 if (is_int($start)) {
360 $end = strpos($a_html, "}}}}}", $start);
361 }
362 $i = 1;
363 while ($end > 0) {
364 $param = substr($a_html, $start + 13, $end - $start - 13);
365 $param = explode(";", $param);
366 $from = $param[1];
367 $to = $param[3];
368 $html = "";
369 if ($from != "") {
371 $from = new ilDateTime($from, IL_CAL_UNIX);
372 $html .= $lng->txt("cont_active_from") . ": " . ilDatePresentation::formatDate($from);
373 }
374 if ($to != "") {
375 $to = new ilDateTime($to, IL_CAL_UNIX);
376 $html .= " " . $lng->txt("cont_active_to") . ": " . ilDatePresentation::formatDate($to);
377 }
378
379 $h2 = substr($a_html, 0, $start) .
380 $html .
381 substr($a_html, $end + 5);
382 $a_html = $h2;
383 $i++;
384
385 $start = strpos($a_html, "{{{{{Section;ActiveFrom;", $start + 5);
386 $end = 0;
387 if (is_int($start)) {
388 $end = strpos($a_html, "}}}}}", $start);
389 }
390 }
391 return $a_html;
392 }
393
394 public function getProtected(): bool
395 {
396 if (is_object($this->getChildNode())) {
397 return ($this->getChildNode()->getAttribute("Protected") === "1");
398 }
399
400 return false;
401 }
402
403 public function setProtected(bool $val): void
404 {
405 if ($val) {
406 $this->getChildNode()->setAttribute("Protected", "1");
407 } else {
408 $this->getChildNode()->setAttribute("Protected", "0");
409 }
410 }
411
412 public function getModel(): ?stdClass
413 {
414 if ($this->getChildNode()->nodeName !== "Section") {
415 return null;
416 }
417 $model = new stdClass();
418 $model->protected = $this->getProtected();
419
420 return $model;
421 }
422}
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
Definition: plugin.php:23
const IL_CAL_UNIX
Class ilCtrl provides processing control methods.
static setUseRelativeDates(bool $a_status)
set use relative dates
static formatDate(ilDateTime $date, bool $a_skip_day=false, bool $a_include_wd=false, bool $include_seconds=false, ?ilObjUser $user=null,)
@classDescription Date and time handling
language handling
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
setExtLink(string $a_href)
Set link of area to an external one.
static getCacheTriggerString(ilPageObject $a_page)
Get page cache update trigger string.
setProtected(bool $val)
handleAccess(string $a_html, string $a_mode)
setIntLink(string $a_type, string $a_target, string $a_target_frame, string $a_anchor="")
Set link of area to an internal one.
setCharacteristic(string $a_char)
insertTimings(string $a_html)
Insert timings (in edit mode)
init()
Init object.
ilLanguage $lng
static saveTimings(ilPageObject $a_page)
setPermissionRefId(int $a_ref_id)
setActiveTo(int $a_unix_ts)
Set activation to.
ilAccessHandler $access
setPermission(string $a_val)
Set permission.
setNoLink()
Set no link.
setActiveFrom(int $a_unix_ts)
static getLangVars()
Get lang vars needed for editing.
modifyPageContentPostXsl(string $a_output, string $a_mode, bool $a_abstract_only=false)
getModel()
Get model as needed for the front-end editor.
static afterPageUpdate(ilPageObject $a_page, DOMDocument $a_domdoc, string $a_xml, bool $a_creation)
After page has been updated (or created)
create(ilPageObject $a_pg_obj, string $a_hier_id, string $a_pc_id="")
getActiveFrom()
Get activation from.
Content object of ilPageObject (see ILIAS DTD).
createInitialChildNode(string $hier_id, string $pc_id, string $child, array $child_attributes=[])
setType(string $a_type)
Set Type.
Class ilPageObject Handles PageObjects of ILIAS Learning Modules (see ILIAS DTD)
getDomDoc()
Get dom doc (DOMDocument)
const IL_INST_ID
Definition: constants.php:40
Interface ilAccessHandler This interface combines all available interfaces which can be called via gl...
checkAccess(string $a_permission, string $a_cmd, int $a_ref_id, string $a_type="", ?int $a_obj_id=null, ?int $a_tree_id=null)
check access for an object (provide $a_type and $a_obj_id if available for better performance)
$path
Definition: ltiservices.php:30
global $lng
Definition: privfeed.php:31
global $DIC
Definition: shib_login.php:26
$param
Definition: xapitoken.php:44