ILIAS  release_7 Revision v7.30-3-g800a261c036
class.ilTestQuestionsTableGUI.php
Go to the documentation of this file.
1 <?php
2 /* Copyright (c) 1998-2013 ILIAS open source, Extended GPL, see docs/LICENSE */
3 
4 include_once('./Services/Table/classes/class.ilTable2GUI.php');
5 require_once 'Services/UIComponent/Glyph/classes/class.ilGlyphGUI.php';
6 
8 
19 {
21  private const CLASS_PATH_FOR_EDIT_LINKS = [ilRepositoryGUI::class, ilObjQuestionPoolGUI::class];
22 
27 
31  protected $questionManagingEnabled = false;
32 
36  protected $positionInsertCommandsEnabled = false;
37 
41  protected $questionPositioningEnabled = false;
42 
47 
51  protected $totalPoints = 0;
52 
56  protected $totalWorkingTime = '';
57  protected $renderer;
58  protected $factory;
59  private $access;
60 
64  private $position = 0;
65 
73  public function __construct($a_parent_obj, $a_parent_cmd, $parentRefId)
74  {
75  global $DIC;
76 
77  $this->renderer = $DIC->ui()->renderer();
78  $this->factory = $DIC->ui()->factory();
79  $this->access = $DIC['ilAccess'];
80 
81  $this->setId('tst_qst_lst_' . $parentRefId);
82 
83  parent::__construct($a_parent_obj, $a_parent_cmd);
84 
85  $this->setFormName('questionbrowser');
86  $this->setStyle('table', 'fullwidth');
87 
88  $this->setExternalSegmentation(true);
89 
90  $this->setRowTemplate("tpl.il_as_tst_questions_row.html", "Modules/Test");
91 
92  $this->setFormAction($this->ctrl->getFormAction($a_parent_obj, $a_parent_cmd));
93 
94  $this->disable('sort');
95  $this->enable('header');
96 
97  $this->setShowRowsSelector(false);
98  }
99 
103  public function getSelectableColumns()
104  {
105  $cols = array(
106  'qid' => array('txt' => $this->lng->txt('question_id'), 'default' => true),
107  'description' => array('txt' => $this->lng->txt('description'), 'default' => false),
108  'author' => array('txt' => $this->lng->txt('author'), 'default' => false),
109  'lifecycle' => array('txt' => $this->lng->txt('qst_lifecycle'), 'default' => true),
110  'working_time' => array('txt' => $this->lng->txt('working_time'), 'default' => false)
111  );
112 
113  return $cols;
114  }
115 
119  public function init()
120  {
121  $this->initColumns();
122  $this->initCommands();
123 
124  if ($this->isQuestionManagingEnabled()) {
125  $this->setSelectAllCheckbox('q_id');
126  }
127  }
128 
132  protected function initColumns()
133  {
134  if ($this->isCheckboxColumnRequired()) {
135  $this->addColumn('', 'f', '1%', true);
136  }
137 
138  if ($this->isQuestionPositioningEnabled()) {
139  $this->addColumn($this->lng->txt('order'), 'f', '1%');
140  }
141 
142  if ($this->isColumnSelected('qid')) {
143  $this->addColumn($this->lng->txt('question_id'), 'qid', '');
144  }
145 
146  $this->addColumn($this->lng->txt("tst_question_title"), 'title', '');
147 
149  $this->addColumn($this->lng->txt("obligatory"), 'obligatory', '');
150  }
151 
152  if ($this->isColumnSelected('description')) {
153  $this->addColumn($this->lng->txt('description'), 'description', '');
154  }
155 
156  $this->addColumn($this->lng->txt("tst_question_type"), 'type', '');
157  $this->addColumn($this->buildPointsHeader(), '', '');
158 
159  if ($this->isColumnSelected('author')) {
160  $this->addColumn($this->lng->txt('author'), 'author', '');
161  }
162  if ($this->isColumnSelected('lifecycle')) {
163  $this->addColumn($this->lng->txt('qst_lifecycle'), 'lifecycle', '');
164  }
165  if ($this->isColumnSelected('working_time')) {
166  $this->addColumn($this->buildWorkingTimeHeader(), 'working_time', '');
167  }
168 
169  $this->addColumn($this->lng->txt('qpl'), 'qpl', '');
170 
171  $this->addColumn($this->lng->txt('actions'), '', '1%');
172  }
173 
174  protected function initCommands()
175  {
176  if ($this->isQuestionManagingEnabled()) {
177  $this->addMultiCommand('removeQuestions', $this->lng->txt('remove_question'));
178  $this->addMultiCommand('moveQuestions', $this->lng->txt('move'));
179  }
180 
181  if ($this->isPositionInsertCommandsEnabled()) {
182  $this->addMultiCommand('insertQuestionsBefore', $this->lng->txt('insert_before'));
183  $this->addMultiCommand('insertQuestionsAfter', $this->lng->txt('insert_after'));
184  }
185 
186  if ($this->isQuestionManagingEnabled()) {
187  $this->addMultiCommand('copyQuestion', $this->lng->txt('copy'));
188  $this->addMultiCommand('copyAndLinkToQuestionpool', $this->lng->txt('copy_and_link_to_questionpool'));
189  }
190 
191  if ($this->isTableSaveCommandRequired()) {
192  $this->addCommandButton('saveOrderAndObligations', $this->buildTableSaveCommandLabel());
193  }
194  }
195 
203  public function fillRow($data)
204  {
205  if ($this->isCheckboxColumnRequired()) {
206  $this->tpl->setVariable("CHECKBOX_QID", $data['question_id']);
207  }
208 
209  if ($this->isQuestionPositioningEnabled()) {
210  $this->position += 10;
211  $inputField = $this->buildPositionInput($data['question_id'], $this->position);
212 
213  $this->tpl->setVariable("QUESTION_POSITION", $inputField);
214  $this->tpl->setVariable("POSITION_QID", $data['question_id']);
215  }
216 
217  if ($this->isColumnSelected('qid')) {
218  $this->tpl->setVariable("QUESTION_ID_PRESENTATION", $data['question_id']);
219  }
220 
221  $this->tpl->setVariable("QUESTION_TITLE", $this->buildQuestionTitleLink($data));
222 
223  if (!$data['complete']) {
224  $this->tpl->setVariable("IMAGE_WARNING", ilUtil::getImagePath("icon_alert.svg"));
225  $this->tpl->setVariable("ALT_WARNING", $this->lng->txt("warning_question_not_complete"));
226  $this->tpl->setVariable("TITLE_WARNING", $this->lng->txt("warning_question_not_complete"));
227  }
228 
230  $this->tpl->setVariable("QUESTION_OBLIGATORY", $this->buildObligatoryColumnContent($data));
231  }
232 
233  if ($this->isColumnSelected('description')) {
234  $this->tpl->setVariable("QUESTION_COMMENT", $data["description"] ? $data["description"] : '&nbsp;');
235  }
236 
237  $this->tpl->setVariable("QUESTION_TYPE", assQuestion::_getQuestionTypeName($data["type_tag"]));
238  $this->tpl->setVariable("QUESTION_POINTS", $data["points"]);
239 
240  if ($this->isColumnSelected('author')) {
241  $this->tpl->setVariable("QUESTION_AUTHOR", $data["author"]);
242  }
243 
244  if ($this->isColumnSelected('lifecycle')) {
245  try {
246  $lifecycle = ilAssQuestionLifecycle::getInstance($data['lifecycle'])->getTranslation($this->lng);
247  $this->tpl->setVariable("QUESTION_LIFECYCLE", $lifecycle);
249  $this->tpl->setVariable("QUESTION_LIFECYCLE", '');
250  }
251  }
252 
253  if ($this->isColumnSelected('working_time')) {
254  $this->tpl->setVariable("QUESTION_WORKING_TIME", $data["working_time"]);
255  }
256 
257  $question_pool_title = $this->lng->txt('tst_question_not_from_pool_info');
258 
259  if (isset($data['orig_obj_fi']) && ilObject::_lookupTitle($data['orig_obj_fi']) !== null) {
260  $question_pool_title = $this->buildPossiblyLinkedQuestonPoolTitle(
261  $this->ctrl,
262  $this->access,
263  $this->lng,
264  $this->factory,
265  $this->renderer,
266  $data["orig_obj_fi"],
267  ilObject::_lookupTitle($data["orig_obj_fi"])
268  );
269  }
270 
271  $this->tpl->setVariable(
272  "QUESTION_POOL",
273  $question_pool_title
274  );
275 
276  $actions = new ilAdvancedSelectionListGUI();
277  $actions->setId('qst' . $data["question_id"]);
278  $actions->setListTitle($this->lng->txt('actions'));
279 
280  $actions->addItem(
281  $this->lng->txt('preview'),
282  '',
283  $this->getPreviewLink($data)
284  );
285 
286  $actions->addItem(
287  $this->lng->txt('statistics'),
288  '',
289  $this->getEditLink($data, 'ilAssQuestionPreviewGUI', ilAssQuestionPreviewGUI::CMD_STATISTICS)
290  );
291 
292  if ($this->isQuestionManagingEnabled()) {
293  $editHref = $this->getEditLink($data, $data['type_tag'] . 'GUI', 'editQuestion');
294  $actions->addItem($this->lng->txt('edit_question'), '', $editHref);
295 
296  $editPageHref = $this->getEditLink($data, 'ilAssQuestionPageGUI', 'edit');
297  $actions->addItem($this->lng->txt('edit_page'), '', $editPageHref);
298 
299  $moveHref = $this->getEditLink($data, get_class($this->getParentObject()), 'moveQuestions');
300  $actions->addItem($this->lng->txt('move'), '', $moveHref);
301 
302  $copyHref = $this->getEditLink($data, get_class($this->getParentObject()), 'copyQuestion');
303  $actions->addItem($this->lng->txt('copy'), '', $copyHref);
304 
305  $deleteHref = $this->getEditLink($data, get_class($this->getParentObject()), 'removeQuestions');
306  $actions->addItem($this->lng->txt('delete'), '', $deleteHref);
307 
308  $feedbackHref = $this->getEditLink($data, 'ilAssQuestionFeedbackEditingGUI', ilAssQuestionFeedbackEditingGUI::CMD_SHOW);
309  $actions->addItem($this->lng->txt('tst_feedback'), '', $feedbackHref);
310 
311  $hintsHref = $this->getEditLink($data, 'ilAssQuestionHintsGUI', ilAssQuestionHintsGUI::CMD_SHOW_LIST);
312  $actions->addItem($this->lng->txt('tst_question_hints_tab'), '', $hintsHref);
313  }
314  $this->tpl->setVariable('ROW_ACTIONS', $actions->getHTML());
315  if ($this->isQuestionRemoveRowButtonEnabled()) {
316  $this->tpl->setVariable('ROW_ACTIONS', $this->buildQuestionRemoveButton($data));
317  }
318  }
319 
320  protected function buildQuestionRemoveButton(array $rowData) : string
321  {
322  $this->ctrl->setParameter($this->getParentObject(), 'removeQid', $rowData['question_id']);
323  $removeUrl = $this->ctrl->getLinkTarget($this->getParentObject(), $this->getParentCmd());
324  $this->ctrl->setParameter($this->getParentObject(), 'removeQid', '');
325 
326  $button = ilLinkButton::getInstance();
327  $button->setCaption('remove_question');
328  $button->setUrl($removeUrl);
329 
330  return $button->render();
331  }
332 
333  protected function buildQuestionTitleLink(array $rowData) : string
334  {
335  return '<a href="' . $this->getPreviewLink($rowData) . '">' . $rowData["title"] . '</a>';
336  }
337 
338  protected function getPreviewLink(array $rowData) : string
339  {
340  $target_class = get_class($this->getParentObject());
341  $this->ctrl->setParameterByClass(
342  $target_class,
343  'ref_id',
344  current(ilObject::_getAllReferences($rowData['obj_fi']))
345  );
346 
347  $this->ctrl->setParameterByClass(
348  $target_class,
349  'eqpl',
350  current(ilObject::_getAllReferences($rowData['obj_fi']))
351  );
352 
353  $this->ctrl->setParameterByClass(
354  $target_class,
355  'eqid',
356  $rowData['question_id']
357  );
358 
359  $this->ctrl->setParameterByClass(
360  $target_class,
361  'q_id',
362  $rowData['question_id']
363  );
364 
365  $this->ctrl->setParameterByClass(
366  $target_class,
367  'calling_test',
368  $_GET['ref_id']
369  );
370 
371  $question_href = $this->ctrl->getLinkTargetByClass(
372  $target_class,
373  $this->getParentCmd()
374  );
375  $this->ctrl->setParameterByClass($target_class, 'eqpl', '');
376  $this->ctrl->setParameterByClass($target_class, 'eqid', '');
377  $this->ctrl->setParameterByClass($target_class, 'q_id', '');
378  $this->ctrl->setParameterByClass($target_class, 'calling_test', '');
379 
380  return $question_href;
381  }
382 
383  protected function getEditLink(array $rowData, string $target_class, string $cmd) : string
384  {
385  $this->ctrl->setParameterByClass(
386  $target_class,
387  'ref_id',
388  current(ilObject::_getAllReferences($rowData['obj_fi']))
389  );
390 
391  $this->ctrl->setParameterByClass(
392  $target_class,
393  'q_id',
394  $rowData['question_id']
395  );
396  $this->ctrl->setParameterByClass(
397  $target_class,
398  'calling_test',
399  $_GET['ref_id']
400  );
401 
402  $link = $this->ctrl->getLinkTargetByClass(array_merge(
403  self::CLASS_PATH_FOR_EDIT_LINKS,
404  [$target_class]
405  ), $cmd);
406 
407  $this->ctrl->setParameterByClass($target_class, 'ref_id', '');
408  $this->ctrl->setParameterByClass($target_class, 'q_id', '');
409  $this->ctrl->setParameterByClass($target_class, 'calling_test', '');
410  return $link;
411  }
412 
417  protected function buildObligatoryColumnContent(array $rowData) : string
418  {
419  if (!$rowData['obligationPossible']) {
420  return '&nbsp;';
421  }
422 
423  if ($rowData['obligatory'] && !$this->isQuestionManagingEnabled()) {
424  // obligatory icon
425  return ilGlyphGUI::get(ilGlyphGUI::EXCLAMATION, $this->lng->txt('question_obligatory'));
426  }
427 
428  $checkedAttr = $rowData['obligatory'] ? 'checked="checked"' : '';
429  return '<input type="checkbox" name="obligatory[' . $rowData['question_id'] . ']" value="1" ' . $checkedAttr . ' />';
430  }
431 
437  protected function buildPositionInput($questionId, $position) : string
438  {
439  return '<input type="text" name="order[q_' . $questionId . ']" value="' . $position . '" maxlength="4" size="4" />';
440  }
441 
445  protected function buildTableSaveCommandLabel() : string
446  {
448  return $this->lng->txt('saveOrderAndObligations');
449  }
450 
452  return $this->lng->txt('saveObligations');
453  }
454 
455  if ($this->isQuestionPositioningEnabled()) {
456  return $this->lng->txt('saveOrder');
457  }
458 
459  return $this->lng->txt('save');
460  }
461 
465  protected function buildPointsHeader() : string
466  {
467  if ($this->getTotalPoints()) {
468  return $this->lng->txt('points') . ' (' . $this->getTotalPoints() . ')';
469  }
470 
471  return $this->lng->txt('points');
472  }
473 
477  protected function buildWorkingTimeHeader() : string
478  {
479  if (strlen($this->getTotalWorkingTime())) {
480  return $this->lng->txt('working_time') . ' (' . $this->getTotalWorkingTime() . ')';
481  }
482 
483  return $this->lng->txt('working_time');
484  }
485 
489  protected function isTableSaveCommandRequired() : bool
490  {
491  if (!$this->isQuestionManagingEnabled()) {
492  return false;
493  }
494 
496  }
497 
501  protected function isCheckboxColumnRequired() : bool
502  {
504  }
505 
509  public function isQuestionManagingEnabled() : bool
510  {
512  }
513 
518  {
519  $this->questionManagingEnabled = $questionManagingEnabled;
520  }
521 
525  public function isPositionInsertCommandsEnabled() : bool
526  {
528  }
529 
534  {
535  $this->positionInsertCommandsEnabled = $positionInsertCommandsEnabled;
536  }
537 
541  public function isQuestionPositioningEnabled() : bool
542  {
544  }
545 
550  {
551  $this->questionPositioningEnabled = $questionPositioningEnabled;
552  }
553 
557  public function isObligatoryQuestionsHandlingEnabled() : bool
558  {
560  }
561 
566  {
567  $this->obligatoryQuestionsHandlingEnabled = $obligatoryQuestionsHandlingEnabled;
568  }
569 
573  public function getTotalPoints() : float
574  {
575  return $this->totalPoints;
576  }
577 
581  public function setTotalPoints(float $totalPoints)
582  {
583  $this->totalPoints = $totalPoints;
584  }
585 
589  public function getTotalWorkingTime() : string
590  {
592  }
593 
597  public function setTotalWorkingTime(string $totalWorkingTime)
598  {
599  $this->totalWorkingTime = $totalWorkingTime;
600  }
601 
605  public function isQuestionRemoveRowButtonEnabled() : bool
606  {
608  }
609 
614  {
615  $this->questionRemoveRowButtonEnabled = $questionRemoveRowButtonEnabled;
616  }
617 }
addCommandButton($a_cmd, $a_text, $a_onclick='', $a_id="", $a_class=null)
Add Command button.
setQuestionManagingEnabled(bool $questionManagingEnabled)
setStyle($a_element, $a_style)
$_GET["client_id"]
setObligatoryQuestionsHandlingEnabled(bool $obligatoryQuestionsHandlingEnabled)
setExternalSegmentation($a_val)
Set external segmentation.
static _getQuestionTypeName($type_tag)
Return the translation for a given question type tag.
static get($a_glyph, $a_text="")
Get glyph html.
static _lookupTitle($a_id)
lookup object title
setQuestionRemoveRowButtonEnabled(bool $questionRemoveRowButtonEnabled)
getParentCmd()
Get parent command.
getParentObject()
Get parent object.
const CMD_SHOW_LIST
command constants
setId($a_val)
Set id.
static _getAllReferences($a_id)
get all reference ids of object
setTotalWorkingTime(string $totalWorkingTime)
setSelectAllCheckbox($a_select_all_checkbox, $a_select_all_on_top=false)
Set the name of the checkbox that should be toggled with a select all button.
setPositionInsertCommandsEnabled(bool $positionInsertCommandsEnabled)
static getImagePath($img, $module_path="", $mode="output", $offline=false)
get image path (for images located in a template directory)
global $DIC
Definition: goto.php:24
addMultiCommand($a_cmd, $a_text)
Add Command button.
enable($a_module_name)
enables particular modules of table
buildPositionInput($questionId, $position)
setRowTemplate($a_template, $a_template_dir="")
Set row template.
setQuestionPositioningEnabled(bool $questionPositioningEnabled)
isColumnSelected($a_col)
Is given column selected?
setFormAction($a_form_action, $a_multipart=false)
Set Form action parameter.
disable($a_module_name)
diesables particular modules of table
setFormName($a_formname="")
Set Form name.
__construct(Container $dic, ilPlugin $plugin)
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.
setShowRowsSelector($a_value)
Toggle rows-per-page selector.
getEditLink(array $rowData, string $target_class, string $cmd)
__construct($a_parent_obj, $a_parent_cmd, $parentRefId)
Constructor.
$cols
Definition: xhr_table.php:11