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
4include_once('./Services/Table/classes/class.ilTable2GUI.php');
5require_once 'Services/UIComponent/Glyph/classes/class.ilGlyphGUI.php';
6
7use ILIAS\Modules\Test\QuestionPoolLinkedTitleBuilder;
8
19{
20 use QuestionPoolLinkedTitleBuilder;
21 private const CLASS_PATH_FOR_EDIT_LINKS = [ilRepositoryGUI::class, ilObjQuestionPoolGUI::class];
22
27
31 protected $questionManagingEnabled = false;
32
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());
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
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
598 {
599 $this->totalWorkingTime = $totalWorkingTime;
600 }
601
605 public function isQuestionRemoveRowButtonEnabled() : bool
606 {
608 }
609
614 {
615 $this->questionRemoveRowButtonEnabled = $questionRemoveRowButtonEnabled;
616 }
617}
$_GET["client_id"]
An exception for terminatinating execution or to throw for unit testing.
static _getQuestionTypeName($type_tag)
Return the translation for a given question type tag.
User interface class for advanced drop-down selection lists.
const CMD_SHOW_LIST
command constants
static get($a_glyph, $a_text="")
Get glyph html.
static getInstance()
Factory.
static _lookupTitle($a_id)
lookup object title
static _getAllReferences($a_id)
get all reference ids of object
Class ilTable2GUI.
getParentCmd()
Get parent command.
setShowRowsSelector($a_value)
Toggle rows-per-page selector.
getParentObject()
Get parent object.
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.
setRowTemplate($a_template, $a_template_dir="")
Set row template.
addMultiCommand($a_cmd, $a_text)
Add Command button.
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.
setExternalSegmentation($a_val)
Set external segmentation.
setId($a_val)
Set id.
setFormName($a_formname="")
Set Form name.
setFormAction($a_form_action, $a_multipart=false)
Set Form action parameter.
isColumnSelected($a_col)
Is given column selected?
addCommandButton($a_cmd, $a_text, $a_onclick='', $a_id="", $a_class=null)
Add Command button.
disable($a_module_name)
diesables particular modules of table
setStyle($a_element, $a_style)
enable($a_module_name)
enables particular modules of table
setQuestionRemoveRowButtonEnabled(bool $questionRemoveRowButtonEnabled)
getEditLink(array $rowData, string $target_class, string $cmd)
setQuestionManagingEnabled(bool $questionManagingEnabled)
setPositionInsertCommandsEnabled(bool $positionInsertCommandsEnabled)
__construct($a_parent_obj, $a_parent_cmd, $parentRefId)
Constructor.
buildPositionInput($questionId, $position)
setQuestionPositioningEnabled(bool $questionPositioningEnabled)
setObligatoryQuestionsHandlingEnabled(bool $obligatoryQuestionsHandlingEnabled)
setTotalWorkingTime(string $totalWorkingTime)
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
__construct(Container $dic, ilPlugin $plugin)
@inheritDoc
$cols
Definition: xhr_table.php:11