ILIAS  trunk Revision v11.0_alpha-3011-gc6b235a2e85
class.ilExerciseXMLParser.php
Go to the documentation of this file.
1<?php
2
24{
25 public static int $CONTENT_NOT_COMPRESSED = 0;
26 public static int $CONTENT_GZ_COMPRESSED = 1;
27 public static int $CONTENT_ZLIB_COMPRESSED = 2;
28 protected string $cdata;
29 protected string $mark;
30 protected string $notice;
31 protected string $comment;
32 protected string $file_content;
33 protected string $file_name;
34 protected string $status;
35 protected string $file_action;
36 protected int $usr_id;
37 protected string $usr_action;
38
40 public int $obj_id;
41 public bool $result;
42 public int $mode;
44
45 public function __construct(
47 string $a_xml_data,
48 int $obj_id = -1
49 ) {
50 // @todo: needs to be revised for multiple assignments per exercise
51
53
54 $this->exercise = $exercise;
55 // get all assignments and choose first one if exists, otherwise create
57 if (count($assignments) > 0) {
58 $this->assignment = new ilExAssignment($assignments [0]["id"]);
59 } else {
60 $this->assignment = new ilExAssignment();
61 $this->assignment->setExerciseId($exercise->getId());
62 $this->assignment->save();
63 }
64
65 $this->setXMLContent($a_xml_data);
66 $this->obj_id = $obj_id;
67 $this->result = false;
68 }
69
70
71 public function setHandlers($a_xml_parser): void
72 {
73 xml_set_element_handler($a_xml_parser, $this->handlerBeginTag(...), $this->handlerEndTag(...));
74 xml_set_character_data_handler($a_xml_parser, $this->handlerCharacterData(...));
75 }
76
85 public function handlerBeginTag($a_xml_parser, string $a_name, array $a_attribs): void
86 {
87 $a_attribs = $this->trimAndStripAttribs($a_attribs);
88 switch ($a_name) {
89 case 'Exercise':
90 if (isset($a_attribs["obj_id"])) {
91 $read_obj_id = ilUtil::__extractId($a_attribs["obj_id"], IL_INST_ID);
92 if ($this->obj_id != -1 && (int) $read_obj_id != -1 && $this->obj_id !== (int) $read_obj_id) {
93 throw new ilExerciseException("Object IDs (xml $read_obj_id and argument " . $this->obj_id . ") do not match!", ilExerciseException::$ID_MISMATCH);
94 }
95 }
96 break;
97 case 'Member':
98 $this->usr_action = $a_attribs["action"];
99 $this->usr_id = (int) ilUtil::__extractId($a_attribs["usr_id"], IL_INST_ID);
100 break;
101
102 case 'File':
103 $this->file_action = $a_attribs["action"];
104 break;
105 case 'Content':
107 if ($a_attribs["mode"] == "GZIP") {
108 if (!function_exists("gzdecode")) {
109 throw new ilExerciseException("Deflating with gzip is not supported", ilExerciseException::$ID_DEFLATE_METHOD_MISMATCH);
110 }
111
113 } elseif ($a_attribs["mode"] == "ZLIB") {
114 if (!function_exists("gzuncompress")) {
115 throw new ilExerciseException("Deflating with zlib (compress/uncompress) is not supported", ilExerciseException::$ID_DEFLATE_METHOD_MISMATCH);
116 }
117
119 }
120 break;
121 case 'Marking':
122 $this->status = $a_attribs["status"];
123 if ($this->status == ilExerciseXMLWriter::$STATUS_NOT_GRADED) {
124 $this->status = "notgraded";
125 } elseif ($this->status == ilExerciseXMLWriter::$STATUS_PASSED) {
126 $this->status = "passed";
127 } else {
128 $this->status = "failed";
129 }
130 break;
131 }
132 }
133
134
135
142 public function handlerEndTag($a_xml_parser, string $a_name): void
143 {
144 switch ($a_name) {
145 case 'Exercise':
146 $this->result = true;
147 break;
148 case 'Title':
149 $this->exercise->setTitle($this->trimAndStrip((string) $this->cdata));
150 $this->assignment->setTitle($this->trimAndStrip((string) $this->cdata));
151 break;
152 case 'Description':
153 $this->exercise->setDescription($this->trimAndStrip((string) $this->cdata));
154 break;
155 case 'Instruction':
156 $this->assignment->setInstruction($this->trimAndStrip((string) $this->cdata));
157 break;
158 case 'DueDate':
159 $this->assignment->setDeadLine($this->trimAndStrip((string) $this->cdata));
160 break;
161 case 'Member':
162 $this->updateMember($this->usr_id, $this->usr_action);
163 // update marking after update member.
164 $this->updateMarking($this->usr_id);
165 break;
166 case 'Filename':
167 $this->file_name = $this->trimAndStrip((string) $this->cdata);
168 break;
169 case 'Content':
170 $this->file_content = $this->trimAndStrip((string) $this->cdata);
171 break;
172 case 'Comment':
173 $this->comment = $this->trimAndStrip((string) $this->cdata);
174 break;
175 case 'Notice':
176 $this->notice = $this->trimAndStrip((string) $this->cdata);
177 break;
178 case 'Mark':
179 $this->mark = $this->trimAndStrip((string) $this->cdata);
180 break;
181 case 'Marking':
182 // see Member end tag
183 break;
184 }
185 $this->cdata = '';
186 }
187
194 public function handlerCharacterData($a_xml_parser, string $a_data): void
195 {
196 if ($a_data != "\n") {
197 $this->cdata .= $a_data;
198 }
199 }
200
201
205 private function updateMember(int $user_id, string $action): void
206 {
207 if (!is_int($user_id) || $user_id <= 0) {
208 return;
209 }
210 $memberObject = new ilExerciseMembers($this->exercise);
211
212 if ($action == "Attach" && !$memberObject->isAssigned($user_id)) {
213 $memberObject->assignMember($user_id);
214 }
215
216 if ($action == "Detach" && $memberObject->isAssigned($user_id)) {
217 $memberObject->deassignMember($user_id);
218 }
219 }
220
228 public function start(): bool
229 {
230 $this->startParsing();
231 return $this->result > 0;
232 }
233
239 private function updateMarking(int $usr_id): void
240 {
241 $member_status = $this->assignment->getMemberStatus($usr_id);
242 if (isset($this->mark)) {
243 $member_status->setMark(ilUtil::stripSlashes($this->mark));
244 }
245 if (isset($this->comment)) {
246 $member_status->setComment(ilUtil::stripSlashes($this->comment));
247 }
248 if (isset($this->status)) {
249 $member_status->setStatus(ilUtil::stripSlashes($this->status));
250 }
251 if (isset($this->notice)) {
252 $member_status->setNotice(ilUtil::stripSlashes($this->notice));
253 }
254 $member_status->update();
255
256 // reset variables
257 $this->mark = null;
258 $this->status = null;
259 $this->notice = null;
260 $this->comment = null;
261 }
262
263 public function getAssignment(): ilExAssignment
264 {
265 return $this->assignment;
266 }
267
268 protected function trimAndStripAttribs(array $attribs): array
269 {
270 $ret = [];
271 foreach ($attribs as $k => $v) {
272 $ret[$k] = $this->trimAndStrip((string) $v);
273 }
274 return $ret;
275 }
276
277 protected function trimAndStrip(string $input): string
278 {
279 return ilUtil::stripSlashes(trim($input));
280 }
281}
Exercise assignment.
static getAssignmentDataOfExercise(int $a_exc_id)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Class ilExerciseMembers.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
handlerBeginTag($a_xml_parser, string $a_name, array $a_attribs)
handler for begin of element
handlerEndTag($a_xml_parser, string $a_name)
handler for end of element
__construct(ilObjExercise $exercise, string $a_xml_data, int $obj_id=-1)
start()
starts parsing an changes object by side effect.
handlerCharacterData($a_xml_parser, string $a_data)
handler for character data
updateMarking(int $usr_id)
update marking of member
updateMember(int $user_id, string $action)
update member object according to given action
Class ilObjExercise.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
setXMLContent(string $a_xml_content)
startParsing()
stores xml data in array
static stripSlashes(string $a_str, bool $a_strip_html=true, string $a_allow="")
static __extractId(string $ilias_id, int $inst_id)
extract ref id from role title, e.g.
const IL_INST_ID
Definition: constants.php:40
__construct(Container $dic, ilPlugin $plugin)
@inheritDoc