ILIAS  release_5-1 Revision 5.0.0-5477-g43f3e3fab5f
class.ilExerciseMemberTableGUI.php
Go to the documentation of this file.
1<?php
2/* Copyright (c) 1998-2010 ILIAS open source, Extended GPL, see docs/LICENSE */
3
4include_once("./Services/Table/classes/class.ilTable2GUI.php");
5include_once("./Modules/Exercise/classes/class.ilExAssignment.php");
6include_once("./Modules/Exercise/classes/class.ilExAssignmentMemberStatus.php");
7include_once("./Modules/Exercise/classes/class.ilExAssignmentTeam.php");
8include_once("./Modules/Exercise/classes/class.ilExSubmission.php");
9
19{
20 protected $exc;
21 protected $ass;
22 protected $exc_id;
23 protected $ass_id;
24 protected $sent_col;
25 protected $selected = array();
26 protected $teams = array();
27
31 function __construct($a_parent_obj, $a_parent_cmd, $a_exc, $a_ass)
32 {
33 global $ilCtrl, $lng;
34
35 $this->exc = $a_exc;
36 $this->exc_id = $this->exc->getId();
37 $this->ass = $a_ass;
38 $this->ass_id = $this->ass->getId();
39 $this->setId("exc_mem_".$this->ass_id);
40
41
42 include_once("./Modules/Exercise/classes/class.ilFSStorageExercise.php");
43 $this->storage = new ilFSStorageExercise($this->exc_id, $this->ass_id);
44 include_once("./Modules/Exercise/classes/class.ilExAssignment.php");
45
46 parent::__construct($a_parent_obj, $a_parent_cmd);
47
48 $this->setTitle($lng->txt("exc_assignment").": ".$this->ass->getTitle());
49 $this->setTopCommands(true);
50 //$this->setLimit(9999);
51
52 $data = $this->ass->getMemberListData();
53
54 // team upload? (1 row == 1 team)
55 if($this->ass->hasTeam())
56 {
57 $this->teams = ilExAssignmentTeam::getInstancesFromMap($this->ass_id);
58 $team_map = ilExAssignmentTeam::getAssignmentTeamMap($this->ass_id);
59
60 $tmp = array();
61
62 foreach($data as $item)
63 {
64 $team_id = $team_map[$item["usr_id"]];
65
66 if(!$team_id)
67 {
68 // #11058
69 // $team_id = $ass_obj->getTeamId($item["usr_id"], true);
70
71 // #11957
72 $team_id = "nty".$item["usr_id"];
73 }
74
75 if(!isset($tmp[$team_id]))
76 {
77 $tmp[$team_id] = $item;
78 }
79
80 $tmp[$team_id]["team"][$item["usr_id"]] = $item["name"];
81 $tmp[$team_id]["team_id"] = $team_id;
82 }
83
84 $data = $tmp;
85 unset($tmp);
86 }
87 else
88 {
89 // peer review / rating
90 $ass_obj = new ilExAssignment($this->ass_id);
91 if($ass_obj->getPeerReview())
92 {
93 include_once './Services/Rating/classes/class.ilRatingGUI.php';
94 }
95 }
96
97 $this->setData($data);
98
99 $this->addColumn("", "", "1", true);
100
101 if(!$this->ass->hasTeam())
102 {
103 $this->selected = $this->getSelectedColumns();
104 if(in_array("image", $this->selected))
105 {
106 $this->addColumn($this->lng->txt("image"), "", "1");
107 }
108 $this->addColumn($this->lng->txt("name"), "name");
109 if(in_array("login", $this->selected))
110 {
111 $this->addColumn($this->lng->txt("login"), "login");
112 }
113 }
114 else
115 {
116 $this->addColumn($this->lng->txt("exc_team"));
117 }
118
119 $this->sent_col = ilExAssignmentMemberStatus::lookupAnyExerciseSent($this->ass_id);
120 if ($this->sent_col)
121 {
122 $this->addColumn($this->lng->txt("exc_exercise_sent"), "sent_time");
123 }
124 $this->addColumn($this->lng->txt("exc_submission"), "submission");
125 $this->addColumn($this->lng->txt("exc_grading"), "solved_time");
126 $this->addColumn($this->lng->txt("feedback"), "feedback_time");
127
128 $this->setDefaultOrderField("name");
129 $this->setDefaultOrderDirection("asc");
130
131 $this->setEnableHeader(true);
132 $this->setFormAction($ilCtrl->getFormAction($a_parent_obj));
133 $this->setRowTemplate("tpl.exc_members_row.html", "Modules/Exercise");
134 //$this->disable("footer");
135 $this->setEnableTitle(true);
136 $this->setSelectAllCheckbox("member");
137
138 $this->addMultiCommand("saveStatusSelected", $lng->txt("exc_save_selected"));
139 $this->addMultiCommand("redirectFeedbackMail", $lng->txt("exc_send_mail"));
140 $this->addMultiCommand("sendMembers", $lng->txt("exc_send_assignment"));
141
142 if($this->ass->hasTeam())
143 {
144 $this->addMultiCommand("createTeams", $lng->txt("exc_team_multi_create"));
145 $this->addMultiCommand("dissolveTeams", $lng->txt("exc_team_multi_dissolve"));
146 }
147
148 $this->addMultiCommand("confirmDeassignMembers", $lng->txt("exc_deassign_members"));
149
150 $this->addCommandButton("saveStatusAll", $lng->txt("exc_save_all"));
151
152 include_once "Services/Form/classes/class.ilPropertyFormGUI.php";
153 include_once "Services/UIComponent/Overlay/classes/class.ilOverlayGUI.php";
154 $this->overlay_tpl = new ilTemplate("tpl.exc_learner_comment_overlay.html", true, true, "Modules/Exercise");
155 }
156
158 {
159 $columns = array();
160
161 $columns["image"] = array(
162 "txt" => $this->lng->txt("image"),
163 "default" => true
164 );
165
166 $columns["login"] = array(
167 "txt" => $this->lng->txt("login"),
168 "default" => true
169 );
170
171 return $columns;
172 }
173
177 protected function fillRow($member)
178 {
179 global $lng, $ilCtrl, $ilAccess;
180
181 $ilCtrl->setParameter($this->parent_obj, "ass_id", $this->ass_id);
182 $ilCtrl->setParameter($this->parent_obj, "member_id", $member["usr_id"]);
183
184 include_once "./Services/Object/classes/class.ilObjectFactory.php";
185 $member_id = $member["usr_id"];
186
187 if(!($mem_obj = ilObjectFactory::getInstanceByObjId($member_id,false)))
188 {
189 return;
190 }
191
192 $has_no_team_yet = (substr($member["team_id"], 0, 3) == "nty");
193 $member_status = $this->ass->getMemberStatus($member_id);
194
195 // checkbox
196 $this->tpl->setVariable("VAL_CHKBOX",
197 ilUtil::formCheckbox(0,"member[$member_id]",1));
198 $this->tpl->setVariable("VAL_ID", $member_id);
199
200 if(!$has_no_team_yet)
201 {
202 // mail sent
203 if ($this->sent_col)
204 {
205 if ($member_status->getSent())
206 {
207 $this->tpl->setCurrentBlock("mail_sent");
208 if (($st = $member_status->getSentTime()) > 0)
209 {
210 $this->tpl->setVariable("TXT_MAIL_SENT",
211 sprintf($lng->txt("exc_sent_at"),
213 }
214 else
215 {
216 $this->tpl->setVariable("TXT_MAIL_SENT",
217 $lng->txt("sent"));
218 }
219 $this->tpl->parseCurrentBlock();
220 }
221 else
222 {
223 $this->tpl->setCurrentBlock("mail_sent");
224 $this->tpl->setVariable("TXT_MAIL_SENT",
225 "&nbsp;");
226 $this->tpl->parseCurrentBlock();
227 }
228 }
229 }
230
231 if(!isset($member["team"]))
232 {
233 $submission = new ilExSubmission($this->ass, $member_id);
234 }
235 else
236 {
237 if(!$has_no_team_yet)
238 {
239 $member_team = $this->teams[$member["team_id"]];
240 }
241 else
242 {
243 // ilExSubmission should not try to auto-load
244 $member_team = new ilExAssignmentTeam();
245 }
246 $submission = new ilExSubmission($this->ass, $member_id, $member_team);
247 }
248 $file_info = $submission->getDownloadedFilesInfoForTableGUIS($this->parent_obj, $this->parent_cmd);
249
250 // name and login
251 if(!isset($member["team"]))
252 {
253 $this->tpl->setVariable("TXT_NAME",
254 $member["name"]);
255
256 if(in_array("login", $this->selected))
257 {
258 $this->tpl->setVariable("TXT_LOGIN",
259 "[".$member["login"]."]");
260 }
261
262 if(in_array("image", $this->selected))
263 {
264 // image
265 $this->tpl->setVariable("USR_IMAGE",
266 $mem_obj->getPersonalPicturePath("xxsmall"));
267 $this->tpl->setVariable("USR_ALT", $lng->txt("personal_picture"));
268 }
269
270 // #18327
271 if(!$ilAccess->checkAccessOfUser($member_id, "read","", $this->exc->getRefId()) &&
272 is_array($info = $ilAccess->getInfo()))
273 {
274 $this->tpl->setCurrentBlock('access_warning');
275 $this->tpl->setVariable('PARENT_ACCESS', $info[0]["text"]);
276 $this->tpl->parseCurrentBlock();
277 }
278 }
279 // team upload
280 else
281 {
282 asort($member["team"]);
283 foreach($member["team"] as $team_member_id => $team_member_name) // #10749
284 {
285 if(sizeof($member["team"]) > 1)
286 {
287 $ilCtrl->setParameterByClass("ilExSubmissionTeamGUI", "id", $team_member_id);
288 $url = $ilCtrl->getLinkTargetByClass("ilExSubmissionTeamGUI", "confirmRemoveTeamMember");
289 $ilCtrl->setParameterByClass("ilExSubmissionTeamGUI", "id", "");
290
291 include_once "Services/UIComponent/Glyph/classes/class.ilGlyphGUI.php";
292
293 $this->tpl->setCurrentBlock("team_member_removal_bl");
294 $this->tpl->setVariable("URL_TEAM_MEMBER_REMOVAL", $url);
295 $this->tpl->setVariable("TXT_TEAM_MEMBER_REMOVAL",
296 ilGlyphGUI::get(ilGlyphGUI::CLOSE, $lng->txt("remove")));
297 $this->tpl->parseCurrentBlock();
298 }
299
300 // #18327
301 if(!$ilAccess->checkAccessOfUser($team_member_id, "read","", $this->exc->getRefId()) &&
302 is_array($info = $ilAccess->getInfo()))
303 {
304 $this->tpl->setCurrentBlock('team_access_warning');
305 $this->tpl->setVariable('TEAM_PARENT_ACCESS', $info[0]["text"]);
306 $this->tpl->parseCurrentBlock();
307 }
308
309 $this->tpl->setCurrentBlock("team_member");
310 $this->tpl->setVariable("TXT_MEMBER_NAME", $team_member_name);
311 $this->tpl->parseCurrentBlock();
312 }
313
314 if(!$has_no_team_yet)
315 {
316 $this->tpl->setCurrentBlock("team_log");
317 $this->tpl->setVariable("HREF_LOG",
318 $ilCtrl->getLinkTargetByClass("ilExSubmissionTeamGUI", "showTeamLog"));
319 $this->tpl->setVariable("TXT_LOG", $lng->txt("exc_team_log"));
320 $this->tpl->parseCurrentBlock();
321 }
322 else
323 {
324 // #11957
325 $this->tpl->setCurrentBlock("team_info");
326 $this->tpl->setVariable("TXT_TEAM_INFO", $lng->txt("exc_no_team_yet"));
327
328 /*
329 $this->tpl->setVariable("TXT_CREATE_TEAM", $lng->txt("exc_create_team"));
330 $this->tpl->setVariable("URL_CREATE_TEAM",
331 $ilCtrl->getLinkTargetByClass("ilExSubmissionTeamGUI", "createSingleMemberTeam"));
332 */
333
334 if($file_info["files"]["count"])
335 {
336 $this->tpl->setVariable("TEAM_FILES_INFO", "<br />".
337 $file_info["files"]["txt"].": ".
338 $file_info["files"]["count"]);
339 }
340 $this->tpl->parseCurrentBlock();
341 }
342 }
343
344 if(!$has_no_team_yet)
345 {
346 $this->tpl->setVariable("VAL_LAST_SUBMISSION", $file_info["last_submission"]["value"]);
347 $this->tpl->setVariable("TXT_LAST_SUBMISSION", $file_info["last_submission"]["txt"]);
348
349 $this->tpl->setVariable("TXT_SUBMITTED_FILES", $file_info["files"]["txt"]);
350 $this->tpl->setVariable("VAL_SUBMITTED_FILES", $file_info["files"]["count"]);
351
352 if($file_info["files"]["download_url"])
353 {
354 $this->tpl->setCurrentBlock("download_link");
355 $this->tpl->setVariable("LINK_DOWNLOAD", $file_info["files"]["download_url"]);
356 $this->tpl->setVariable("TXT_DOWNLOAD", $file_info["files"]["download_txt"]);
357 $this->tpl->parseCurrentBlock();
358 }
359
360 if($file_info["files"]["download_new_url"])
361 {
362 $this->tpl->setCurrentBlock("download_link");
363 $this->tpl->setVariable("LINK_NEW_DOWNLOAD", $file_info["files"]["download_new_url"]);
364 $this->tpl->setVariable("TXT_NEW_DOWNLOAD", $file_info["files"]["download_new_txt"]);
365 $this->tpl->parseCurrentBlock();
366 }
367
368 // note
369 $this->tpl->setVariable("TXT_NOTE", $lng->txt("exc_note_for_tutor"));
370 $this->tpl->setVariable("NAME_NOTE",
371 "notice[$member_id]");
372 $this->tpl->setVariable("VAL_NOTE",
373 ilUtil::prepareFormOutput($member_status->getNotice()));
374
375
376 // comment for learner
377
378 $lcomment_value = $member_status->getComment();
379
380 $overlay_id = "excasscomm_".$this->ass_id."_".$member_id;
381 $overlay_trigger_id = $overlay_id."_tr";
382 $overlay = new ilOverlayGUI($overlay_id);
383 $overlay->setAnchor($overlay_trigger_id);
384 $overlay->setTrigger($overlay_trigger_id, "click", $overlay_trigger_id);
385 $overlay->add();
386
387 $this->tpl->setVariable("LCOMMENT_ID", $overlay_id."_snip");
388 $this->tpl->setVariable("LCOMMENT_SNIPPET", ilUtil::shortenText($lcomment_value, 25, true));
389 $this->tpl->setVariable("COMMENT_OVERLAY_TRIGGER_ID", $overlay_trigger_id);
390 $this->tpl->setVariable("COMMENT_OVERLAY_TRIGGER_TEXT", $lng->txt("exc_comment_for_learner_edit"));
391
392 $lcomment_form = new ilPropertyFormGUI();
393 $lcomment_form->setId($overlay_id);
394 $lcomment_form->setPreventDoubleSubmission(false);
395
396 $lcomment = new ilTextAreaInputGUI($lng->txt("exc_comment_for_learner"), "lcomment_".$this->ass_id."_".$member_id);
397 $lcomment->setInfo($lng->txt("exc_comment_for_learner_info"));
398 $lcomment->setValue($lcomment_value);
399 $lcomment->setCols(45);
400 $lcomment->setRows(10);
401 $lcomment_form->addItem($lcomment);
402
403 $lcomment_form->addCommandButton("save", $lng->txt("save"));
404 // $lcomment_form->addCommandButton("cancel", $lng->txt("cancel"));
405
406 $this->overlay_tpl->setCurrentBlock("overlay_bl");
407 $this->overlay_tpl->setVariable("COMMENT_OVERLAY_ID", $overlay_id);
408 $this->overlay_tpl->setVariable("COMMENT_OVERLAY_FORM", $lcomment_form->getHTML());
409 $this->overlay_tpl->parseCurrentBlock();
410
411 $status = $member_status->getStatus();
412 $this->tpl->setVariable("SEL_".strtoupper($status), ' selected="selected" ');
413 $this->tpl->setVariable("TXT_NOTGRADED", $lng->txt("exc_notgraded"));
414 $this->tpl->setVariable("TXT_PASSED", $lng->txt("exc_passed"));
415 $this->tpl->setVariable("TXT_FAILED", $lng->txt("exc_failed"));
416 if (($sd = $member_status->getStatusTime()) > 0)
417 {
418 $this->tpl->setCurrentBlock("status_date");
419 $this->tpl->setVariable("TXT_LAST_CHANGE", $lng->txt("last_change"));
420 $this->tpl->setVariable('VAL_STATUS_DATE',
422 $this->tpl->parseCurrentBlock();
423 }
424 $pic = $member_status->getStatusIcon();
425 $this->tpl->setVariable("IMG_STATUS", ilUtil::getImagePath($pic));
426 $this->tpl->setVariable("ALT_STATUS", $lng->txt("exc_".$status));
427
428 // mark
429 $this->tpl->setVariable("TXT_MARK", $lng->txt("exc_mark"));
430 $this->tpl->setVariable("NAME_MARK",
431 "mark[$member_id]");
432 $mark = $member_status->getMark();
433 $this->tpl->setVariable("VAL_MARK", ilUtil::prepareFormOutput($mark));
434
435 // feedback
436 if (($ft = $member_status->getFeedbackTime()) > 0)
437 {
438 $this->tpl->setCurrentBlock("feedback_date");
439 $this->tpl->setVariable("TXT_FEEDBACK_MAIL_SENT",
440 sprintf($lng->txt("exc_sent_at"),
442 $this->tpl->parseCurrentBlock();
443 }
444
445 // feedback mail
446 $this->tpl->setVariable("LINK_FEEDBACK",
447 $ilCtrl->getLinkTarget($this->parent_obj, "redirectFeedbackMail"));
448 $this->tpl->setVariable("TXT_FEEDBACK",
449 $lng->txt("exc_send_mail"));
450
451 // file feedback
452 $cnt_files = $this->storage->countFeedbackFiles($submission->getFeedbackId());
453 $this->tpl->setVariable("LINK_FILE_FEEDBACK",
454 $ilCtrl->getLinkTargetByClass("ilfilesystemgui", "listFiles"));
455 if ($cnt_files == 0)
456 {
457 $this->tpl->setVariable("TXT_FILE_FEEDBACK",
458 $lng->txt("exc_add_feedback_file"));
459 }
460 else
461 {
462 $this->tpl->setVariable("TXT_FILE_FEEDBACK",
463 $lng->txt("exc_fb_files")." (".$cnt_files.")");
464 }
465
466 // peer review / rating
467 if($peer_review = $submission->getPeerReview())
468 {
469 // :TODO: validate?
470 $given = $peer_review->countGivenFeedback(true, $member_id);
471 $received = sizeof($peer_review->getPeerReviewsByPeerId($member_id, true));
472
473 $this->tpl->setCurrentBlock("peer_review_bl");
474
475 $this->tpl->setVariable("LINK_PEER_REVIEW_GIVEN",
476 $ilCtrl->getLinkTargetByClass("ilexpeerreviewgui", "showGivenPeerReview"));
477 $this->tpl->setVariable("TXT_PEER_REVIEW_GIVEN",
478 $lng->txt("exc_peer_review_given")." (".$given.")");
479
480 $this->tpl->setVariable("TXT_PEER_REVIEW_RECEIVED",
481 $lng->txt("exc_peer_review_show")." (".$received.")");
482 $this->tpl->setVariable("LINK_PEER_REVIEW_RECEIVED",
483 $ilCtrl->getLinkTargetByClass("ilexpeerreviewgui", "showReceivedPeerReview"));
484
485 /* :TODO: restrict to valid?
486 $rating = new ilRatingGUI();
487 $rating->setObject($this->ass_id, "ass", $member_id, "peer");
488 $rating->setUserId(0);
489 $this->tpl->setVariable("VAL_RATING", $rating->getHTML(true, false));
490 */
491
492 $this->tpl->parseCurrentBlock();
493 }
494
495 $this->tpl->parseCurrentBlock();
496 }
497 else
498 {
499 $this->tpl->touchBlock("member_has_no_team_bl");
500 }
501
502 $ilCtrl->setParameter($this->parent_obj, "ass_id", $this->ass_id); // #17140
503 $ilCtrl->setParameter($this->parent_obj, "member_id", "");
504 }
505
506 public function render()
507 {
508 global $ilCtrl;
509
510 $url = $ilCtrl->getLinkTarget($this->getParentObject(), "saveCommentForLearners", "", true, false);
511 $this->overlay_tpl->setVariable("AJAX_URL", $url);
512
513 return parent::render().
514 $this->overlay_tpl->get();
515 }
516}
517?>
if(! $in) $columns
Definition: Utf8Test.php:46
const IL_CAL_DATETIME
static formatDate(ilDateTime $date)
Format a date @access public.
@classDescription Date and time handling
static lookupAnyExerciseSent($a_ass_id)
Check whether exercise has been sent to any student per mail.
Exercise assignment team.
static getAssignmentTeamMap($a_ass_id)
Get team structure for assignment.
static getInstancesFromMap($a_assignment_id)
Exercise assignment.
Exercise submission.
render()
render table @access public
__construct($a_parent_obj, $a_parent_cmd, $a_exc, $a_ass)
Constructor.
getSelectableColumns()
Get selectable columns.
static get($a_glyph, $a_text="")
Get glyph html.
getInstanceByObjId($a_obj_id, $stop_on_error=true)
get an instance of an Ilias object by object id
This is a utility class for the yui overlays.
This class represents a property form user interface.
Class ilTable2GUI.
getSelectedColumns()
Get selected columns.
setTopCommands($a_val)
Set top commands (display command buttons on top of table, too)
setEnableHeader($a_enableheader)
Set Enable Header.
addColumn($a_text, $a_sort_field="", $a_width="", $a_is_checkbox_action_column=false, $a_class="", $a_tooltip="", $a_tooltip_with_html=false)
Add a column to the header.
getParentObject()
Get parent object.
setTitle($a_title, $a_icon=0, $a_icon_alt=0)
Set title and title icon.
setData($a_data)
set table data @access public
setEnableTitle($a_enabletitle)
Set Enable Title.
setRowTemplate($a_template, $a_template_dir="")
Set row template.
addMultiCommand($a_cmd, $a_text)
Add Command button.
setDefaultOrderField($a_defaultorderfield)
Set Default order field.
setSelectAllCheckbox($a_select_all_checkbox)
Set the name of the checkbox that should be toggled with a select all button.
setId($a_val)
Set id.
setFormAction($a_form_action, $a_multipart=false)
Set Form action parameter.
setDefaultOrderDirection($a_defaultorderdirection)
Set Default order direction.
addCommandButton($a_cmd, $a_text, $a_onclick='', $a_id="", $a_class=null)
Add Command button.
special template class to simplify handling of ITX/PEAR
This class represents a text area property in a property form.
static formCheckbox($checked, $varname, $value, $disabled=false)
??? @access public
static shortenText($a_str, $a_len, $a_dots=false, $a_next_blank=false, $a_keep_extension=false)
shorten a string to given length.
static getImagePath($img, $module_path="", $mode="output", $offline=false)
get image path (for images located in a template directory)
static prepareFormOutput($a_str, $a_strip=false)
prepares string output for html forms @access public
$info
Definition: example_052.php:80
global $ilCtrl
Definition: ilias.php:18
global $lng
Definition: privfeed.php:40
$url
Definition: shib_logout.php:72