ILIAS  trunk Revision v11.0_alpha-1723-g8e69f309bab
All Data Structures Namespaces Files Functions Variables Enumerations Enumerator Modules Pages
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(
46  ilObjExercise $exercise,
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
56  $assignments = ilExAssignment::getAssignmentDataOfExercise($exercise->getId());
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 }
__construct(ilObjExercise $exercise, string $a_xml_data, int $obj_id=-1)
Exercise assignment.
const IL_INST_ID
Definition: constants.php:40
startParsing()
stores xml data in array
handlerEndTag($a_xml_parser, string $a_name)
handler for end of element
static stripSlashes(string $a_str, bool $a_strip_html=true, string $a_allow="")
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
while($session_entry=$r->fetchRow(ilDBConstants::FETCHMODE_ASSOC)) return null
handlerBeginTag($a_xml_parser, string $a_name, array $a_attribs)
handler for begin of element
static getAssignmentDataOfExercise(int $a_exc_id)
Class ilObjExercise.
handlerCharacterData($a_xml_parser, string $a_data)
handler for character data
updateMember(int $user_id, string $action)
update member object according to given action
static __extractId(string $ilias_id, int $inst_id)
extract ref id from role title, e.g.
__construct(Container $dic, ilPlugin $plugin)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
comment()
description: > Example for rendring a comment glyph.
Definition: comment.php:41
updateMarking(int $usr_id)
update marking of member
start()
starts parsing an changes object by side effect.
setXMLContent(string $a_xml_content)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...