ILIAS  release_5-1 Revision 5.0.0-5477-g43f3e3fab5f
class.ilAssQuestionHintsGUI.php
Go to the documentation of this file.
1<?php
2/* Copyright (c) 1998-2013 ILIAS open source, Extended GPL, see docs/LICENSE */
3
4require_once 'Modules/TestQuestionPool/classes/class.ilAssQuestionHintAbstractGUI.php';
5require_once 'Modules/TestQuestionPool/classes/class.ilAssQuestionHintGUI.php';
6require_once 'Modules/TestQuestionPool/classes/class.ilAssQuestionHintsOrderingClipboard.php';
7
23{
27 const CMD_SHOW_LIST = 'showList';
28 const CMD_CONFIRM_DELETE = 'confirmDelete';
29 const CMD_PERFORM_DELETE = 'performDelete';
30 const CMD_SAVE_LIST_ORDER = 'saveListOrder';
31 const CMD_CUT_TO_ORDERING_CLIPBOARD = 'cutToOrderingClipboard';
32 const CMD_PASTE_FROM_ORDERING_CLIPBOARD_BEFORE = 'pasteFromOrderingClipboardBefore';
33 const CMD_PASTE_FROM_ORDERING_CLIPBOARD_AFTER = 'pasteFromOrderingClipboardAfter';
34 const CMD_RESET_ORDERING_CLIPBOARD = 'resetOrderingClipboard';
35 const CMD_CONFIRM_SYNC = 'confirmSync';
36
43 private $hintOrderingClipboard = null;
44
52 {
53 parent::__construct($questionGUI);
54
55 $this->hintOrderingClipboard = new ilAssQuestionHintsOrderingClipboard($questionGUI->object);
56 }
57
65 public function executeCommand()
66 {
67 global $ilCtrl, $ilTabs, $lng;
68
69 $cmd = $ilCtrl->getCmd(self::CMD_SHOW_LIST);
70 $nextClass = $ilCtrl->getNextClass($this);
71
72 switch($nextClass)
73 {
74 case 'ilassquestionhintgui':
75
76 require_once 'Modules/TestQuestionPool/classes/class.ilAssQuestionHintGUI.php';
77 $gui = new ilAssQuestionHintGUI($this->questionGUI);
78 $ilCtrl->forwardCommand($gui);
79 break;
80
81 case 'ilasshintpagegui':
82
83 require_once 'Modules/TestQuestionPool/classes/class.ilAssQuestionHintPageObjectCommandForwarder.php';
84 $forwarder = new ilAssQuestionHintPageObjectCommandForwarder($this->questionOBJ, $ilCtrl, $ilTabs, $lng);
86 $forwarder->forward();
87 break;
88
89 default:
90
91 $cmd .= 'Cmd';
92 $this->$cmd();
93 break;
94 }
95 }
96
103 private function showListCmd()
104 {
105 global $ilCtrl, $tpl, $lng;
106
108
109 require_once 'Services/UIComponent/Toolbar/classes/class.ilToolbarGUI.php';
110 require_once 'Modules/TestQuestionPool/classes/class.ilAssQuestionHintsTableGUI.php';
111
112 $toolbar = new ilToolbarGUI();
113
114 $questionHintList = ilAssQuestionHintList::getListByQuestionId( $this->questionOBJ->getId() );
115
116 if( $this->hintOrderingClipboard->hasStored() )
117 {
118 $questionHintList = $this->getQuestionHintListWithoutHintStoredInOrderingClipboard($questionHintList);
119
120 $toolbar->addButton(
121 $lng->txt('tst_questions_hints_toolbar_cmd_reset_ordering_clipboard'),
122 $ilCtrl->getLinkTarget($this, self::CMD_RESET_ORDERING_CLIPBOARD)
123 );
124 }
125 else
126 {
127 $toolbar->addButton(
128 $lng->txt('tst_questions_hints_toolbar_cmd_add_hint'),
129 $ilCtrl->getLinkTargetByClass('ilAssQuestionHintGUI', ilAssQuestionHintGUI::CMD_SHOW_FORM)
130 );
131 }
132
133 $table = new ilAssQuestionHintsTableGUI(
134 $this->questionOBJ, $questionHintList, $this, self::CMD_SHOW_LIST,
135 ilAssQuestionHintsTableGUI::TBL_MODE_ADMINISTRATION, $this->hintOrderingClipboard
136 );
137
138 $tpl->setContent( $ilCtrl->getHtml($toolbar) . $ilCtrl->getHtml($table) );
139 }
140
149 private function confirmDeleteCmd()
150 {
151 global $ilCtrl, $tpl, $lng;
152
153 $hintIds = self::fetchHintIdsParameter();
154
155 if( !count($hintIds) )
156 {
157 ilUtil::sendFailure($lng->txt('tst_question_hints_delete_hints_missing_selection_msg'), true);
158 $ilCtrl->redirect($this);
159 }
160
161 require_once 'Services/Utilities/classes/class.ilConfirmationGUI.php';
162 $confirmation = new ilConfirmationGUI();
163
164 $confirmation->setHeaderText($lng->txt('tst_question_hints_delete_hints_confirm_header'));
165 $confirmation->setFormAction($ilCtrl->getFormAction($this));
166 $confirmation->setConfirm($lng->txt('tst_question_hints_delete_hints_confirm_cmd'), self::CMD_PERFORM_DELETE);
167 $confirmation->setCancel($lng->txt('cancel'), self::CMD_SHOW_LIST);
168
169 $questionHintList = ilAssQuestionHintList::getListByQuestionId($this->questionOBJ->getId());
170
171 foreach($questionHintList as $questionHint)
172 {
173 /* @var $questionHint ilAssQuestionHint */
174
175 if( in_array($questionHint->getId(), $hintIds) )
176 {
177 $confirmation->addItem('hint_ids[]', $questionHint->getId(), sprintf(
178 $lng->txt('tst_question_hints_delete_hints_confirm_item'), $questionHint->getIndex(), $questionHint->getText()
179 ));
180 }
181 }
182
183 $tpl->setContent( $ilCtrl->getHtml($confirmation) );
184 }
185
193 private function performDeleteCmd()
194 {
195 global $ilCtrl, $tpl, $lng;
196
197 $hintIds = self::fetchHintIdsParameter();
198
199 if( !count($hintIds) )
200 {
201 ilUtil::sendFailure($lng->txt('tst_question_hints_delete_hints_missing_selection_msg'), true);
202 $ilCtrl->redirect($this);
203 }
204
205 $questionCompleteHintList = ilAssQuestionHintList::getListByQuestionId($this->questionOBJ->getId());
206
207 $questionRemainingHintList = new ilAssQuestionHintList();
208
209 foreach($questionCompleteHintList as $listKey => $questionHint)
210 {
211 /* @var $questionHint ilAssQuestionHint */
212
213 if( in_array($questionHint->getId(), $hintIds) )
214 {
215 $questionHint->delete();
216 }
217 else
218 {
219 $questionRemainingHintList->addHint($questionHint);
220 }
221 }
222
223 $questionRemainingHintList->reIndex();
224
225 ilUtil::sendSuccess($lng->txt('tst_question_hints_delete_success_msg'), true);
226
227 $originalexists = $this->questionOBJ->_questionExistsInPool($this->questionOBJ->original_id);
228 include_once "./Modules/TestQuestionPool/classes/class.assQuestion.php";
229 global $ilUser;
230 if ($_GET["calling_test"] && $originalexists && assQuestion::_isWriteable($this->questionOBJ->original_id, $ilUser->getId()))
231 {
232 $ilCtrl->redirectByClass('ilAssQuestionHintsGUI', ilAssQuestionHintsGUI::CMD_CONFIRM_SYNC);
233 }
234
235 $ilCtrl->redirect($this);
236 }
237
246 private function saveListOrderCmd()
247 {
248 global $ilCtrl, $lng;
249
250 $hintIndexes = self::orderHintIndexes(
251 self::fetchHintIndexesParameter()
252 );
253
254 if( !count($hintIndexes) )
255 {
256 ilUtil::sendFailure($lng->txt('tst_question_hints_save_order_unkown_failure_msg'), true);
257 $ilCtrl->redirect($this);
258 }
259
260 $curQuestionHintList = ilAssQuestionHintList::getListByQuestionId( $this->questionOBJ->getId() );
261
262 $newQuestionHintList = new ilAssQuestionHintList();
263
264 foreach($hintIndexes as $hintId => $hintIndex)
265 {
266 if( !$curQuestionHintList->hintExists($hintId) )
267 {
268 ilUtil::sendFailure($lng->txt('tst_question_hints_save_order_unkown_failure_msg'), true);
269 $ilCtrl->redirect($this);
270 }
271
272 $questionHint = $curQuestionHintList->getHint($hintId);
273
274 $newQuestionHintList->addHint($questionHint);
275 }
276
277 $newQuestionHintList->reIndex();
278
279 ilUtil::sendSuccess($lng->txt('tst_question_hints_save_order_success_msg'), true);
280
281 $originalexists = $this->questionOBJ->_questionExistsInPool($this->questionOBJ->original_id);
282 include_once "./Modules/TestQuestionPool/classes/class.assQuestion.php";
283 global $ilUser;
284 if ($_GET["calling_test"] && $originalexists && assQuestion::_isWriteable($this->questionOBJ->original_id, $ilUser->getId()))
285 {
286 $ilCtrl->redirectByClass('ilAssQuestionHintsGUI', ilAssQuestionHintsGUI::CMD_CONFIRM_SYNC);
287 }
288
289 $ilCtrl->redirect($this);
290 }
291
298 private function cutToOrderingClipboardCmd()
299 {
300 global $ilCtrl;
301
302 $moveHintIds = self::fetchHintIdsParameter();
303 $this->checkForSingleHintIdAndRedirectOnFailure($moveHintIds);
304
305 $moveHintId = current($moveHintIds);
306
308
309 $this->hintOrderingClipboard->setStored($moveHintId);
310
311 $ilCtrl->redirect($this, self::CMD_SHOW_LIST);
312 }
313
322 {
323 global $ilCtrl, $lng;
324
325 $targetHintIds = self::fetchHintIdsParameter();
326 $this->checkForSingleHintIdAndRedirectOnFailure($targetHintIds);
327
328 $targetHintId = current($targetHintIds);
329
331
332 $curQuestionHintList = ilAssQuestionHintList::getListByQuestionId( $this->questionOBJ->getId() );
333 $newQuestionHintList = new ilAssQuestionHintList( $this->questionOBJ->getId() );
334
335 foreach($curQuestionHintList as $questionHint)
336 {
337 /* @var $questionHint ilAssQuestionHint */
338
339 if( $questionHint->getId() == $this->hintOrderingClipboard->getStored() )
340 {
341 continue;
342 }
343
344 if( $questionHint->getId() == $targetHintId )
345 {
346 $targetQuestionHint = $questionHint;
347
348 $pasteQuestionHint = ilAssQuestionHint::getInstanceById( $this->hintOrderingClipboard->getStored() );
349
350 $newQuestionHintList->addHint($pasteQuestionHint);
351 }
352
353 $newQuestionHintList->addHint($questionHint);
354 }
355
356 $successMsg = sprintf(
357 $lng->txt('tst_question_hints_paste_before_success_msg'),
358 $pasteQuestionHint->getIndex(), $targetQuestionHint->getIndex()
359 );
360
361 $newQuestionHintList->reIndex();
362
363 $this->hintOrderingClipboard->resetStored();
364
365 ilUtil::sendSuccess($successMsg, true);
366
367 $ilCtrl->redirect($this, self::CMD_SHOW_LIST);
368 }
369
378 {
379 global $ilCtrl, $lng;
380
381 $targetHintIds = self::fetchHintIdsParameter();
382 $this->checkForSingleHintIdAndRedirectOnFailure($targetHintIds);
383
384 $targetHintId = current($targetHintIds);
385
387
388 $curQuestionHintList = ilAssQuestionHintList::getListByQuestionId( $this->questionOBJ->getId() );
389 $newQuestionHintList = new ilAssQuestionHintList( $this->questionOBJ->getId() );
390
391 foreach($curQuestionHintList as $questionHint)
392 {
393 /* @var $questionHint ilAssQuestionHint */
394
395 if( $questionHint->getId() == $this->hintOrderingClipboard->getStored() )
396 {
397 continue;
398 }
399
400 $newQuestionHintList->addHint($questionHint);
401
402 if( $questionHint->getId() == $targetHintId )
403 {
404 $targetQuestionHint = $questionHint;
405
406 $pasteQuestionHint = ilAssQuestionHint::getInstanceById( $this->hintOrderingClipboard->getStored() );
407
408 $newQuestionHintList->addHint($pasteQuestionHint);
409 }
410 }
411
412 $successMsg = sprintf(
413 $lng->txt('tst_question_hints_paste_after_success_msg'),
414 $pasteQuestionHint->getIndex(), $targetQuestionHint->getIndex()
415 );
416
417 $newQuestionHintList->reIndex();
418
419 $this->hintOrderingClipboard->resetStored();
420
421 ilUtil::sendSuccess($successMsg, true);
422
423 $ilCtrl->redirect($this, self::CMD_SHOW_LIST);
424 }
425
433 private function resetOrderingClipboardCmd()
434 {
435 global $ilCtrl, $lng;
436
437 $this->hintOrderingClipboard->resetStored();
438
439 ilUtil::sendInfo($lng->txt('tst_question_hints_ordering_clipboard_resetted'), true);
440 $ilCtrl->redirect($this, self::CMD_SHOW_LIST);
441 }
442
451 {
452 global $lng;
453
454 if( !$this->hintOrderingClipboard->hasStored() )
455 {
456 return;
457 }
458
459 $questionHint = ilAssQuestionHint::getInstanceById( $this->hintOrderingClipboard->getStored() );
460
461 ilUtil::sendInfo(sprintf(
462 $lng->txt('tst_question_hints_item_stored_in_ordering_clipboard'), $questionHint->getIndex()
463 ));
464 }
465
474 {
475 $questionHintList = ilAssQuestionHintList::getListByQuestionId( $this->questionOBJ->getId() );
476
477 if( !$questionHintList->hintExists($hintId) )
478 {
479 ilUtil::sendFailure($lng->txt('tst_question_hints_invalid_hint_id'), true);
480 $ilCtrl->redirect($this, self::CMD_SHOW_LIST);
481 }
482 }
483
493 {
494 $filteredQuestionHintList = new ilAssQuestionHintList();
495
496 foreach($questionHintList as $questionHint)
497 {
498 /* @var $questionHint ilAssQuestionHint */
499
500 if( $questionHint->getId() != $this->hintOrderingClipboard->getStored() )
501 {
502 $filteredQuestionHintList->addHint($questionHint);
503 }
504 }
505
506 return $filteredQuestionHintList;
507 }
508
519 {
520 global $ilCtrl, $lng;
521
522 if( !count($hintIds) )
523 {
524 ilUtil::sendFailure($lng->txt('tst_question_hints_cut_hints_missing_selection_msg'), true);
525 $ilCtrl->redirect($this, self::CMD_SHOW_LIST);
526 }
527 elseif( count($hintIds) > 1 )
528 {
529 ilUtil::sendFailure($lng->txt('tst_question_hints_cut_hints_single_selection_msg'), true);
530 $ilCtrl->redirect($this, self::CMD_SHOW_LIST);
531 }
532 }
533
542 private static function fetchHintIdsParameter()
543 {
544 $hintIds = array();
545
546 if( isset($_POST['hint_ids']) && is_array($_POST['hint_ids']) )
547 {
548 foreach($_POST['hint_ids'] as $hintId)
549 {
550 if( (int)$hintId ) $hintIds[] = (int)$hintId;
551 }
552 }
553 elseif( isset($_GET['hint_id']) && (int)$_GET['hint_id'] )
554 {
555 $hintIds[] = (int)$_GET['hint_id'];
556 }
557
558 return $hintIds;
559 }
560
568 private static function fetchHintIndexesParameter()
569 {
570 $hintIndexes = array();
571
572 if( isset($_POST['hint_indexes']) && is_array($_POST['hint_indexes']) )
573 {
574 foreach($_POST['hint_indexes'] as $hintId => $hintIndex)
575 {
576 if( (int)$hintId ) $hintIndexes[(int)$hintId] = $hintIndex;
577 }
578 }
579
580 return $hintIndexes;
581 }
582
591 private static function orderHintIndexes($hintIndexes)
592 {
593 asort($hintIndexes);
594
595 return $hintIndexes;
596 }
597
598 public function confirmSyncCmd()
599 {
600 $this->questionGUI->originalSyncForm('showHints');
601 }
602}
global $tpl
Definition: ilias.php:8
$_GET["client_id"]
Basic GUI class for assessment questions.
_isWriteable($question_id, $user_id)
Returns true if the question is writeable by a certain user.
const CMD_SHOW_FORM
command constants
static getListByQuestionId($questionId)
instantiates a question hint list for the passed question id
static getInstanceById($hintId)
creates a hint object instance, loads the persisted hint dataset identified by passed hint id from da...
pasteFromOrderingClipboardAfterCmd()
pastes a hint from ordering clipboard after the selected one
resetOrderingClipboardCmd()
resets the ordering clipboard
getQuestionHintListWithoutHintStoredInOrderingClipboard(ilAssQuestionHintList $questionHintList)
returns a new quastion hint list that contains all question hints from the passed list except for the...
__construct(assQuestionGUI $questionGUI)
Constructor.
initHintOrderingClipboardNotification()
inits the notification telling the user, that a hint is stored to hint ordering clipboard
pasteFromOrderingClipboardBeforeCmd()
pastes a hint from ordering clipboard before the selected one
static fetchHintIdsParameter()
fetches either an array of hint ids from POST or a single hint id from GET and returns an array of (a...
cutToOrderingClipboardCmd()
cuts a hint from question hint list and stores it to ordering clipboard
static fetchHintIndexesParameter()
fetches an array of hint index values from POST
performDeleteCmd()
performs confirmed deletion for selected hints
saveListOrderCmd()
saves the order based on index values passed from table's form (the table must not be paginated,...
checkForExistingHintRelatingToCurrentQuestionAndRedirectOnFailure($hintId)
checks for an existing hint relating to current question and redirects with corresponding failure mes...
checkForSingleHintIdAndRedirectOnFailure($hintIds)
checks for a hint id in the passed array and redirects with corresponding failure message if not exac...
showListCmd()
shows a table with existing hints
static orderHintIndexes($hintIndexes)
sorts the array of indexes by index value so keys (hint ids) get into new order submitted by user
confirmDeleteCmd()
shows a confirmation screen with selected hints for deletion
const CMD_SHOW_LIST
command constants
Confirmation screen class.
static sendSuccess($a_info="", $a_keep=false)
Send Success Message to Screen.
static sendFailure($a_info="", $a_keep=false)
Send Failure Message to Screen.
static sendInfo($a_info="", $a_keep=false)
Send Info Message to Screen.
$_POST['username']
Definition: cron.php:12
global $ilCtrl
Definition: ilias.php:18
global $lng
Definition: privfeed.php:40
$cmd
Definition: sahs_server.php:35
global $ilUser
Definition: imgupload.php:15