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 
4 include_once("./Services/Table/classes/class.ilTable2GUI.php");
5 include_once("./Modules/Exercise/classes/class.ilExAssignment.php");
6 include_once("./Modules/Exercise/classes/class.ilExAssignmentMemberStatus.php");
7 include_once("./Modules/Exercise/classes/class.ilExAssignmentTeam.php");
8 include_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 ?>
addCommandButton($a_cmd, $a_text, $a_onclick='', $a_id="", $a_class=null)
Add Command button.
static prepareFormOutput($a_str, $a_strip=false)
prepares string output for html forms public
setDefaultOrderField($a_defaultorderfield)
Set Default order field.
Exercise assignment.
const IL_CAL_DATETIME
This class represents a property form user interface.
static getAssignmentTeamMap($a_ass_id)
Get team structure for assignment.
static getInstancesFromMap($a_assignment_id)
static get($a_glyph, $a_text="")
Get glyph html.
Exercise assignment team.
static shortenText($a_str, $a_len, $a_dots=false, $a_next_blank=false, $a_keep_extension=false)
shorten a string to given length.
$url
Definition: shib_logout.php:72
getParentObject()
Get parent object.
static lookupAnyExerciseSent($a_ass_id)
Check whether exercise has been sent to any student per mail.
setId($a_val)
Set id.
global $ilCtrl
Definition: ilias.php:18
setDefaultOrderDirection($a_defaultorderdirection)
Set Default order direction.
setTitle($a_title, $a_icon=0, $a_icon_alt=0)
Set title and title icon.
setInfo($a_info)
Set Information Text.
$info
Definition: example_052.php:80
setTopCommands($a_val)
Set top commands (display command buttons on top of table, too)
Class ilTable2GUI.
static getImagePath($img, $module_path="", $mode="output", $offline=false)
get image path (for images located in a template directory)
special template class to simplify handling of ITX/PEAR
addMultiCommand($a_cmd, $a_text)
Add Command button.
This is a utility class for the yui overlays.
static formatDate(ilDateTime $date)
Format a date public.
Date and time handling
getSelectedColumns()
Get selected columns.
getInstanceByObjId($a_obj_id, $stop_on_error=true)
get an instance of an Ilias object by object id
setRowTemplate($a_template, $a_template_dir="")
Set row template.
setFormAction($a_form_action, $a_multipart=false)
Set Form action parameter.
global $lng
Definition: privfeed.php:40
This class represents a text area property in a property form.
Exercise submission.
setEnableHeader($a_enableheader)
Set Enable Header.
setSelectAllCheckbox($a_select_all_checkbox)
Set the name of the checkbox that should be toggled with a select all button.
setEnableTitle($a_enabletitle)
Set Enable Title.
if(! $in) $columns
Definition: Utf8Test.php:46
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.
__construct($a_parent_obj, $a_parent_cmd, $a_exc, $a_ass)
Constructor.
static formCheckbox($checked, $varname, $value, $disabled=false)
??? public