147 bool $a_call_by_reference =
true
151 $this->survey_service =
$DIC->survey()->internal();
153 $this->
user = $DIC->user();
154 $this->
lng = $DIC->language();
155 $this->db =
$DIC->database();
156 $this->
access = $DIC->access();
157 $this->plugin_admin =
$DIC[
"ilPluginAdmin"];
158 $this->tree =
$DIC->repositoryTree();
159 $ilUser =
$DIC->user();
163 $this->survey_id = -1;
164 $this->introduction =
"";
165 $this->outro =
$lng->
txt(
"survey_finished");
166 $this->author = $ilUser->getFullname();
168 $this->questions = array();
171 $this->surveyCodeSecurity =
true;
172 $this->pool_usage =
true;
176 $this->invitation_manager = $this
182 $this->import_manager =
$DIC->surveyQuestionPool()
186 $this->placeholder_resolver =
$DIC->mail()->placeholderResolver();
191 $this->domain =
$DIC->survey()->internal()->domain();
197 $this->code_manager = $this
200 ->code($this, $this->
user->getId());
202 $this->feature_config = $this
205 ->modeFeatureConfig($this->
getMode());
207 $this->data_manager = $this
214 $id = parent::create();
228 public function update($a_upload =
false): bool
234 if (!parent::update()) {
245 $result = parent::createReference();
262 $this->questions[] = $question_id;
265 public function delete():
bool
267 $this->svy_log->debug(
"Deleting Survey, ref id: " . $this->
getRefId() .
", obj id: " .
274 foreach ($this->questions as $question_id) {
275 $this->svy_log->debug(
"Remove question " . $question_id);
283 $this->svy_log->debug(
"Call parent delete.");
284 $remove = parent::delete();
302 "DELETE FROM svy_svy WHERE survey_id = %s",
307 $result =
$ilDB->queryF(
308 "SELECT questionblock_fi FROM svy_qblk_qst WHERE survey_fi = %s",
312 $questionblocks = array();
313 while ($row =
$ilDB->fetchAssoc($result)) {
314 $questionblocks[] = $row[
"questionblock_fi"];
316 if (count($questionblocks)) {
317 $affectedRows =
$ilDB->manipulate(
"DELETE FROM svy_qblk WHERE " .
$ilDB->in(
'questionblock_id', $questionblocks,
false,
'integer'));
320 "DELETE FROM svy_qblk_qst WHERE survey_fi = %s",
326 if (isset($this->code_manager)) {
327 $this->code_manager->deleteAll(
true);
332 $directory = $svy_data_dir .
"/svy_" . $this->
getId();
333 if (is_dir($directory)) {
342 foreach ($mobs as $mob) {
355 bool $reset_LP =
true
359 $result =
$ilDB->queryF(
360 "SELECT finished_id FROM svy_finished WHERE survey_fi = %s",
364 $active_array = array();
365 while ($row =
$ilDB->fetchAssoc($result)) {
366 $active_array[] = $row[
"finished_id"];
369 $affectedRows =
$ilDB->manipulateF(
370 "DELETE FROM svy_finished WHERE survey_fi = %s",
375 foreach ($active_array as $active_fi) {
376 $affectedRows =
$ilDB->manipulateF(
377 "DELETE FROM svy_answer WHERE active_fi = %s",
381 $affectedRows =
$ilDB->manipulateF(
382 "DELETE FROM svy_times WHERE finished_fi = %s",
390 $lp_obj->resetLPDataForCompleteObject();
393 $this->invitation_manager->removeAll($this->
getSurveyId());
407 foreach ($finished_ids as $finished_id) {
408 $result =
$ilDB->queryF(
409 "SELECT finished_id, user_fi FROM svy_finished WHERE finished_id = %s",
413 $row =
$ilDB->fetchAssoc($result);
414 if ($row[
"user_fi"]) {
415 $user_ids[] = (
int) $row[
"user_fi"];
418 $affectedRows =
$ilDB->manipulateF(
419 "DELETE FROM svy_answer WHERE active_fi = %s",
421 array($row[
"finished_id"])
424 $affectedRows =
$ilDB->manipulateF(
425 "DELETE FROM svy_finished WHERE finished_id = %s",
430 $affectedRows =
$ilDB->manipulateF(
431 "DELETE FROM svy_times WHERE finished_fi = %s",
433 array($row[
"finished_id"])
437 if (count($user_ids)) {
439 $lp_obj->resetLPDataForUserIds($user_ids);
443 $this->invitation_manager->remove($this->getSurveyId(),
$user_id);
452 ?array $finished_ids =
null,
453 bool $force_non_anonymous =
false,
454 bool $include_invites =
false
457 $sql =
"SELECT * FROM svy_finished" .
458 " WHERE survey_fi = " .
$ilDB->quote($this->getSurveyId(),
"integer");
460 $sql .=
" AND " .
$ilDB->in(
"finished_id", $finished_ids,
"",
"integer");
463 $result =
$ilDB->query($sql);
464 $participants = array();
465 if ($result->numRows() > 0) {
466 while ($row =
$ilDB->fetchAssoc($result)) {
467 $userdata = $this->getUserDataFromActiveId($row[
"finished_id"], $force_non_anonymous);
468 $userdata[
"finished"] = (bool) $row[
"state"];
469 $userdata[
"finished_tstamp"] = $row[
"tstamp"];
470 $participants[$userdata[
"sortname"] . $userdata[
"active_id"]] = $userdata;
473 $participant_ids = array_column($participants,
"usr_id");
474 if ($include_invites) {
475 foreach ($this->invitation_manager->getAllForSurvey($this->getSurveyId()) as $usr_id) {
476 if (!in_array($usr_id, $participant_ids)) {
478 $participants[$name[
"lastname"] .
"," . $name[
"firstname"] . $usr_id] = [
480 "sortname" => $name[
"lastname"] .
"," . $name[
"firstname"],
481 "fistname" => $name[
"firstname"],
482 "lastname" => $name[
"lastname"],
483 "login" => $name[
"login"],
487 "finished_tstamp" => 0,
493 return $participants;
502 return ($this->
getTitle() && count($this->questions));
507 return count($this->questions);
517 if ($this->getSurveyId() > 0) {
519 "UPDATE svy_svy SET complete = %s, tstamp = %s WHERE survey_id = %s",
520 array(
'text',
'integer',
'integer'),
521 array($this->isComplete(), time(), $this->getSurveyId())
532 bool $a_force =
false
534 $questiontype = $this->getQuestionType($question_id);
535 $question_gui = $this->getQuestionGUI($questiontype, $question_id);
538 if ($this->
getId() === $question_gui->object->getObjId() && !$a_force) {
542 $duplicate_id = $question_gui->object->duplicate(
true,
"",
"", 0, $this->
getId());
543 return $duplicate_id;
555 $this->svy_log->debug(
"insert question, id:" . $question_id);
558 $this->svy_log->debug(
"question is not complete");
562 $result =
$ilDB->queryF(
563 "SELECT survey_question_id FROM svy_svy_qst WHERE survey_fi = %s",
565 array($this->getSurveyId())
567 $sequence = $result->numRows();
568 $duplicate_id = $this->duplicateQuestionForSurvey($question_id);
569 $this->svy_log->debug(
"duplicate, id: " . $question_id .
", duplicate id: " . $duplicate_id);
572 if ($this->isQuestionInSurvey($duplicate_id)) {
576 $next_id =
$ilDB->nextId(
'svy_svy_qst');
577 $affectedRows =
$ilDB->manipulateF(
578 "INSERT INTO svy_svy_qst (survey_question_id, survey_fi, question_fi, sequence, tstamp) VALUES (%s, %s, %s, %s, %s)",
579 array(
'integer',
'integer',
'integer',
'integer',
'integer'),
580 array($next_id, $this->getSurveyId(), $duplicate_id, $sequence, time())
583 $this->svy_log->debug(
"added entry to svy_svy_qst, id: " . $next_id .
", question id: " . $duplicate_id .
", sequence: " . $sequence);
585 $this->loadQuestionsFromDb();
586 $this->saveCompletionStatus();
599 $set =
$ilDB->query(
"SELECT * FROM svy_svy_qst " .
600 " WHERE survey_fi = " .
$ilDB->quote($this->getSurveyId(),
"integer") .
601 " AND question_fi = " .
$ilDB->quote($a_question_fi,
"integer"));
602 if ($rec =
$ilDB->fetchAssoc($set)) {
610 int $questionblock_id
613 $sequence_manager = $this->survey_service->domain()->sequence(
614 $this->getSurveyId(),
619 $result =
$ilDB->queryF(
620 "SELECT svy_qblk.title, svy_qblk.show_questiontext, svy_qblk.show_blocktitle," .
621 " svy_qblk_qst.question_fi FROM svy_qblk, svy_qblk_qst, svy_svy_qst" .
622 " WHERE svy_qblk.questionblock_id = svy_qblk_qst.questionblock_fi" .
623 " AND svy_svy_qst.question_fi = svy_qblk_qst.question_fi" .
624 " AND svy_qblk.questionblock_id = %s" .
625 " ORDER BY svy_svy_qst.sequence",
627 array($questionblock_id)
629 $questions = array();
630 $show_questiontext =
false;
631 $show_blocktitle =
false;
633 while ($row =
$ilDB->fetchAssoc($result)) {
635 $duplicate_id = $sequence_manager->appendQuestion($row[
"question_fi"],
true);
636 $questions[] = $duplicate_id;
637 $title = (string) $row[
"title"];
638 $show_questiontext = (bool) $row[
"show_questiontext"];
639 $show_blocktitle = (bool) $row[
"show_blocktitle"];
641 $this->createQuestionblock($title, $show_questiontext, $show_blocktitle, $questions);
653 $next_id =
$ilDB->nextId(
'svy_settings');
654 $affectedRows =
$ilDB->insert(
"svy_settings", array(
655 "settings_id" => array(
"integer", $next_id),
656 "usr_id" => array(
"integer", $usr_id),
657 "keyword" => array(
"text", $key),
658 "title" => array(
"text", $title),
659 "value" => array(
"clob", $value)
669 "DELETE FROM svy_settings WHERE settings_id = %s",
681 $result =
$ilDB->queryF(
682 "SELECT * FROM svy_settings WHERE usr_id = %s AND keyword = %s",
683 array(
'integer',
'text'),
687 if ($result->numRows()) {
688 while ($row =
$ilDB->fetchAssoc($result)) {
689 $found[$row[
'settings_id']] = $row;
701 $rmd_start = $this->getReminderStart();
702 if (is_object($rmd_start)) {
705 $rmd_end = $this->getReminderEnd();
706 if (is_object($rmd_end)) {
709 if ($this->getSurveyId() < 1) {
710 $next_id =
$ilDB->nextId(
'svy_svy');
711 $affectedRows =
$ilDB->insert(
"svy_svy", array(
712 "survey_id" => array(
"integer", $next_id),
713 "obj_fi" => array(
"integer", $this->
getId()),
714 "author" => array(
"text", $this->getAuthor()),
717 "startdate" => array(
"text", $this->getStartDate()),
718 "enddate" => array(
"text", $this->getEndDate()),
719 "evaluation_access" => array(
"text", $this->getEvaluationAccess()),
720 "complete" => array(
"text", $this->isComplete()),
721 "created" => array(
"integer", time()),
722 "anonymize" => array(
"text", $this->getAnonymize()),
723 "show_question_titles" => array(
"text", $this->getShowQuestionTitles()),
724 "mailnotification" => array(
'integer', ($this->getMailNotification()) ? 1 : 0),
725 "mailaddresses" => array(
'text', $this->getMailAddresses()),
726 "mailparticipantdata" => array(
'text', $this->getMailParticipantData()),
727 "tstamp" => array(
"integer", time()),
729 "mode" => array(
"integer", $this->getMode()),
731 "mode_360_self_eval" => array(
"integer", $this->get360SelfEvaluation()),
732 "mode_360_self_rate" => array(
"integer", $this->get360SelfRaters()),
733 "mode_360_self_appr" => array(
"integer", $this->get360SelfAppraisee()),
734 "mode_360_results" => array(
"integer", $this->get360Results()),
736 "mode_skill_service" => array(
"integer", (
int) $this->getSkillService()),
738 "mode_self_eval_results" => array(
"integer", self::RESULTS_SELF_EVAL_OWN),
740 "reminder_status" => array(
"integer", (
int) $this->getReminderStatus()),
741 "reminder_start" => array(
"datetime", $rmd_start),
742 "reminder_end" => array(
"datetime", $rmd_end),
743 "reminder_frequency" => array(
"integer", $this->getReminderFrequency()),
744 "reminder_target" => array(
"integer", $this->getReminderTarget()),
745 "reminder_last_sent" => array(
"datetime", $this->getReminderLastSent()),
746 "reminder_tmpl" => array(
"text", $this->getReminderTemplate(
true)),
747 "tutor_ntf_status" => array(
"integer", (
int) $this->getTutorNotificationStatus()),
748 "tutor_ntf_reci" => array(
"text", implode(
";", $this->getTutorNotificationRecipients())),
749 "tutor_ntf_target" => array(
"integer", $this->getTutorNotificationTarget()),
750 "own_results_view" => array(
"integer", $this->hasViewOwnResults()),
751 "own_results_mail" => array(
"integer", $this->hasMailOwnResults()),
752 "tutor_res_status" => array(
"integer", (
int) $this->getTutorResultsStatus()),
753 "tutor_res_reci" => array(
"text", implode(
";", $this->getTutorResultsRecipients())),
754 "confirmation_mail" => array(
"integer", $this->hasMailConfirmation()),
755 "anon_user_list" => array(
"integer", $this->hasAnonymousUserList()),
756 "calculate_sum_score" => array(
"integer", $this->getCalculateSumScore())
758 $this->setSurveyId($next_id);
760 $affectedRows =
$ilDB->update(
"svy_svy", array(
761 "author" => array(
"text", $this->getAuthor()),
764 "startdate" => array(
"text", $this->getStartDate()),
765 "enddate" => array(
"text", $this->getEndDate()),
766 "evaluation_access" => array(
"text", $this->getEvaluationAccess()),
767 "complete" => array(
"text", $this->isComplete()),
768 "anonymize" => array(
"text", $this->getAnonymize()),
769 "show_question_titles" => array(
"text", $this->getShowQuestionTitles()),
770 "mailnotification" => array(
'integer', ($this->getMailNotification()) ? 1 : 0),
771 "mailaddresses" => array(
'text', $this->getMailAddresses()),
772 "mailparticipantdata" => array(
'text', $this->getMailParticipantData()),
773 "tstamp" => array(
"integer", time()),
775 "mode" => array(
"integer", $this->getMode()),
777 "mode_360_self_eval" => array(
"integer", $this->get360SelfEvaluation()),
778 "mode_360_self_rate" => array(
"integer", $this->get360SelfRaters()),
779 "mode_360_self_appr" => array(
"integer", $this->get360SelfAppraisee()),
780 "mode_360_results" => array(
"integer", $this->get360Results()),
782 "mode_skill_service" => array(
"integer", (
int) $this->getSkillService()),
784 "mode_self_eval_results" => array(
"integer", $this->getSelfEvaluationResults()),
786 "reminder_status" => array(
"integer", $this->getReminderStatus()),
787 "reminder_start" => array(
"datetime", $rmd_start),
788 "reminder_end" => array(
"datetime", $rmd_end),
789 "reminder_frequency" => array(
"integer", $this->getReminderFrequency()),
790 "reminder_target" => array(
"integer", $this->getReminderTarget()),
791 "reminder_last_sent" => array(
"datetime", $this->getReminderLastSent()),
792 "reminder_tmpl" => array(
"text", $this->getReminderTemplate()),
793 "tutor_ntf_status" => array(
"integer", $this->getTutorNotificationStatus()),
794 "tutor_ntf_reci" => array(
"text", implode(
";", $this->getTutorNotificationRecipients())),
795 "tutor_ntf_target" => array(
"integer", $this->getTutorNotificationTarget()),
796 "own_results_view" => array(
"integer", $this->hasViewOwnResults()),
797 "own_results_mail" => array(
"integer", $this->hasMailOwnResults()),
798 "tutor_res_status" => array(
"integer", (
int) $this->getTutorResultsStatus()),
799 "tutor_res_reci" => array(
"text", implode(
";", $this->getTutorResultsRecipients())),
800 "confirmation_mail" => array(
"integer", $this->hasMailConfirmation()),
801 "anon_user_list" => array(
"integer", $this->hasAnonymousUserList()),
802 "calculate_sum_score" => array(
"integer", $this->getCalculateSumScore())
804 "survey_id" => array(
"integer", $this->getSurveyId())
809 $this->saveQuestionsToDb();
817 if (!$this->isActivationLimited()) {
821 $item->setTimingStart($this->getActivationStartDate());
822 $item->setTimingEnd($this->getActivationEndDate());
823 $item->toggleVisible($this->getActivationVisibility());
826 $item->update($this->ref_id);
835 $this->svy_log->debug(
"save questions");
838 $old_questions = array();
839 $result =
$ilDB->queryF(
840 "SELECT survey_question_id,question_fi,sequence" .
841 " FROM svy_svy_qst WHERE survey_fi = %s",
843 array($this->getSurveyId())
845 while ($row =
$ilDB->fetchAssoc($result)) {
846 $old_questions[$row[
"question_fi"]] = $row;
850 $insert = $update = $delete = array();
851 foreach ($this->questions as $seq => $fi) {
852 if (!array_key_exists($fi, $old_questions)) {
854 } elseif ($old_questions[$fi][
"sequence"] != $seq) {
855 $update[$fi] = $old_questions[$fi][
"survey_question_id"];
858 unset($old_questions[$fi]);
862 if (count($old_questions)) {
864 foreach ($old_questions as $fi => $old) {
865 $del_ids[] = $old[
"survey_question_id"];
867 $ilDB->manipulate(
$q =
"DELETE FROM svy_svy_qst" .
868 " WHERE " .
$ilDB->in(
"survey_question_id", $del_ids,
"",
"integer"));
869 $this->svy_log->debug(
"delete: " .
$q);
871 unset($old_questions);
874 foreach ($this->questions as $seq => $fi) {
875 if (in_array($fi, $insert)) {
877 if (!$this->isQuestionInSurvey($fi)) {
878 $next_id =
$ilDB->nextId(
'svy_svy_qst');
880 "INSERT INTO svy_svy_qst" .
881 " (survey_question_id, survey_fi, question_fi, heading, sequence, tstamp)" .
882 " VALUES (%s, %s, %s, %s, %s, %s)",
883 array(
'integer',
'integer',
'integer',
'text',
'integer',
'integer'),
884 array($next_id, $this->getSurveyId(), $fi,
null, $seq, time())
886 $this->svy_log->debug(
"insert svy_svy_qst, id:" . $next_id .
", fi: " . $fi .
", seq:" . $seq);
888 } elseif (array_key_exists($fi, $update)) {
889 $ilDB->manipulate(
"UPDATE svy_svy_qst" .
890 " SET sequence = " .
$ilDB->quote($seq,
"integer") .
891 ", tstamp = " .
$ilDB->quote(time(),
"integer") .
892 " WHERE survey_question_id = " .
$ilDB->quote($update[$fi],
"integer"));
893 $this->svy_log->debug(
"update svy_svy_qst, id:" . $update[$fi] .
", fi: " . $fi .
", seq:" . $seq);
900 string $questiontype,
911 if ($question_id < 1) {
914 $result =
$ilDB->queryF(
915 "SELECT type_tag FROM svy_question, svy_qtype WHERE svy_question.question_id = %s AND " .
916 "svy_question.questiontype_fi = svy_qtype.questiontype_id",
920 if ($result->numRows() === 1) {
922 return $data[
"type_tag"];
930 return $this->survey_id;
938 switch ($a_anonymize) {
939 case self::ANONYMIZE_OFF:
940 case self::ANONYMIZE_ON:
941 case self::ANONYMIZE_FREEACCESS:
942 case self::ANONYMIZE_CODE_ALL:
943 $this->anonymize = $a_anonymize;
946 $this->anonymize = self::ANONYMIZE_OFF;
953 return $this->anonymize;
959 $this->calculate_sum_score = $a_val;
964 return $this->calculate_sum_score;
970 return ($this->getAnonymize() === self::ANONYMIZE_OFF ||
971 $this->getAnonymize() === self::ANONYMIZE_FREEACCESS);
977 return ($this->getAnonymize() === self::ANONYMIZE_ON ||
978 $this->getAnonymize() === self::ANONYMIZE_FREEACCESS);
984 $result =
$ilDB->queryF(
985 "SELECT * FROM svy_svy WHERE obj_fi = %s",
987 array($this->
getId())
989 if ($result->numRows() === 1) {
991 $this->setSurveyId(
$data[
"survey_id"]);
992 $this->setAuthor(
$data[
"author"] ??
"");
994 if (
$data[
"outro"] ===
"survey_finished") {
995 $this->setOutro($this->
lng->txt(
"survey_finished"));
999 $this->setShowQuestionTitles((
bool)
$data[
"show_question_titles"]);
1000 $this->setStartDate((
string) (
$data[
"startdate"] ??
""));
1001 $this->setEndDate((
string) (
$data[
"enddate"] ??
""));
1002 $this->setAnonymize((
int)
$data[
"anonymize"]);
1003 $this->setEvaluationAccess(
$data[
"evaluation_access"] ??
"");
1004 $this->loadQuestionsFromDb();
1005 $this->setMailNotification((
bool)
$data[
'mailnotification']);
1006 $this->setMailAddresses((
string)
$data[
'mailaddresses']);
1007 $this->setMailParticipantData((
string)
$data[
'mailparticipantdata']);
1008 $this->setPoolUsage((
bool)
$data[
'pool_usage']);
1010 $this->setMode(
$data[
'mode']);
1012 $this->set360SelfEvaluation((
bool)
$data[
'mode_360_self_eval']);
1013 $this->set360SelfRaters((
bool)
$data[
'mode_360_self_rate']);
1014 $this->set360SelfAppraisee((
bool)
$data[
'mode_360_self_appr']);
1015 $this->set360Results((
int)
$data[
'mode_360_results']);
1017 $this->setSelfEvaluationResults((
int)
$data[
'mode_self_eval_results']);
1019 $this->setSkillService((
bool)
$data[
'mode_skill_service']);
1021 $this->setReminderStatus((
bool)
$data[
"reminder_status"]);
1024 $this->setReminderFrequency((
int)
$data[
"reminder_frequency"]);
1025 $this->setReminderTarget((
int)
$data[
"reminder_target"]);
1026 $this->setReminderLastSent((
string)
$data[
"reminder_last_sent"]);
1027 $this->setReminderTemplate((
int)
$data[
"reminder_tmpl"]);
1028 $this->setTutorNotificationStatus(
$data[
"tutor_ntf_status"]);
1029 $this->setTutorNotificationRecipients(explode(
";",
$data[
"tutor_ntf_reci"] ??
""));
1030 $this->setTutorNotificationTarget(
$data[
"tutor_ntf_target"]);
1031 $this->setTutorResultsStatus((
bool)
$data[
"tutor_res_status"]);
1032 $this->setTutorResultsRecipients(explode(
";",
$data[
"tutor_res_reci"] ??
""));
1034 $this->setMailOwnResults((
bool)
$data[
"own_results_mail"]);
1035 $this->setMailConfirmation((
bool)
$data[
"confirmation_mail"]);
1036 $this->setCalculateSumScore((
bool)
$data[
"calculate_sum_score"]);
1038 $this->setAnonymousUserList((
bool)
$data[
"anon_user_list"]);
1042 if (isset($this->ref_id) && $this->ref_id !== 0) {
1044 switch ($activation[
"timing_type"]) {
1046 $this->setActivationLimited(
true);
1047 $this->setActivationStartDate($activation[
"timing_start"]);
1048 $this->setActivationEndDate($activation[
"timing_end"]);
1049 $this->setActivationVisibility($activation[
"visible"]);
1053 $this->setActivationLimited(
false);
1062 $this->questions = array();
1063 $result =
$ilDB->queryF(
1064 "SELECT * FROM svy_svy_qst WHERE survey_fi = %s ORDER BY sequence",
1066 array($this->getSurveyId())
1069 $this->questions[
$data[
"sequence"]] =
$data[
"question_fi"];
1081 $result =
$ilDB->queryF(
1082 "SELECT * FROM svy_svy_qst WHERE survey_fi = %s ORDER BY sequence",
1084 array($this->getSurveyId())
1089 $to_delete_ids = array();
1091 if (in_array(
$data[
"question_fi"], $fis)) {
1092 $to_delete_ids[] =
$data[
"survey_question_id"];
1094 $fis[] =
$data[
"question_fi"];
1099 if (count($to_delete_ids) > 0) {
1100 $ilDB->manipulate(
$q =
"DELETE FROM svy_svy_qst" .
1101 " WHERE " .
$ilDB->in(
"survey_question_id", $to_delete_ids,
false,
"integer") .
1102 " AND survey_fi = " .
$ilDB->quote($this->getSurveyId(),
"integer"));
1103 $this->svy_log->debug(
"delete: " .
$q);
1105 $ilDB->manipulate(
$q =
"DELETE FROM svy_qblk_qst " .
1106 " WHERE " .
$ilDB->in(
"question_fi", $fis,
true,
"integer") .
1107 " AND survey_fi = " .
$ilDB->quote($this->getSurveyId(),
"integer"));
1108 $this->svy_log->debug(
"delete: " .
$q);
1112 $set =
$ilDB->query(
"SELECT * FROM svy_svy_qst " .
1113 " WHERE survey_fi = " .
$ilDB->quote($this->getSurveyId(),
"integer") .
" ORDER BY sequence");
1115 while ($rec =
$ilDB->fetchAssoc($set)) {
1117 $q =
"UPDATE svy_svy_qst SET " .
1118 " sequence = " .
$ilDB->quote($seq++,
"integer") .
1119 " WHERE survey_question_id = " .
$ilDB->quote($rec[
"survey_question_id"],
"integer")
1121 $this->svy_log->debug(
"update: " .
$q);
1128 $this->author = $author;
1137 string $a_author =
""
1139 if ($a_author ===
'') {
1140 $ilUser = $this->user;
1141 $a_author = $ilUser->getFullname();
1143 $this->domain->metadata()->saveAuthorsInLOMIfNoLifecycleSet(
1154 return $this->domain->metadata()->getAuthorsFromLOM(
1163 return (
bool) $this->display_question_titles;
1168 $this->display_question_titles = $a_show;
1172 string $introduction =
""
1174 $this->introduction = $introduction;
1180 $this->outro = $outro;
1185 return $this->start_date;
1192 string $start_date =
""
1194 $this->start_date = $start_date;
1211 if (preg_match(
"/(\d{4})-(\d{2})-(\d{2})/", $start_date, $matches)) {
1216 if (preg_match(
"/(\d{2}):(\d{2}):(\d{2})/", $start_time, $matches)) {
1221 $this->start_date = sprintf(
'%04d%02d%02d%02d%02d%02d', $y, $m,
$d, $h, $i, $s);
1226 return $this->end_date;
1233 string $end_date =
""
1235 $this->end_date = $end_date;
1240 $start = $this->getStartDate();
1250 $end = $this->getEndDate();
1272 if (preg_match(
"/(\d{4})-(\d{2})-(\d{2})/", $end_date, $matches)) {
1277 if (preg_match(
"/(\d{2}):(\d{2}):(\d{2})/", $end_time, $matches)) {
1282 $this->end_date = sprintf(
'%04d%02d%02d%02d%02d%02d', $y, $m,
$d, $h, $i, $s);
1288 return $this->evaluation_access;
1292 string $evaluation_access = self::EVALUATION_ACCESS_OFF
1294 $this->evaluation_access = $evaluation_access;
1300 $this->activation_visibility = $a_value;
1305 return $this->activation_visibility;
1310 return $this->activation_limited;
1315 $this->activation_limited = $a_value;
1320 return $this->introduction;
1325 return $this->outro;
1335 $existing_questions = array();
1336 $result =
$ilDB->queryF(
1337 "SELECT svy_question.original_id FROM svy_question, svy_svy_qst WHERE " .
1338 "svy_svy_qst.survey_fi = %s AND svy_svy_qst.question_fi = svy_question.question_id",
1340 array($this->getSurveyId())
1343 if (
$data[
"original_id"]) {
1344 $existing_questions[] = (
int)
$data[
"original_id"];
1347 return $existing_questions;
1355 bool $could_be_offline =
false,
1356 bool $showPath =
false
1369 array $move_questions,
1373 $array_pos = array_search($target_index, $this->questions);
1374 $part1 = $part2 = [];
1375 if ($insert_mode === 0) {
1376 $part1 = array_slice($this->questions, 0, $array_pos);
1377 $part2 = array_slice($this->questions, $array_pos);
1378 } elseif ($insert_mode === 1) {
1379 $part1 = array_slice($this->questions, 0, $array_pos + 1);
1380 $part2 = array_slice($this->questions, $array_pos + 1);
1383 foreach ($move_questions as $question_id) {
1384 if (!(!in_array($question_id, $part1))) {
1385 unset($part1[array_search($question_id, $part1)]);
1388 if (!(!in_array($question_id, $part2))) {
1389 unset($part2[array_search($question_id, $part2)]);
1394 if ($found !== count($move_questions)) {
1397 $part1 = array_values($part1);
1398 $part2 = array_values($part2);
1399 $this->questions = array_values(array_merge($part1, $move_questions, $part2));
1400 foreach ($move_questions as $question_id) {
1401 $constraints = $this->getConstraints($question_id);
1402 foreach ($constraints as $idx => $constraint) {
1403 foreach ($part2 as $next_question_id) {
1404 if ($constraint[
"question"] == $next_question_id) {
1406 $this->deleteConstraint($constraint[
"id"]);
1411 $this->saveQuestionsToDb();
1420 $question = self::_instanciateQuestion($question_id);
1421 #20610 if no question found, do nothing.
1423 $question->delete($question_id);
1424 $this->removeConstraintsConcerningQuestion($question_id);
1436 $result =
$ilDB->queryF(
1437 "SELECT constraint_fi FROM svy_qst_constraint WHERE question_fi = %s AND survey_fi = %s",
1438 array(
'integer',
'integer'),
1439 array($question_id, $this->getSurveyId())
1441 if ($result->numRows() > 0) {
1442 $remove_constraints = array();
1443 while ($row =
$ilDB->fetchAssoc($result)) {
1444 $remove_constraints[] = $row[
"constraint_fi"];
1446 $affectedRows =
$ilDB->manipulateF(
1447 "DELETE FROM svy_qst_constraint WHERE question_fi = %s AND survey_fi = %s",
1448 array(
'integer',
'integer'),
1449 array($question_id, $this->getSurveyId())
1451 foreach ($remove_constraints as $key => $constraint_id) {
1452 $affectedRows =
$ilDB->manipulateF(
1453 "DELETE FROM svy_constraint WHERE constraint_id = %s",
1455 array($constraint_id)
1467 array $remove_questions,
1468 array $remove_questionblocks
1472 $block_sizes = array();
1473 foreach ($this->getSurveyQuestions() as $question_id =>
$data) {
1474 if (in_array($question_id, $remove_questions) or in_array(
$data[
"questionblock_id"], $remove_questionblocks)) {
1475 unset($this->questions[array_search($question_id, $this->questions)]);
1476 $this->removeQuestion($question_id);
1477 } elseif (
$data[
"questionblock_id"]) {
1478 $block_sizes[
$data[
"questionblock_id"]] = ($block_sizes[
$data[
"questionblock_id"]] ?? 0) + 1;
1483 foreach ($block_sizes as $block_id => $size) {
1485 $remove_questionblocks[] = $block_id;
1489 foreach (array_unique($remove_questionblocks) as $questionblock_id) {
1490 $affectedRows =
$ilDB->manipulateF(
1491 "DELETE FROM svy_qblk WHERE questionblock_id = %s",
1493 array($questionblock_id)
1495 $affectedRows =
$ilDB->manipulateF(
1496 "DELETE FROM svy_qblk_qst WHERE questionblock_fi = %s AND survey_fi = %s",
1497 array(
'integer',
'integer'),
1498 array($questionblock_id, $this->getSurveyId())
1502 $this->questions = array_values($this->questions);
1503 $this->saveQuestionsToDb();
1511 array $questionblocks
1514 foreach ($questionblocks as $index) {
1515 $affectedRows =
$ilDB->manipulateF(
1516 "DELETE FROM svy_qblk WHERE questionblock_id = %s",
1520 $affectedRows =
$ilDB->manipulateF(
1521 "DELETE FROM svy_qblk_qst WHERE questionblock_fi = %s AND survey_fi = %s",
1522 array(
'integer',
'integer'),
1523 array($index, $this->getSurveyId())
1533 int $questionblock_id
1538 "DELETE FROM svy_qblk_qst WHERE questionblock_fi = %s AND survey_fi = %s AND question_fi = %s",
1539 array(
'integer',
'integer',
'integer'),
1540 array($questionblock_id, $this->getSurveyId(), $question_id)
1549 int $questionblock_id
1554 if (!$this->isQuestionInAnyBlock($question_id)) {
1555 $next_id =
$ilDB->nextId(
'svy_qblk_qst');
1556 $affectedRows =
$ilDB->manipulateF(
1557 "INSERT INTO svy_qblk_qst (qblk_qst_id, survey_fi, questionblock_fi, " .
1558 "question_fi) VALUES (%s, %s, %s, %s)",
1559 array(
'integer',
'integer',
'integer',
'integer'),
1560 array($next_id, $this->getSurveyId(), $questionblock_id, $question_id)
1563 $this->deleteConstraints($question_id);
1577 $set =
$ilDB->query(
"SELECT * FROM svy_qblk_qst " .
1578 " WHERE survey_fi = " .
$ilDB->quote($this->getSurveyId(),
"integer") .
1579 " AND question_fi = " .
$ilDB->quote($a_question_fi,
"integer"));
1580 if ($rec =
$ilDB->fetchAssoc($set)) {
1593 int $questionblock_id
1597 $result =
$ilDB->queryF(
1598 "SELECT svy_question.title, svy_qblk_qst.question_fi, svy_qblk_qst.survey_fi FROM " .
1599 "svy_qblk, svy_qblk_qst, svy_question WHERE svy_qblk.questionblock_id = svy_qblk_qst.questionblock_fi AND " .
1600 "svy_question.question_id = svy_qblk_qst.question_fi AND svy_qblk.questionblock_id = %s",
1602 array($questionblock_id)
1605 while ($row =
$ilDB->fetchAssoc($result)) {
1606 $titles[$row[
"question_fi"]] = $row[
"title"];
1607 $survey_id = $row[
"survey_fi"];
1609 $result =
$ilDB->queryF(
1610 "SELECT question_fi, sequence FROM svy_svy_qst WHERE survey_fi = %s ORDER BY sequence",
1614 $resultarray = array();
1616 while ($row =
$ilDB->fetchAssoc($result)) {
1617 if (array_key_exists($row[
"question_fi"], $titles)) {
1618 $resultarray[
$counter++] = $titles[$row[
"question_fi"]];
1621 return $resultarray;
1630 int $questionblock_id
1635 $result =
$ilDB->queryF(
1636 "SELECT a.question_fi FROM svy_qblk_qst a JOIN svy_svy_qst b ON (a.question_fi = b.question_fi) " .
1637 " WHERE a.questionblock_fi = %s ORDER BY b.sequence",
1639 array($questionblock_id)
1642 if ($result->numRows()) {
1644 if (!in_array(
$data[
'question_fi'], $ids)) {
1645 $ids[] = (
int)
$data[
'question_fi'];
1657 int $questionblock_id
1662 $result =
$ilDB->queryF(
1663 "SELECT * FROM svy_qblk WHERE questionblock_id = %s",
1665 array($questionblock_id)
1667 $row =
$ilDB->fetchAssoc($result);
1677 bool $show_questiontext =
true,
1678 bool $show_blocktitle =
false,
1679 bool $compress_view =
false
1684 $next_id =
$ilDB->nextId(
'svy_qblk');
1686 "INSERT INTO svy_qblk (questionblock_id, title, show_questiontext," .
1687 " show_blocktitle, owner_fi, tstamp, compress_view) " .
1688 "VALUES (%s, %s, %s, %s, %s, %s, %s)",
1689 array(
'integer',
'text',
'integer',
'integer',
'integer',
'integer',
'integer'),
1690 array($next_id, $title, $show_questiontext, $show_blocktitle, $owner, time(),$compress_view)
1700 bool $show_questiontext,
1701 bool $show_blocktitle,
1703 bool $compress_view =
false
1709 $this->moveQuestions($questions, $questions[0], 0);
1712 $ilUser = $this->user;
1713 $next_id =
$ilDB->nextId(
'svy_qblk');
1714 $affectedRows =
$ilDB->manipulateF(
1715 "INSERT INTO svy_qblk (questionblock_id, title, show_questiontext," .
1716 " show_blocktitle, owner_fi, tstamp, compress_view) VALUES (%s, %s, %s, %s, %s, %s, %s)",
1717 array(
'integer',
'text',
'text',
'text',
'integer',
'integer',
'integer'),
1718 array($next_id, $title, $show_questiontext, $show_blocktitle, $ilUser->getId(), time(), $compress_view)
1720 if ($affectedRows) {
1721 $questionblock_id = $next_id;
1722 foreach ($questions as $index) {
1723 if (!$this->isQuestionInAnyBlock($index)) {
1724 $next_id =
$ilDB->nextId(
'svy_qblk_qst');
1725 $affectedRows =
$ilDB->manipulateF(
1726 "INSERT INTO svy_qblk_qst (qblk_qst_id, survey_fi, questionblock_fi, " .
1727 "question_fi) VALUES (%s, %s, %s, %s)",
1728 array(
'integer',
'integer',
'integer',
'integer'),
1729 array($next_id, $this->getSurveyId(), $questionblock_id, $index)
1731 $this->deleteConstraints($index);
1741 int $questionblock_id,
1743 bool $show_questiontext,
1744 bool $show_blocktitle,
1745 bool $compress_view =
false
1749 "UPDATE svy_qblk SET title = %s, show_questiontext = %s," .
1750 " show_blocktitle = %s, compress_view = %s WHERE questionblock_id = %s",
1751 array(
'text',
'text',
'text',
'integer',
'integer'),
1752 array($title, $show_questiontext, $show_blocktitle, $compress_view, $questionblock_id)
1764 $result =
$ilDB->queryF(
1765 "SELECT constraint_fi FROM svy_qst_constraint WHERE question_fi = %s AND survey_fi = %s",
1766 array(
'integer',
'integer'),
1767 array($question_id, $this->getSurveyId())
1769 $constraints = array();
1770 while ($row =
$ilDB->fetchAssoc($result)) {
1771 $constraints[] = $row[
"constraint_fi"];
1773 foreach ($constraints as $constraint_id) {
1774 $this->deleteConstraint($constraint_id);
1786 $affectedRows =
$ilDB->manipulateF(
1787 "DELETE FROM svy_constraint WHERE constraint_id = %s",
1789 array($constraint_id)
1791 $affectedRows =
$ilDB->manipulateF(
1792 "DELETE FROM svy_qst_constraint WHERE constraint_fi = %s",
1794 array($constraint_id)
1803 bool $with_answers =
false
1807 $all_questions = array();
1808 $result =
$ilDB->queryF(
1809 "SELECT svy_qtype.type_tag, svy_qtype.plugin, svy_question.question_id, " .
1810 "svy_svy_qst.heading FROM svy_qtype, svy_question, svy_svy_qst WHERE svy_svy_qst.survey_fi = %s AND " .
1811 "svy_svy_qst.question_fi = svy_question.question_id AND svy_question.questiontype_fi = svy_qtype.questiontype_id " .
1812 "ORDER BY svy_svy_qst.sequence",
1814 array($this->getSurveyId())
1816 while ($row =
$ilDB->fetchAssoc($result)) {
1818 if ($row[
"plugin"]) {
1822 $question = self::_instanciateQuestion($row[
"question_id"]);
1823 $questionrow = $question->getQuestionDataArray($row[
"question_id"]);
1824 foreach ($row as $key => $value) {
1825 $questionrow[$key] = $value;
1827 $all_questions[$row[
"question_id"]] = $questionrow;
1828 $all_questions[$row[
"question_id"]][
"usableForPrecondition"] = $question->usableForPrecondition();
1829 $all_questions[$row[
"question_id"]][
"availableRelations"] = $question->getAvailableRelations();
1833 $questionblocks = array();
1834 if (count($all_questions)) {
1835 $result =
$ilDB->queryF(
1836 "SELECT svy_qblk.*, svy_qblk_qst.question_fi FROM svy_qblk, svy_qblk_qst WHERE " .
1837 "svy_qblk.questionblock_id = svy_qblk_qst.questionblock_fi AND svy_qblk_qst.survey_fi = %s " .
1838 "AND " .
$ilDB->in(
'svy_qblk_qst.question_fi', array_keys($all_questions),
false,
'integer'),
1840 array($this->getSurveyId())
1842 while ($row =
$ilDB->fetchAssoc($result)) {
1843 $questionblocks[$row[
'question_fi']] = $row;
1847 foreach ($all_questions as $question_id => $row) {
1848 $constraints = $this->getConstraints($question_id);
1849 if (isset($questionblocks[$question_id])) {
1850 $all_questions[$question_id][
"questionblock_title"] = $questionblocks[$question_id][
'title'];
1851 $all_questions[$question_id][
"questionblock_id"] = $questionblocks[$question_id][
'questionblock_id'];
1853 $all_questions[$question_id][
"questionblock_title"] =
"";
1854 $all_questions[$question_id][
"questionblock_id"] =
"";
1856 $all_questions[$question_id][
"constraints"] = $constraints;
1857 if ($with_answers) {
1859 $result =
$ilDB->queryF(
1860 "SELECT svy_variable.*, svy_category.title FROM svy_variable, svy_category " .
1861 "WHERE svy_variable.question_fi = %s AND svy_variable.category_fi = svy_category.category_id " .
1862 "ORDER BY sequence ASC",
1866 if ($result->numRows() > 0) {
1868 $answers[] =
$data[
"title"];
1871 $all_questions[$question_id][
"answers"] = $answers;
1874 return $all_questions;
1883 array $obligatory_questions
1886 $result =
$ilDB->queryF(
1887 "SELECT * FROM svy_svy_qst WHERE survey_fi = %s",
1889 array($this->getSurveyId())
1891 if ($result->numRows()) {
1892 while ($row =
$ilDB->fetchAssoc($result)) {
1893 if (!array_key_exists($row[
"question_fi"], $obligatory_questions)) {
1894 $obligatory_questions[$row[
"question_fi"]] = 0;
1899 foreach ($obligatory_questions as $question_fi => $obligatory) {
1901 $ilDB->manipulate(
"UPDATE svy_question" .
1902 " SET obligatory = " .
$ilDB->quote($obligatory,
"integer") .
1903 " WHERE question_id = " .
$ilDB->quote($question_fi,
"integer"));
1915 $all_questions = array();
1916 $result =
$ilDB->queryF(
1917 "SELECT svy_question.*, svy_qtype.type_tag, svy_svy_qst.heading FROM " .
1918 "svy_question, svy_qtype, svy_svy_qst WHERE svy_svy_qst.survey_fi = %s AND " .
1919 "svy_svy_qst.question_fi = svy_question.question_id AND svy_question.questiontype_fi = svy_qtype.questiontype_id " .
1920 "ORDER BY svy_svy_qst.sequence",
1922 array($this->getSurveyId())
1924 while ($row =
$ilDB->fetchAssoc($result)) {
1925 $all_questions[$row[
"question_id"]] = $row;
1928 $questionblocks = array();
1929 if (count($all_questions)) {
1930 $result =
$ilDB->queryF(
1931 "SELECT svy_qblk.*, svy_qblk_qst.question_fi FROM svy_qblk, svy_qblk_qst " .
1932 "WHERE svy_qblk.questionblock_id = svy_qblk_qst.questionblock_fi AND svy_qblk_qst.survey_fi = %s " .
1933 "AND " .
$ilDB->in(
'svy_qblk_qst.question_fi', array_keys($all_questions),
false,
'integer'),
1935 array($this->getSurveyId())
1937 while ($row =
$ilDB->fetchAssoc($result)) {
1938 $questionblocks[$row[
'question_fi']] = $row;
1942 $all_pages = array();
1945 foreach ($all_questions as $question_id => $row) {
1946 $constraints = array();
1947 if (isset($questionblocks[$question_id])) {
1948 if (!$currentblock or ($currentblock != $questionblocks[$question_id][
'questionblock_id'])) {
1951 $all_questions[$question_id][
'page'] = $pageindex;
1952 $all_questions[$question_id][
"questionblock_title"] = $questionblocks[$question_id][
'title'];
1953 $all_questions[$question_id][
"questionblock_id"] = $questionblocks[$question_id][
'questionblock_id'];
1954 $all_questions[$question_id][
"questionblock_show_questiontext"] = $questionblocks[$question_id][
'show_questiontext'];
1955 $all_questions[$question_id][
"questionblock_show_blocktitle"] = $questionblocks[$question_id][
'show_blocktitle'];
1956 $all_questions[$question_id][
"questionblock_compress_view"] = $questionblocks[$question_id][
'compress_view'];
1957 $currentblock = $questionblocks[$question_id][
'questionblock_id'];
1960 $all_questions[$question_id][
'page'] = $pageindex;
1961 $all_questions[$question_id][
"questionblock_title"] =
"";
1962 $all_questions[$question_id][
"questionblock_id"] =
"";
1963 $all_questions[$question_id][
"questionblock_show_questiontext"] = 1;
1964 $all_questions[$question_id][
"questionblock_show_blocktitle"] = 1;
1965 $all_questions[$question_id][
"questionblock_compress_view"] =
false;
1968 $constraints = $this->getConstraints($question_id);
1969 $all_questions[$question_id][
"constraints"] = $constraints;
1970 if (!isset($all_pages[$pageindex])) {
1971 $all_pages[$pageindex] = array();
1973 $all_pages[$pageindex][] = $all_questions[$question_id];
1976 $max = count($all_pages);
1978 foreach ($all_pages as $index => $block) {
1979 foreach ($block as $blockindex => $question) {
1980 $all_pages[$index][$blockindex][
"position"] =
$counter / $max;
1997 int $active_page_question_id,
2001 $pages = $this->getSurveyPages();
2002 if ($active_page_question_id === 0) {
2005 foreach ($pages as $key => $question_array) {
2006 foreach ($question_array as $question) {
2007 if ($active_page_question_id == $question[
"question_id"]) {
2012 if ($foundpage === -1) {
2015 $foundpage += $direction;
2016 if ($foundpage < 0) {
2019 if ($foundpage >= count($pages)) {
2022 return $pages[$foundpage];
2030 bool $use_obj_id =
false,
2031 bool $could_be_offline =
false,
2032 bool $showPath =
false,
2033 string $permission =
"read"
2047 $result =
$ilDB->queryF(
2048 "SELECT svy_constraint.*, svy_relation.*, svy_qst_constraint.question_fi ref_question_fi FROM svy_qst_constraint, svy_constraint, " .
2049 "svy_relation WHERE svy_constraint.relation_fi = svy_relation.relation_id AND " .
2050 "svy_qst_constraint.constraint_fi = svy_constraint.constraint_id AND svy_constraint.constraint_id = %s",
2052 array($constraint_id)
2055 if ($result->numRows()) {
2056 $pc =
$ilDB->fetchAssoc($result);
2070 $result_array = array();
2071 $result =
$ilDB->queryF(
2072 "SELECT svy_constraint.*, svy_relation.* FROM svy_qst_constraint, svy_constraint, svy_relation " .
2073 "WHERE svy_constraint.relation_fi = svy_relation.relation_id AND " .
2074 "svy_qst_constraint.constraint_fi = svy_constraint.constraint_id AND svy_qst_constraint.question_fi = %s " .
2075 "AND svy_qst_constraint.survey_fi = %s",
2076 array(
'integer',
'integer'),
2077 array($question_id, $this->getSurveyId())
2079 while ($row =
$ilDB->fetchAssoc($result)) {
2082 $question =
new $question_type();
2083 $question->loadFromDb($row[
"question_fi"]);
2084 $valueoutput = $question->getPreconditionValueOutput($row[
"value"]);
2085 $result_array[] = array(
"id" => $row[
"constraint_id"],
2086 "question" => $row[
"question_fi"],
2087 "short" => $row[
"shortname"],
2088 "long" => $row[
"longname"],
2089 "value" => $row[
"value"],
2090 "conjunction" => $row[
"conjunction"],
2091 "valueoutput" => $valueoutput
2094 return $result_array;
2106 $result_array = array();
2107 $result =
$ilDB->queryF(
2108 "SELECT svy_qst_constraint.question_fi as for_question, svy_constraint.*, svy_relation.* " .
2109 "FROM svy_qst_constraint, svy_constraint, svy_relation WHERE svy_constraint.relation_fi = svy_relation.relation_id " .
2110 "AND svy_qst_constraint.constraint_fi = svy_constraint.constraint_id AND svy_qst_constraint.survey_fi = %s",
2114 while ($row =
$ilDB->fetchAssoc($result)) {
2115 $result_array[] = array(
"id" => $row[
"constraint_id"],
2116 "for_question" => $row[
"for_question"],
2117 "question" => $row[
"question_fi"],
2118 "short" => $row[
"shortname"],
2119 "long" => $row[
"longname"],
2120 "relation_id" => $row[
"relation_id"],
2121 "value" => $row[
"value"],
2122 'conjunction' => $row[
'conjunction']
2125 return $result_array;
2138 $result_array = array();
2139 $result =
$ilDB->queryF(
2140 "SELECT svy_variable.*, svy_category.title FROM svy_variable LEFT JOIN " .
2141 "svy_category ON svy_variable.category_fi = svy_category.category_id WHERE svy_variable.question_fi = %s " .
2142 "ORDER BY svy_variable.sequence",
2146 while ($row =
$ilDB->fetchObject($result)) {
2147 $result_array[$row->sequence] = $row;
2149 return $result_array;
2162 int $if_question_id,
2169 $next_id =
$ilDB->nextId(
'svy_constraint');
2170 $affectedRows =
$ilDB->manipulateF(
2171 "INSERT INTO svy_constraint (constraint_id, question_fi, relation_fi, value, conjunction) VALUES " .
2172 "(%s, %s, %s, %s, %s)",
2173 array(
'integer',
'integer',
'integer',
'float',
'integer'),
2174 array($next_id, $if_question_id,
$relation, $value, $conjunction)
2176 if ($affectedRows) {
2188 int $to_question_id,
2193 $next_id =
$ilDB->nextId(
'svy_qst_constraint');
2195 "INSERT INTO svy_qst_constraint (question_constraint_id, survey_fi, question_fi, " .
2196 "constraint_fi) VALUES (%s, %s, %s, %s)",
2197 array(
'integer',
'integer',
'integer',
'integer'),
2198 array($next_id, $this->getSurveyId(), $to_question_id, $constraint_id)
2206 int $precondition_id,
2207 int $if_question_id,
2214 "UPDATE svy_constraint SET question_fi = %s, relation_fi = %s, value = %s, conjunction = %s " .
2215 "WHERE constraint_id = %s",
2216 array(
'integer',
'integer',
'float',
'integer',
'integer'),
2217 array($if_question_id,
$relation, $value, $conjunction, $precondition_id)
2229 foreach ($questions as $question_id) {
2231 "UPDATE svy_constraint SET conjunction = %s " .
2232 "WHERE constraint_id IN (SELECT constraint_fi FROM svy_qst_constraint WHERE svy_qst_constraint.question_fi = %s)",
2233 array(
'integer',
'integer'),
2234 array($conjunction, $question_id)
2243 bool $short_as_key =
false
2248 $custom_order = array(
"equal",
"not_equal",
"less",
"less_or_equal",
"more",
"more_or_equal");
2249 $custom_order = array_flip($custom_order);
2251 $result_array = array();
2252 $result =
$ilDB->query(
"SELECT * FROM svy_relation");
2253 while ($row =
$ilDB->fetchAssoc($result)) {
2254 if ($short_as_key) {
2255 $result_array[$row[
"shortname"]] = array(
"short" => $row[
"shortname"],
"long" => $row[
"longname"],
"id" => $row[
"relation_id"],
"order" => $custom_order[$row[
"longname"]]);
2257 $result_array[$row[
"relation_id"]] = array(
"short" => $row[
"shortname"],
"long" => $row[
"longname"],
"order" => $custom_order[$row[
"longname"]]);
2262 foreach ($result_array as $idx => $item) {
2263 unset($result_array[$idx][
"order"]);
2266 return $result_array;
2282 $affectedRows =
$ilDB->manipulateF(
2283 "DELETE FROM svy_answer WHERE question_fi = %s AND active_fi = %s",
2284 array(
'integer',
'integer'),
2285 array($question_id, $active_id)
2298 $result_array = array();
2299 $result =
$ilDB->queryF(
2300 "SELECT * FROM svy_answer WHERE question_fi = %s AND active_fi = %s",
2301 array(
'integer',
'integer'),
2302 array($question_id, $active_id)
2304 if ($result->numRows() >= 1) {
2305 while ($row =
$ilDB->fetchAssoc($result)) {
2306 $result_array[] = $row;
2309 return $result_array;
2323 "UPDATE svy_finished SET state = %s, tstamp = %s" .
2324 " WHERE survey_fi = %s AND finished_id = %s",
2325 array(
'text',
'integer',
'integer',
'integer'),
2326 array(1, time(), $this->getSurveyId(), $finished_id)
2330 if ($this->getMode() === self::MODE_SELF_EVAL) {
2331 $user = $this->getUserDataFromActiveId($finished_id);
2333 $sskill->writeAndAddSelfEvalSkills($user[
'usr_id']);
2337 if ($this->getMode() === self::MODE_IND_FEEDB) {
2341 $raters = $this->getRatersData($appr_id);
2342 $run_manager = $this->survey_service
2345 ->run($this, $this->
user->getId(), $appr_id);
2346 $run = $run_manager->getById($finished_id);
2349 $rater_id = $run->getUserId();
2351 foreach ($raters as
$id => $rater) {
2352 if (($rater[
"code"] ??
"") === $run->getCode()) {
2359 $sskill->writeAndAddIndFeedbackSkills($finished_id, $appr_id, $rater_id);
2362 $this->checkTutorNotification();
2378 "UPDATE svy_finished SET lastpage = %s WHERE finished_id = %s",
2379 array(
'integer',
'integer'),
2380 array(($page_id) ?: 0, $finished_id)
2392 string $a_anonymize_id,
2396 $placeholders = array(
2397 "FIRST_NAME" =>
"firstname",
2398 "LAST_NAME" =>
"lastname",
2401 "firstname" =>
"firstname"
2406 $recipients = explode(
",", $this->mailaddresses ??
"");
2407 foreach ($recipients as $recipient) {
2410 $ntf->setLangModules(array(
"survey"));
2411 $ntf->setRefId($this->getRefId());
2412 $ntf->setSubjectLangId(
'finished_mail_subject');
2414 $messagetext = $this->mailparticipantdata;
2416 if (trim($messagetext ??
"")) {
2417 if (!$this->hasAnonymizedResults()) {
2421 foreach ($placeholders as $key => $mapping) {
2422 if ($this->hasAnonymizedResults()) {
2423 $messagetext = str_replace(
'[' . $key .
']',
'', $messagetext);
2425 $messagetext = str_replace(
'[' . $key .
']', trim(
$data[$mapping] ??
""), $messagetext);
2428 $ntf->setIntroductionDirect($messagetext);
2430 $ntf->setIntroductionLangId(
'survey_notification_finished_introduction');
2435 $ntf->addAdditionalInfo(
2436 'survey_360_appraisee',
2441 $active_id = $this->getActiveID($a_user_id, $a_anonymize_id, $a_appr_id);
2443 $ntf->addAdditionalInfo(
2445 $this->getParticipantTextResults($active_id),
2450 $ntf->setGotoLangId(
'survey_notification_tutor_link');
2451 $ntf->setReasonLangId(
'survey_notification_finished_reason');
2453 $recipient = trim($recipient ??
"");
2456 $ntf->sendMailAndReturnRecipients([
$user_id]);
2459 if (count($user_ids) > 0) {
2460 $ntf->sendMailAndReturnRecipients([current($user_ids)]);
2489 $userResults = $this->getUserSpecificResults(array($active_id));
2490 $questions = $this->getSurveyQuestions(
true);
2491 $questioncounter = 1;
2492 foreach ($questions as $question_id => $question_data) {
2493 $textresult .= $questioncounter++ .
". " . $question_data[
"title"] .
"\n";
2494 $found = $userResults[$question_id][$active_id];
2496 if (is_array($found)) {
2497 $text = implode(
"\n", $found);
2502 $text = self::getSurveySkippedValue();
2504 $text = str_replace(
"<br />",
"\n", $text);
2505 $textresult .= $text .
"\n\n";
2516 string $anonymize_id,
2521 if ($anonymize_id) {
2522 $result =
$ilDB->queryF(
2523 "SELECT finished_id FROM svy_finished" .
2524 " WHERE survey_fi = %s AND anonymous_id = %s AND appr_id = %s",
2525 array(
'integer',
'text',
'integer'),
2526 array($this->getSurveyId(), $anonymize_id, $appr_id)
2532 $result =
$ilDB->queryF(
2533 "SELECT finished_id FROM svy_finished" .
2534 " WHERE survey_fi = %s AND user_fi = %s AND appr_id = %s",
2535 array(
'integer',
'integer',
'integer'),
2536 array($this->getSurveyId(),
$user_id, $appr_id)
2539 if ($result->numRows() === 0) {
2542 $row =
$ilDB->fetchAssoc($result);
2543 return (
int) $row[
"finished_id"];
2555 $result =
$ilDB->queryF(
2556 "SELECT lastpage FROM svy_finished WHERE finished_id = %s",
2560 if ($row =
$ilDB->fetchAssoc($result)) {
2561 return (
int) $row[
"lastpage"];
2575 array $constraint_data,
2576 ?array $working_data
2578 if (!is_array($working_data) || count($working_data) === 0) {
2582 if ((count($working_data) === 1) and (strcmp($working_data[0][
"value"],
"") === 0)) {
2587 foreach ($working_data as
$data) {
2588 switch ($constraint_data[
"short"]) {
2590 if (
$data[
"value"] < $constraint_data[
"value"]) {
2596 if (
$data[
"value"] <= $constraint_data[
"value"]) {
2602 if (
$data[
"value"] == $constraint_data[
"value"]) {
2608 if (
$data[
"value"] <> $constraint_data[
"value"]) {
2614 if (
$data[
"value"] >= $constraint_data[
"value"]) {
2620 if (
$data[
"value"] > $constraint_data[
"value"]) {
2630 return (
int) $found;
2643 $result =
$ilDB->queryF(
2644 "SELECT finished_id FROM svy_finished WHERE survey_fi = %s",
2648 return (
bool) $result->numRows();
2661 $result =
$ilDB->queryF(
2662 "SELECT * FROM svy_finished WHERE survey_fi = %s",
2664 array($this->getSurveyId())
2666 if ($result->numRows()) {
2667 while ($row =
$ilDB->fetchAssoc($result)) {
2668 $users[] = (
int) $row[
"finished_id"];
2682 $evaluation = array();
2684 foreach (array_keys($this->getSurveyQuestions()) as $question_id) {
2688 $question =
new $question_type();
2689 $question->loadFromDb($question_id);
2692 $q_res = $q_eval->getResults();
2695 foreach ($finished_ids as
$user_id) {
2699 $evaluation[$question_id] =
$data;
2711 bool $force_non_anonymous =
false
2715 $surveySetting =
new ilSetting(
"survey");
2716 $use_anonymous_id = $surveySetting->get(
"use_anonymous_id");
2717 $result =
$ilDB->queryF(
2718 "SELECT * FROM svy_finished WHERE finished_id = %s",
2723 $foundrows = $result->numRows();
2725 $row =
$ilDB->fetchAssoc($result);
2727 $name = ($use_anonymous_id) ? $row[
"anonymous_id"] : $this->
lng->txt(
"anonymous");
2729 "fullname" => $name,
2730 "sortname" => $name,
2735 "active_id" => (
string) $active_id
2738 if (($row[
"user_fi"] > 0) &&
2740 !$this->hasAnonymizedResults() &&
2741 !$this->get360Mode()) ||
2742 $force_non_anonymous)) {
2744 $userdata[
"fullname"] = $userdata[
"sortname"] = $this->
lng->txt(
"deleted_user");
2747 $userdata[
'usr_id'] = $row[
'user_fi'];
2750 if (strlen($gender) === 1) {
2751 $gender = $this->
lng->txt(
"gender_$gender");
2753 $userdata[
"gender"] = $gender;
2757 $userdata[
"login"] = $user->
getLogin();
2761 $code = $this->code_manager->getByUserKey((
string) $row[
"anonymous_id"]);
2762 if (!is_null($code) && $this->feature_config->usesAppraisees()) {
2763 $userdata[
"firstname"] = $code->getFirstName();
2764 $userdata[
"lastname"] = $code->getLastName();
2765 $userdata[
"sortname"] = $code->getLastName() .
", " . $code->getFirstName();
2784 $result =
$ilDB->queryF(
2785 "SELECT * FROM svy_answer WHERE active_fi = %s",
2789 while ($row =
$ilDB->fetchAssoc($result)) {
2790 if (!is_array($answers[$row[
"question_fi"]])) {
2791 $answers[$row[
"question_fi"]] = array();
2793 $answers[$row[
"question_fi"]][] = $row;
2795 $userdata = $this->getUserDataFromActiveId($active_id);
2797 "name" => $userdata[
"fullname"],
2798 "firstname" => $userdata[
"firstname"],
2799 "lastname" => $userdata[
"lastname"],
2800 "login" => $userdata[
"login"],
2801 "gender" => $userdata[
"gender"],
2802 "answers" => array()
2804 foreach ($questions as $key => $question) {
2805 if (array_key_exists($key, $answers)) {
2806 $resultset[
"answers"][$key] = $answers[$key];
2808 $resultset[
"answers"][$key] = array();
2810 sort($resultset[
"answers"][$key]);
2824 if (array_key_exists(
'title', $arrFilter) && strlen($arrFilter[
'title'])) {
2825 $where .=
" AND " .
$ilDB->like(
'svy_question.title',
'text',
"%%" . $arrFilter[
'title'] .
"%%");
2827 if (array_key_exists(
'description', $arrFilter) && strlen($arrFilter[
'description'])) {
2828 $where .=
" AND " .
$ilDB->like(
'svy_question.description',
'text',
"%%" . $arrFilter[
'description'] .
"%%");
2830 if (array_key_exists(
'author', $arrFilter) && strlen($arrFilter[
'author'])) {
2831 $where .=
" AND " .
$ilDB->like(
'svy_question.author',
'text',
"%%" . $arrFilter[
'author'] .
"%%");
2833 if (array_key_exists(
'type', $arrFilter) && strlen($arrFilter[
'type'])) {
2834 $where .=
" AND svy_qtype.type_tag = " .
$ilDB->quote($arrFilter[
'type'],
'text');
2836 if (array_key_exists(
'spl', $arrFilter) && strlen($arrFilter[
'spl'])) {
2837 $where .=
" AND svy_question.obj_fi = " .
$ilDB->quote($arrFilter[
'spl'],
'integer');
2840 $spls = $this->getAvailableQuestionpools(
true,
false,
false);
2841 $forbidden =
" AND " .
$ilDB->in(
'svy_question.obj_fi', array_keys($spls),
false,
'integer');
2842 $forbidden .=
" AND svy_question.complete = " .
$ilDB->quote(
"1",
'text');
2844 $existing_questions = $this->getExistingQuestions();
2845 if (count($existing_questions)) {
2846 $existing =
" AND " .
$ilDB->in(
'svy_question.question_id', $existing_questions,
true,
'integer');
2851 $query_result =
$ilDB->query(
"SELECT svy_question.*, svy_qtype.type_tag, svy_qtype.plugin, object_reference.ref_id" .
2852 " FROM svy_question, svy_qtype, object_reference" .
2853 " WHERE svy_question.original_id IS NULL" . $forbidden . $existing .
2854 " AND svy_question.obj_fi = object_reference.obj_id AND svy_question.tstamp > 0" .
2855 " AND svy_question.questiontype_fi = svy_qtype.questiontype_id " . $where);
2858 if ($query_result->numRows()) {
2859 while ($row =
$ilDB->fetchAssoc($query_result)) {
2860 if (array_key_exists(
'spl_txt', $arrFilter) && strlen($arrFilter[
'spl_txt'])) {
2861 if (stripos($spls[$row[
"obj_fi"]], $arrFilter[
'spl_txt']) ===
false) {
2866 $row[
'ttype'] = $trans[$row[
'type_tag']];
2867 if ($row[
"plugin"]) {
2887 if (array_key_exists(
'title', $arrFilter) && strlen($arrFilter[
'title'])) {
2888 $where .=
" AND " .
$ilDB->like(
'svy_qblk.title',
'text',
"%%" . $arrFilter[
'title'] .
"%%");
2891 $query_result =
$ilDB->query(
"SELECT svy_qblk.*, svy_svy.obj_fi FROM svy_qblk , svy_qblk_qst, svy_svy WHERE " .
2892 "svy_qblk.questionblock_id = svy_qblk_qst.questionblock_fi AND svy_svy.survey_id = svy_qblk_qst.survey_fi " .
2893 "$where GROUP BY svy_qblk.questionblock_id, svy_qblk.title, svy_qblk.show_questiontext, svy_qblk.show_blocktitle, " .
2894 "svy_qblk.owner_fi, svy_qblk.tstamp, svy_svy.obj_fi");
2896 if ($query_result->numRows()) {
2898 $surveytitles = array();
2899 foreach ($survey_ref_ids as $survey_ref_id) {
2903 while ($row =
$ilDB->fetchAssoc($query_result)) {
2904 $questions_array = $this->getQuestionblockQuestions($row[
"questionblock_id"]);
2906 foreach ($questions_array as $key => $value) {
2907 $questions_array[$key] =
"$counter. $value";
2910 if (strlen($surveytitles[$row[
"obj_fi"]] ??
"")) {
2911 $rows[$row[
"questionblock_id"]] = array(
2912 "questionblock_id" => $row[
"questionblock_id"],
2913 "title" => $row[
"title"],
2914 "svy" => $surveytitles[$row[
"obj_fi"]],
2915 "contains" => implode(
", ", $questions_array),
2916 "owner" => $row[
"owner_fi"]
2932 $a_xml_writer->xmlHeader();
2934 "xmlns:xsi" =>
"http://www.w3.org/2001/XMLSchema-instance",
2935 "xsi:noNamespaceSchemaLocation" =>
"https://www.ilias.de/download/xsd/ilias_survey_4_2.xsd"
2937 $a_xml_writer->xmlStartTag(
"surveyobject", $attrs);
2939 "id" => $this->getSurveyId(),
2942 $a_xml_writer->xmlStartTag(
"survey", $attrs);
2944 $a_xml_writer->xmlElement(
"description",
null, $this->getDescription());
2945 $a_xml_writer->xmlElement(
"author",
null, $this->getAuthor());
2946 $a_xml_writer->xmlStartTag(
"objectives");
2948 "label" =>
"introduction"
2950 $this->addMaterialTag($a_xml_writer, $this->getIntroduction(),
true,
true, $attrs);
2954 $this->addMaterialTag($a_xml_writer, $this->getOutro(),
true,
true, $attrs);
2955 $a_xml_writer->xmlEndTag(
"objectives");
2957 if ($this->getAnonymize()) {
2958 $attribs = array(
"enabled" =>
"1");
2960 $attribs = array(
"enabled" =>
"0");
2962 $a_xml_writer->xmlElement(
"anonymisation", $attribs);
2963 $a_xml_writer->xmlStartTag(
"restrictions");
2964 if ($this->getAnonymize() === 2) {
2965 $attribs = array(
"type" =>
"free");
2967 $attribs = array(
"type" =>
"restricted");
2969 $a_xml_writer->xmlElement(
"access", $attribs);
2970 if ($this->getStartDate()) {
2971 $attrs = array(
"type" =>
"date");
2972 preg_match(
"/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/", $this->getStartDate(), $matches);
2973 $a_xml_writer->xmlElement(
"startingtime", $attrs, sprintf(
"%04d-%02d-%02dT%02d:%02d:00", $matches[1], $matches[2], $matches[3], $matches[4], $matches[5]));
2975 if ($this->getEndDate()) {
2976 $attrs = array(
"type" =>
"date");
2977 preg_match(
"/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/", $this->getEndDate(), $matches);
2978 $a_xml_writer->xmlElement(
"endingtime", $attrs, sprintf(
"%04d-%02d-%02dT%02d:%02d:00", $matches[1], $matches[2], $matches[3], $matches[4], $matches[5]));
2980 $a_xml_writer->xmlEndTag(
"restrictions");
2983 $pages = $this->getSurveyPages();
2984 $hasconstraints =
false;
2985 foreach ($pages as $question_array) {
2986 foreach ($question_array as $question) {
2987 if (count($question[
"constraints"])) {
2988 $hasconstraints =
true;
2993 if ($hasconstraints) {
2994 $a_xml_writer->xmlStartTag(
"constraints");
2995 foreach ($pages as $question_array) {
2996 foreach ($question_array as $question) {
2997 if (count($question[
"constraints"])) {
2999 foreach ($question[
"constraints"] as $constraint) {
3001 "sourceref" => $question[
"question_id"],
3002 "destref" => $constraint[
"question"],
3003 "relation" => $constraint[
"short"],
3004 "value" => $constraint[
"value"],
3005 "conjunction" => $constraint[
"conjunction"]
3007 $a_xml_writer->xmlElement(
"constraint", $attribs);
3012 $a_xml_writer->xmlEndTag(
"constraints");
3016 $a_xml_writer->xmlStartTag(
"metadata");
3018 $custom_properties = array();
3019 $custom_properties[
"evaluation_access"] = $this->getEvaluationAccess();
3020 $custom_properties[
"status"] = !$this->getOfflineStatus();
3021 $custom_properties[
"display_question_titles"] = $this->getShowQuestionTitles();
3023 $custom_properties[
"own_results_view"] = (
int) $this->hasViewOwnResults();
3024 $custom_properties[
"own_results_mail"] = (
int) $this->hasMailOwnResults();
3025 $custom_properties[
"confirmation_mail"] = (
int) $this->hasMailConfirmation();
3027 $custom_properties[
"anon_user_list"] = (
int) $this->hasAnonymousUserList();
3028 $custom_properties[
"mode"] = $this->getMode();
3029 $custom_properties[
"mode_360_self_eval"] = (
int) $this->get360SelfEvaluation();
3030 $custom_properties[
"mode_360_self_rate"] = (
int) $this->get360SelfRaters();
3031 $custom_properties[
"mode_360_self_appr"] = (
int) $this->get360SelfAppraisee();
3032 $custom_properties[
"mode_360_results"] = $this->get360Results();
3033 $custom_properties[
"mode_skill_service"] = (
int) $this->getSkillService();
3034 $custom_properties[
"mode_self_eval_results"] = $this->getSelfEvaluationResults();
3041 foreach ($custom_properties as $label => $value) {
3042 $a_xml_writer->xmlStartTag(
"metadatafield");
3043 $a_xml_writer->xmlElement(
"fieldlabel",
null, $label);
3044 $a_xml_writer->xmlElement(
"fieldentry",
null, $value);
3045 $a_xml_writer->xmlEndTag(
"metadatafield");
3048 $a_xml_writer->xmlEndTag(
"metadata");
3049 $a_xml_writer->xmlEndTag(
"survey");
3051 $attribs = array(
"id" => $this->
getId());
3052 $a_xml_writer->xmlStartTag(
"surveyquestions", $attribs);
3054 foreach ($pages as $question_array) {
3055 if (count($question_array) > 1) {
3056 $attribs = array(
"id" => $question_array[0][
"question_id"]);
3058 "showQuestiontext" => $question_array[0][
"questionblock_show_questiontext"],
3059 "showBlocktitle" => $question_array[0][
"questionblock_show_blocktitle"],
3060 "compressView" => $question_array[0][
"questionblock_compress_view"]
3062 $a_xml_writer->xmlStartTag(
"questionblock", $attribs);
3063 if (strlen($question_array[0][
"questionblock_title"])) {
3064 $a_xml_writer->xmlElement(
"questionblocktitle",
null, $question_array[0][
"questionblock_title"]);
3067 foreach ($question_array as $question) {
3068 if (strlen($question[
"heading"] ??
"")) {
3069 $a_xml_writer->xmlElement(
"textblock",
null, $question[
"heading"]);
3071 $questionObject = self::_instanciateQuestion($question[
"question_id"]);
3075 if ($questionObject !==
false) {
3076 $questionObject->insertXML($a_xml_writer,
false);
3079 if (count($question_array) > 1) {
3080 $a_xml_writer->xmlEndTag(
"questionblock");
3084 $a_xml_writer->xmlEndTag(
"surveyquestions");
3085 $a_xml_writer->xmlEndTag(
"surveyobject");
3086 $xml = $a_xml_writer->xmlDumpMem(
false);
3097 if ($question_id < 1) {
3101 if ($question_type ===
'') {
3105 $question =
new $question_type();
3106 $question->loadFromDb($question_id);
3118 if (!is_dir($a_dir) || is_int(strpos($a_dir,
".."))) {
3121 $importDirectory =
"";
3124 $current_dir = opendir($a_dir);
3126 while ($entryname = readdir($current_dir)) {
3127 $files[] = $entryname;
3130 foreach ($files as $file) {
3131 if (is_dir($a_dir .
"/" . $file) and ($file !==
"." and $file !==
"..")) {
3133 $importDirectory = $a_dir .
"/" . $file;
3136 closedir($current_dir);
3137 if ($importDirectory !==
'') {
3139 $current_dir = opendir($importDirectory);
3141 while ($entryname = readdir($current_dir)) {
3142 $files[] = $entryname;
3144 foreach ($files as $file) {
3145 if (is_file($importDirectory .
"/" . $file) &&
3146 ($file !==
"." && $file !==
"..") &&
3147 (preg_match(
"/^[0-9]{10}__[0-9]+__(svy_)*[0-9]+\.[A-Za-z]{1,3}$/", $file) ||
3148 preg_match(
"/^[0-9]{10}__[0-9]+__(survey__)*[0-9]+\.[A-Za-z]{1,3}$/", $file))) {
3150 $xmlFile = $importDirectory .
"/" . $file;
3154 return array(
"dir" => $importDirectory,
"xml" => $xmlFile);
3168 if ($svy_qpl_id < 1) {
3172 $source = $file_info[
"tmp_name"];
3174 if (($source ===
'none') || (!$source) || $file_info[
"error"] > UPLOAD_ERR_OK) {
3175 $error = $this->
lng->txt(
"import_no_file_selected");
3180 if ((strcmp($file_info[
"type"],
"text/xml") === 0) || (strcmp($file_info[
"type"],
"application/xml") === 0)) {
3181 $this->svy_log->debug(
"isXML");
3185 $suffix = pathinfo($file_info[
"name"]);
3186 if (strcmp(strtolower($suffix[
"extension"]),
"zip") === 0) {
3187 $this->svy_log->debug(
"isZip");
3190 if (!$isXml && !$isZip) {
3191 $error = $this->
lng->txt(
"import_wrong_file_type");
3192 $this->svy_log->debug(
"Survey: Import error. Filetype was \"" . $file_info[
"type"] .
"\"");
3194 if ($error ===
'') {
3196 $import_dir = $this->getImportDirectory();
3197 $import_subdir =
"";
3200 $importfile = $import_dir .
"/" . $file_info[
"name"];
3202 $this->domain->resources()->zip()->unzipFile($importfile);
3203 $found = $this->locateImportFiles($import_dir);
3204 if (!((strlen($found[
"dir"]) > 0) && (strlen($found[
"xml"]) > 0))) {
3205 $error = $this->
lng->txt(
"wrong_import_file_structure");
3208 $importfile = $found[
"xml"];
3209 $import_subdir = $found[
"dir"];
3211 $importfile = tempnam($import_dir,
"survey_import");
3215 $this->svy_log->debug(
"Import file = $importfile");
3216 $this->svy_log->debug(
"Import subdir = $import_subdir");
3218 $fh = fopen($importfile,
'rb');
3220 $error = $this->
lng->txt(
"import_error_opening_file");
3223 $xml = fread($fh, filesize($importfile));
3224 $result = fclose($fh);
3226 $error = $this->
lng->txt(
"import_error_closing_file");
3230 $this->import_manager->clearMobs();
3231 if (strpos($xml,
"questestinterop")) {
3234 $this->svy_log->debug(
"survey id = " . $this->
getId());
3235 $this->svy_log->debug(
"question pool id = " . $svy_qpl_id);
3238 $config = $imp->getConfig(
"components/ILIAS/Survey");
3239 $config->setQuestionPoolID($svy_qpl_id);
3240 $imp->getMapping()->addMapping(
"components/ILIAS/Survey",
"svy", 0, $this->
getId());
3241 $imp->importFromDirectory($import_subdir,
"svy",
"components/ILIAS/Survey");
3242 $this->svy_log->debug(
"config(Modules/survey)->getQuestionPoolId =" . $config->getQuestionPoolID());
3248 public function cloneObject(
int $target_id,
int $copy_id = 0,
bool $omit_tree =
false): ?
ilObject
3252 $this->loadFromDb();
3255 $svy_type = $this->getMode();
3258 $newObj = parent::cloneObject($target_id, $copy_id, $omit_tree);
3259 $this->cloneMetaData($newObj);
3260 $newObj->updateMetaData();
3262 $newObj->setAuthor($this->getAuthor());
3263 $newObj->setIntroduction($this->getIntroduction());
3264 $newObj->setOutro($this->getOutro());
3265 $newObj->setEvaluationAccess($this->getEvaluationAccess());
3266 $newObj->setStartDate($this->getStartDate());
3267 $newObj->setEndDate($this->getEndDate());
3268 $newObj->setAnonymize($this->getAnonymize());
3269 $newObj->setShowQuestionTitles($this->getShowQuestionTitles());
3270 $newObj->setMailOwnResults($this->hasMailOwnResults());
3271 $newObj->setMailConfirmation($this->hasMailConfirmation());
3272 $newObj->setAnonymousUserList($this->hasAnonymousUserList());
3274 $newObj->setMode($this->getMode());
3275 $newObj->set360SelfEvaluation($this->get360SelfEvaluation());
3276 $newObj->set360SelfAppraisee($this->get360SelfAppraisee());
3277 $newObj->set360SelfRaters($this->get360SelfRaters());
3278 $newObj->set360Results($this->get360Results());
3279 $newObj->setSkillService($this->getSkillService());
3282 $newObj->setReminderStatus($this->getReminderStatus());
3283 $newObj->setReminderStart($this->getReminderStart());
3284 $newObj->setReminderEnd($this->getReminderEnd());
3285 $newObj->setReminderFrequency($this->getReminderFrequency());
3286 $newObj->setReminderTarget($this->getReminderTarget());
3287 $newObj->setReminderTemplate($this->getReminderTemplate());
3289 $newObj->setTutorNotificationStatus($this->getTutorNotificationStatus());
3290 $newObj->setTutorNotificationRecipients($this->getTutorNotificationRecipients());
3291 $newObj->setTutorNotificationTarget($this->getTutorNotificationTarget());
3292 $newObj->setTutorResultsStatus($this->getTutorResultsStatus());
3293 $newObj->setTutorResultsRecipients($this->getTutorResultsRecipients());
3295 $newObj->setMailNotification($this->getMailNotification());
3296 $newObj->setMailAddresses($this->getMailAddresses());
3297 $newObj->setMailParticipantData($this->getMailParticipantData());
3299 $question_pointer = array();
3303 foreach ($this->questions as $key => $question_id) {
3305 $question = self::_instanciateQuestion($question_id);
3309 $question->setObjId($newObj->getId());
3310 $question->saveToDb($original_id);
3311 $newObj->questions[$key] = $question->getId();
3312 $question_pointer[$question_id] = $question->getId();
3313 $mapping[$question_id] = $question->getId();
3320 if (!$cp_options->isRootNode($this->getRefId())) {
3321 $newObj->setOfflineStatus($this->getOfflineStatus());
3324 $newObj->saveToDb();
3325 $newObj->cloneTextblocks($mapping);
3328 if (($svy_type === self::MODE_360 || $svy_type === self::MODE_SELF_EVAL) &&
3329 $this->getSkillService()) {
3333 foreach ($mapping as $src_qst_id => $tgt_qst_id) {
3334 $qst_skill = $src_skills->getSkillForQuestion($src_qst_id);
3336 $tgt_skills->addQuestionSkillAssignment($tgt_qst_id, $qst_skill[
"base_skill_id"], $qst_skill[
"tref_id"]);
3341 $thresholds->cloneTo($newObj, $mapping);
3345 $questionblocks = array();
3346 $questionblock_questions = array();
3347 $result =
$ilDB->queryF(
3348 "SELECT * FROM svy_qblk_qst WHERE survey_fi = %s",
3350 array($this->getSurveyId())
3352 if ($result->numRows() > 0) {
3353 while ($row =
$ilDB->fetchAssoc($result)) {
3354 $questionblock_questions[] = $row;
3355 $questionblocks[$row[
"questionblock_fi"]] = $row[
"questionblock_fi"];
3359 foreach ($questionblocks as $key => $value) {
3360 $questionblock = self::_getQuestionblock($key);
3361 $questionblock_id = self::_addQuestionblock(
3362 (
string) $questionblock[
"title"],
3363 (
int) $questionblock[
"owner_fi"],
3364 (
bool) $questionblock[
"show_questiontext"],
3365 (
bool) $questionblock[
"show_blocktitle"],
3366 (
bool) $questionblock[
"compress_view"]
3368 $questionblocks[$key] = $questionblock_id;
3371 foreach ($questionblock_questions as $key => $value) {
3372 if ($questionblocks[$value[
"questionblock_fi"]] &&
3373 $question_pointer[$value[
"question_fi"]]) {
3374 $next_id =
$ilDB->nextId(
'svy_qblk_qst');
3375 $affectedRows =
$ilDB->manipulateF(
3376 "INSERT INTO svy_qblk_qst (qblk_qst_id, survey_fi, questionblock_fi, question_fi) " .
3377 "VALUES (%s, %s, %s, %s)",
3378 array(
'integer',
'integer',
'integer',
'integer'),
3379 array($next_id, $newObj->getSurveyId(), $questionblocks[$value[
"questionblock_fi"]], $question_pointer[$value[
"question_fi"]])
3385 $constraints = self::_getConstraints($this->getSurveyId());
3386 $newConstraints = array();
3387 foreach ($constraints as $key => $constraint) {
3388 if ($question_pointer[$constraint[
"for_question"]] &&
3389 $question_pointer[$constraint[
"question"]]) {
3390 if (!array_key_exists($constraint[
'id'], $newConstraints)) {
3391 $constraint_id = $newObj->addConstraint($question_pointer[$constraint[
"question"]], $constraint[
"relation_id"], $constraint[
"value"], $constraint[
'conjunction']);
3392 $newConstraints[$constraint[
'id']] = $constraint_id;
3394 $newObj->addConstraintToQuestion($question_pointer[$constraint[
"for_question"]], $newConstraints[$constraint[
'id']]);
3400 $obj_settings->cloneSettings($newObj->getId());
3401 unset($obj_settings);
3413 $result =
$ilDB->queryF(
3414 "SELECT * FROM svy_svy_qst WHERE question_fi = %s",
3418 if ($row =
$ilDB->fetchAssoc($result)) {
3419 return $row[
"heading"] ??
"";
3433 foreach ($mapping as $original_id => $new_id) {
3434 $textblock = $this->getTextblock($original_id);
3449 if (!is_writable($svy_data_dir)) {
3450 throw new ilSurveyException(
"Survey Data Directory (" . $svy_data_dir .
") not writeable.");
3454 $svy_dir = $svy_data_dir .
"/svy_" . $this->
getId();
3456 if (!is_dir($svy_dir)) {
3460 $export_dir = $svy_dir .
"/export";
3462 if (!is_dir($export_dir)) {
3488 if (!is_writable($svy_data_dir)) {
3489 throw new ilSurveyException(
"Survey Data Directory (" . $svy_data_dir .
") not writeable.");
3493 $svy_dir = $svy_data_dir .
"/svy_" . $this->
getId();
3495 if (!is_dir($svy_dir)) {
3500 $import_dir = $svy_dir .
"/import";
3502 if (!is_dir($import_dir)) {
3514 "/svy_" . $this->
getId() .
"/import";
3515 if (!is_dir($import_dir)) {
3518 if (is_dir($import_dir)) {
3537 "UPDATE svy_svy_qst SET heading=%s WHERE survey_fi=%s AND question_fi=%s",
3538 array(
'text',
'integer',
'integer'),
3539 array($heading, $this->getSurveyId(), $insertbefore)
3543 "UPDATE svy_svy_qst SET heading=%s WHERE survey_fi=%s AND question_fi=%s",
3544 array(
'text',
'integer',
'integer'),
3545 array(
null, $this->getSurveyId(), $insertbefore)
3558 $result =
$ilDB->queryF(
3559 "SELECT finished_id FROM svy_finished WHERE anonymous_id = %s AND survey_fi = %s",
3560 array(
'text',
'integer'),
3561 array($key, $this->getSurveyId())
3563 return $result->numRows() === 1;
3576 ?array $a_codes =
null,
3577 ?array $a_ids =
null
3580 $ilUser = $this->user;
3583 $sql =
"SELECT svy_anonymous.*, svy_finished.state" .
3584 " FROM svy_anonymous" .
3585 " LEFT JOIN svy_finished ON (svy_anonymous.survey_key = svy_finished.anonymous_id)" .
3586 " WHERE svy_anonymous.survey_fi = " .
$ilDB->quote($this->getSurveyId(),
"integer") .
3587 " AND svy_anonymous.user_key IS NULL";
3590 $sql .=
" AND " .
$ilDB->in(
"svy_anonymous.survey_key", $a_codes,
"",
"text");
3592 $sql .=
" AND " .
$ilDB->in(
"svy_anonymous.anonymous_id", $a_ids,
"",
"text");
3599 $titles[] =
'"' .
$lng->txt(
"survey_code") .
'"';
3600 $titles[] =
'"' .
$lng->txt(
"email") .
'"';
3601 $titles[] =
'"' .
$lng->txt(
"lastname") .
'"';
3602 $titles[] =
'"' .
$lng->txt(
"firstname") .
'"';
3603 $titles[] =
'"' .
$lng->txt(
"create_date") .
'"';
3604 $titles[] =
'"' .
$lng->txt(
"used") .
'"';
3605 $titles[] =
'"' .
$lng->txt(
"mail_sent_short") .
'"';
3606 $titles[] =
'"' .
$lng->txt(
"survey_code_url") .
'"';
3607 $export[] = implode(
";", $titles);
3609 $result =
$ilDB->query($sql);
3610 $default_lang = $ilUser->getPref(
"survey_code_language");
3611 while ($row =
$ilDB->fetchAssoc($result)) {
3613 $item[] = $row[
"survey_key"];
3615 if ($row[
"externaldata"]) {
3616 $ext = unserialize((
string) $row[
"externaldata"], [
'allowed_classes' =>
false]);
3617 $item[] = $ext[
"email"];
3618 $item[] = $ext[
"lastname"];
3619 $item[] = $ext[
"firstname"];
3630 $item[] = ($this->isSurveyCodeUsed($row[
"survey_key"])) ? 1 : 0;
3631 $item[] = ($row[
"sent"]) ? 1 : 0;
3633 $params = array(
"accesscode" => $row[
"survey_key"]);
3634 if ($default_lang) {
3635 $params[
"lang"] = $default_lang;
3637 $item[] = ilLink::_getLink($this->getRefId(),
"svy",
$params);
3639 $export[] =
'"' . implode(
'";"', $item) .
'"';
3641 return implode(
"\n", $export);
3651 ?
string $lang =
null
3657 $sql =
"SELECT svy_anonymous.*, svy_finished.state" .
3658 " FROM svy_anonymous" .
3659 " LEFT JOIN svy_finished ON (svy_anonymous.survey_key = svy_finished.anonymous_id)" .
3660 " WHERE svy_anonymous.survey_fi = " .
$ilDB->quote($this->getSurveyId(),
"integer")
3664 $sql .=
" AND " .
$ilDB->in(
"svy_anonymous.anonymous_id", $ids,
"",
"integer");
3667 $sql .=
" ORDER BY tstamp, survey_key ASC";
3668 $result =
$ilDB->query($sql);
3669 if ($result->numRows() > 0) {
3670 while ($row =
$ilDB->fetchAssoc($result)) {
3673 if ($this->isSurveyCodeUsed($row[
"survey_key"])) {
3676 $params = array(
"accesscode" => $row[
"survey_key"]);
3680 $href = ilLink::_getLink($this->getRefId(),
"svy",
$params);
3685 'id' => $row[
"anonymous_id"],
3686 'code' => $row[
"survey_key"],
3687 'date' => $row[
"tstamp"],
3689 'sent' => $row[
'sent'],
3696 if ($row[
"externaldata"]) {
3697 $ext = unserialize((
string) $row[
"externaldata"], [
'allowed_classes' =>
false]);
3698 $item[
'email'] = $ext[
'email'] ??
"";
3699 $item[
'last_name'] = $ext[
'lastname'] ??
"";
3700 $item[
'first_name'] = $ext[
'firstname'] ??
"";
3716 $result =
$ilDB->queryF(
3717 "SELECT finished_id FROM svy_finished WHERE survey_fi = %s AND anonymous_id = %s",
3718 array(
'integer',
'text'),
3719 array($this->getSurveyId(), $code)
3721 return $result->numRows() > 0;
3731 $result =
$ilDB->queryF(
3732 "SELECT anonymous_id FROM svy_anonymous WHERE survey_fi = %s AND survey_key = %s",
3733 array(
'integer',
'text'),
3734 array($this->getSurveyId(), $code)
3736 return !(($result->numRows() > 0));
3743 string $a_anonymize_key,
3749 $next_id =
$ilDB->nextId(
'svy_anonymous');
3751 "INSERT INTO svy_anonymous (anonymous_id, survey_key, survey_fi, externaldata, tstamp) " .
3752 "VALUES (%s, %s, %s, %s, %s)",
3753 array(
'integer',
'text',
'integer',
'text',
'integer'),
3754 array($next_id, $a_anonymize_key, $this->getSurveyId(), serialize($a_data), $a_created)
3773 $check_finished = ($not_sent > 1);
3777 $recipients = $this->getExternalCodeRecipients($check_finished);
3778 foreach ($recipients as
$data) {
3781 switch ($not_sent) {
3783 $do_send = !(bool)
$data[
'sent'];
3787 $do_send =
$data[
'finished'];
3791 $do_send = !
$data[
'finished'];
3801 $url = ilLink::_getLink(
3805 "accesscode" =>
$data[
"code"],
3809 $messagetext = str_replace(
'[url]',
$url, $messagetext);
3810 foreach (
$data as $key => $value) {
3811 $messagetext = str_replace(
'[' . $key .
']', $value, $messagetext);
3829 "UPDATE svy_anonymous SET sent = %s WHERE survey_fi = %s AND externaldata IS NOT NULL",
3830 array(
'integer',
'integer'),
3831 array(1, $this->getSurveyId())
3839 bool $a_check_finished =
false
3842 $result =
$ilDB->queryF(
3843 "SELECT survey_key code, externaldata, sent FROM svy_anonymous WHERE survey_fi = %s",
3845 array($this->getSurveyId())
3848 while ($row =
$ilDB->fetchAssoc($result)) {
3849 if (!$row[
'externaldata']) {
3853 $externaldata = unserialize((
string) $row[
'externaldata'], [
'allowed_classes' =>
false]);
3854 if (!$externaldata[
'email']) {
3858 $externaldata[
'code'] = $row[
'code'];
3859 $externaldata[
'sent'] = $row[
'sent'];
3861 if ($a_check_finished) {
3864 $externaldata[
'finished'] = $this->isSurveyFinishedByCode($row[
'code']);
3867 $res[] = $externaldata;
3880 $result = $this->db->queryF(
3881 "SELECT state FROM svy_finished WHERE survey_fi = %s AND anonymous_id = %s",
3882 array(
'integer',
'text'),
3883 array($this->getSurveyId(), $a_code)
3886 $row = $this->db->fetchAssoc($result);
3888 return $row[
'state'] ??
false;
3899 if ($survey_code !==
'') {
3900 $affectedRows =
$ilDB->manipulateF(
3901 "DELETE FROM svy_anonymous WHERE survey_fi = %s AND survey_key = %s",
3902 array(
'integer',
'text'),
3903 array($this->getSurveyId(), $survey_code)
3918 $result =
$ilDB->queryF(
3919 "SELECT survey_key FROM svy_anonymous WHERE survey_fi = %s AND user_key = %s",
3920 array(
'integer',
'text'),
3921 array($this->getSurveyId(), md5(
$user_id))
3923 if ($result->numRows()) {
3924 $row =
$ilDB->fetchAssoc($result);
3925 $access_code = $row[
"survey_key"];
3927 return $access_code;
3944 $next_id =
$ilDB->nextId(
'svy_anonymous');
3945 $affectedRows =
$ilDB->manipulateF(
3946 "INSERT INTO svy_anonymous (anonymous_id, survey_key, survey_fi, user_key, tstamp) " .
3947 "VALUES (%s, %s, %s, %s, %s)",
3948 array(
'integer',
'text',
'integer',
'text',
'integer'),
3949 array($next_id, $access_code, $this->getSurveyId(), md5(
$user_id), time())
3962 $result =
$ilDB->queryF(
3963 "SELECT tstamp FROM svy_answer WHERE active_fi = %s ORDER BY tstamp DESC",
3967 if ($result->numRows()) {
3968 $row =
$ilDB->fetchAssoc($result);
3969 return (
int) $row[
"tstamp"];
3971 $result =
$ilDB->queryF(
3972 "SELECT tstamp FROM svy_finished WHERE finished_id = %s",
3976 if ($result->numRows()) {
3977 $row =
$ilDB->fetchAssoc($result);
3978 return (
int) $row[
"tstamp"];
4000 if (preg_match(
"/<[^>]*?>/", $a_text)) {
4014 bool $close_material_tag =
true,
4015 bool $add_mobs =
true,
4016 ?array $attribs =
null
4018 $a_xml_writer->xmlStartTag(
"material", $attribs);
4020 "type" =>
"text/plain"
4022 if ($this->isHTML($a_material)) {
4023 $attrs[
"type"] =
"text/xhtml";
4026 $a_xml_writer->
xmlElement(
"mattext", $attrs, $mattext);
4030 foreach ($mobs as $mob) {
4031 $mob_id =
"il_" .
IL_INST_ID .
"_mob_" . $mob;
4032 if (strpos($mattext, $mob_id) !==
false) {
4036 "uri" =>
"objects/" .
"il_" .
IL_INST_ID .
"_mob_" . $mob .
"/" . $mob_obj->getTitle(),
4037 "type" =>
"svy:html",
4038 "id" => $this->getId()
4040 $a_xml_writer->
xmlElement(
"matimage", $imgattrs,
null);
4044 if ($close_material_tag) {
4058 if ($this->getAnonymize() !== self::ANONYMIZE_OFF) {
4059 if ($this->surveyCodeSecurity ===
false) {
4068 $this->survey_id = $survey_id;
4083 if (count($ids) === 0) {
4087 $result =
$ilDB->query(
"SELECT usr_id, login, lastname, firstname FROM usr_data WHERE " .
$ilDB->in(
'usr_id', $ids,
false,
'integer') .
" ORDER BY login");
4088 $result_array = array();
4089 while ($row =
$ilDB->fetchAssoc($result)) {
4090 $result_array[$row[
"usr_id"]] = $row;
4092 return $result_array;
4100 return $this->mailnotification;
4108 $this->mailnotification = $a_notification;
4116 return $this->mailaddresses;
4124 $this->mailaddresses = $a_addresses;
4132 return $this->mailparticipantdata;
4140 $this->mailparticipantdata = $a_data;
4151 $result =
$ilDB->queryF(
4152 "SELECT * FROM svy_times WHERE finished_fi = %s",
4157 while ($row =
$ilDB->fetchAssoc($result)) {
4158 if ($row[
'left_page'] > 0 && $row[
'entered_page'] > 0) {
4159 $total += $row[
'left_page'] - $row[
'entered_page'];
4168 if (count($this->questions) === count($a_order)) {
4169 $this->questions = array_flip($a_order);
4170 $this->saveQuestionsToDb();
4176 return $this->pool_usage;
4181 $this->pool_usage = $a_value;
4190 string $a_last_name,
4191 string $a_first_name,
4196 $a_email = trim($a_email);
4203 $data = array(
"email" => $a_email,
4204 "lastname" => trim($a_last_name),
4205 "firstname" => trim($a_first_name));
4208 "externaldata" => array(
"text", serialize(
$data)),
4209 "sent" => array(
"integer", $a_sent)
4215 array(
"anonymous_id" => array(
"integer", $a_id))
4228 if ($this->getMode() === self::MODE_360) {
4236 $this->mode_360_self_eval = $a_value;
4241 return $this->mode_360_self_eval;
4246 $this->mode_360_self_appr = $a_value;
4251 return $this->mode_360_self_appr;
4256 $this->mode_360_self_rate = $a_value;
4261 return $this->mode_360_self_rate;
4266 $this->mode_360_results = $a_value;
4271 return $this->mode_360_results;
4283 $access =
$DIC->access();
4285 if (!$this->isAppraisee($a_user_id) &&
4288 "obj_id" => array(
"integer", $this->getSurveyId()),
4289 "user_id" => array(
"integer", $a_user_id)
4291 $ilDB->insert(
"svy_360_appr", $fields);
4295 $this->sendAppraiseeNotification($a_user_id);
4308 $ntf->setRefId($this->getRefId());
4309 $ntf->setGotoLangId(
'url');
4312 $lng = $ntf->getUserLanguage($a_user_id);
4314 $ntf->setIntroductionLangId(
"svy_user_added_appraisee_mail");
4315 $subject = str_replace(
"%1", $this->
getTitle(),
$lng->txt(
"svy_user_added_appraisee"));
4324 $ntf->composeAndGetMessage($a_user_id,
null,
"read",
true),
4337 $ntf->setRefId($this->getRefId());
4338 $ntf->setGotoLangId(
'url');
4341 $lng = $ntf->getUserLanguage($a_user_id);
4343 $ntf->setIntroductionLangId(
"svy_user_added_appraisee_close_mail");
4344 $subject = str_replace(
"%1", $this->
getTitle(),
$lng->txt(
"svy_user_added_appraisee"));
4353 $ntf->composeAndGetMessage($a_user_id,
null,
"read",
true),
4367 $ntf->setRefId($this->getRefId());
4368 $ntf->setGotoLangId(
'url');
4371 $lng = $ntf->getUserLanguage($a_user_id);
4373 $ntf->setIntroductionLangId(
"svy_user_added_rater_mail");
4374 $subject = str_replace(
"%1", $this->
getTitle(),
$lng->txt(
"svy_user_added_rater"));
4384 $ntf->composeAndGetMessage($a_user_id,
null,
"read",
true),
4396 $set =
$ilDB->query(
"SELECT user_id" .
4397 " FROM svy_360_appr" .
4398 " WHERE obj_id = " .
$ilDB->quote($this->getSurveyId(),
"integer") .
4399 " AND user_id = " .
$ilDB->quote($a_user_id,
"integer"));
4400 return (
bool)
$ilDB->numRows($set);
4411 $set =
$ilDB->query(
"SELECT has_closed" .
4412 " FROM svy_360_appr" .
4413 " WHERE obj_id = " .
$ilDB->quote($this->getSurveyId(),
"integer") .
4414 " AND user_id = " .
$ilDB->quote($a_user_id,
"integer"));
4415 $row =
$ilDB->fetchAssoc($set);
4416 return (
bool) ($row[
"has_closed"] ??
false);
4427 $ilDB->manipulate(
"DELETE FROM svy_360_appr" .
4428 " WHERE obj_id = " .
$ilDB->quote($this->getSurveyId(),
"integer") .
4429 " AND user_id = " .
$ilDB->quote($a_user_id,
"integer"));
4431 $set =
$ilDB->query(
"SELECT user_id" .
4432 " FROM svy_360_rater" .
4433 " WHERE obj_id = " .
$ilDB->quote($this->getSurveyId(),
"integer") .
4434 " AND appr_id = " .
$ilDB->quote($a_user_id,
"integer"));
4435 while ($row =
$ilDB->fetchAssoc($set)) {
4436 $this->deleteRater($a_user_id, $row[
"user_id"]);
4439 if ($this->get360SelfEvaluation()) {
4440 $this->deleteRater($a_user_id, $a_user_id);
4453 $set =
$ilDB->query(
"SELECT * FROM svy_360_appr" .
4454 " WHERE obj_id = " .
$ilDB->quote($this->getSurveyId(),
"integer"));
4455 while ($row =
$ilDB->fetchAssoc($set)) {
4458 $name[
"name"] = $name[
"lastname"] .
", " . $name[
"firstname"];
4459 $res[$row[
"user_id"]] = $name;
4462 $raters = $this->getRatersData($row[
"user_id"]);
4463 foreach ($raters as $rater) {
4464 if ($rater[
"finished"]) {
4468 $res[$row[
"user_id"]][
"finished"] = $finished .
"/" . count($raters);
4469 $res[$row[
"user_id"]][
"closed"] = $row[
"has_closed"];
4479 int $a_appraisee_id,
4481 int $a_anonymous_id = 0
4486 $access =
$DIC->access();
4488 if ($this->isAppraisee($a_appraisee_id) &&
4489 !$this->isRater($a_appraisee_id, $a_user_id, $a_anonymous_id)) {
4491 "obj_id" => array(
"integer", $this->getSurveyId()),
4492 "appr_id" => array(
"integer", $a_appraisee_id),
4493 "user_id" => array(
"integer", $a_user_id),
4494 "anonymous_id" => array(
"integer", $a_anonymous_id)
4496 $ilDB->insert(
"svy_360_rater", $fields);
4512 int $a_appraisee_id,
4514 int $a_anonymous_id = 0
4519 if ($this->isAppraisee($a_user_id) &&
4520 $this->get360SelfEvaluation() &&
4521 (!$a_appraisee_id || $a_appraisee_id === $a_user_id)) {
4527 $sql =
"SELECT user_id" .
4528 " FROM svy_360_rater" .
4529 " WHERE obj_id = " .
$ilDB->quote($this->getSurveyId(),
"integer") .
4530 " AND user_id = " .
$ilDB->quote($a_user_id,
"integer") .
4531 " AND anonymous_id = " .
$ilDB->quote($a_anonymous_id,
"integer");
4532 if ($a_appraisee_id) {
4533 $sql .=
" AND appr_id = " .
$ilDB->quote($a_appraisee_id,
"integer");
4535 $set =
$ilDB->query($sql);
4536 return (
bool)
$ilDB->numRows($set);
4543 int $a_appraisee_id,
4545 int $a_anonymous_id = 0
4549 $finished_id = $this->getFinishedIdForAppraiseeIdAndRaterId($a_appraisee_id, $a_user_id);
4551 $this->removeSelectedSurveyResults(array($finished_id));
4554 $ilDB->manipulate(
"DELETE FROM svy_360_rater" .
4555 " WHERE obj_id = " .
$ilDB->quote($this->getSurveyId(),
"integer") .
4556 " AND appr_id = " .
$ilDB->quote($a_appraisee_id,
"integer") .
4557 " AND user_id = " .
$ilDB->quote($a_user_id,
"integer") .
4558 " AND anonymous_id = " .
$ilDB->quote($a_anonymous_id,
"integer"));
4569 $res = $anonymous_ids = array();
4571 $set =
$ilDB->query(
"SELECT * FROM svy_360_rater" .
4572 " WHERE obj_id = " .
$ilDB->quote($this->getSurveyId(),
"integer") .
4573 " AND appr_id = " .
$ilDB->quote($a_appraisee_id,
"integer"));
4574 while ($row =
$ilDB->fetchAssoc($set)) {
4575 if ($row[
"anonymous_id"]) {
4576 $res[
"a" . $row[
"anonymous_id"]] = array(
4577 "lastname" =>
"unknown code " . $row[
"anonymous_id"],
4578 "sent" => $row[
"mail_sent"],
4581 $anonymous_ids[] = $row[
"anonymous_id"];
4584 $name[
"name"] = $name[
"lastname"] .
", " . $name[
"firstname"];
4585 $name[
"user_id"] =
"u" . $name[
"user_id"];
4587 $name[
"sent"] = $row[
"mail_sent"];
4588 $name[
"finished"] = (bool) $this->is360SurveyStarted($a_appraisee_id, (
int) $row[
"user_id"]);
4589 $res[
"u" . $row[
"user_id"]] = $name;
4593 if (count($anonymous_ids)) {
4594 $data = $this->getSurveyCodesTableData($anonymous_ids);
4595 foreach (
$data as $item) {
4596 if (isset(
$res[
"a" . $item[
"id"]])) {
4597 $res[
"a" . $item[
"id"]] = array(
4598 "user_id" =>
"a" . $item[
"id"],
4599 "lastname" => $item[
"last_name"],
4600 "firstname" => $item[
"first_name"],
4601 "name" => $item[
"last_name"] .
", " . $item[
"first_name"],
4603 "email" => $item[
"email"],
4604 "code" => $item[
"code"],
4605 "href" => $item[
"href"],
4606 "sent" =>
$res[
"a" . $item[
"id"]][
"sent"],
4607 "finished" => (
bool) $this->is360SurveyStarted($a_appraisee_id, 0, $item[
"code"])
4622 ?
int $a_anonymous_id =
null
4628 $sql =
"SELECT appr_id FROM svy_360_rater" .
4629 " WHERE obj_id = " .
$ilDB->quote($this->getSurveyId(),
"integer");
4632 $sql .=
" AND user_id = " .
$ilDB->quote($a_user_id,
"integer");
4634 $sql .=
" AND anonymous_id = " .
$ilDB->quote($a_anonymous_id,
"integer");
4637 $set =
$ilDB->query($sql);
4638 while ($row =
$ilDB->fetchAssoc($set)) {
4639 $res[] = (
int) $row[
"appr_id"];
4643 if ($this->get360SelfEvaluation() &&
4644 $this->isAppraisee((
int) $a_user_id) &&
4645 !in_array($a_user_id,
$res)) {
4646 $res[] = $a_user_id;
4659 $set =
$ilDB->query(
"SELECT anonymous_id FROM svy_anonymous" .
4660 " WHERE survey_fi = " .
$ilDB->quote($this->getSurveyId(),
"integer") .
4661 " AND survey_key = " .
$ilDB->quote($a_code,
"text"));
4663 return $res[
"anonymous_id"] ??
null;
4672 ?
string $anonymous_code =
null
4676 $sql =
"SELECT * FROM svy_finished" .
4677 " WHERE survey_fi =" .
$ilDB->quote($this->getSurveyId(),
"integer") .
4678 " AND appr_id = " .
$ilDB->quote($appr_id,
"integer");
4680 $sql .=
" AND user_fi = " .
$ilDB->quote(
$user_id,
"integer");
4682 $sql .=
" AND anonymous_id = " .
$ilDB->quote($anonymous_code,
"text");
4684 $result =
$ilDB->query($sql);
4685 if ($result->numRows() === 0) {
4688 $row =
$ilDB->fetchAssoc($result);
4689 return (
int) $row[
"state"];
4702 ?
string $a_code =
null
4704 $ilUser = $this->
user;
4708 if (!$this->isAccessibleWithoutCode()) {
4711 if ($this->feature_config->usesAppraisees() &&
4715 $code = $this->data_manager->code(
"")
4717 $this->code_manager->add($code);
4718 $a_code = $this->code_manager->getByUserId(
$user_id);
4724 $this->getAnonymize() === self::ANONYMIZE_FREEACCESS) {
4729 $code = $this->data_manager->code(
"")
4731 $code_id = $this->code_manager->add($code);
4732 $a_code = $this->code_manager->getByCodeId($code_id);
4741 $sql =
"SELECT * FROM svy_finished" .
4742 " WHERE survey_fi = " .
$ilDB->quote($this->getSurveyId(),
"integer");
4745 $sql .=
" AND (user_fi = " .
$ilDB->quote(
$user_id,
"integer") .
4746 " OR anonymous_id = " .
$ilDB->quote($a_code,
"text") .
")";
4750 $sql .=
" AND anonymous_id = " .
$ilDB->quote($a_code,
"text");
4752 $set =
$ilDB->query($sql);
4753 while ($row =
$ilDB->fetchAssoc($set)) {
4754 $res[$row[
"finished_id"]] = array(
"appr_id" => $row[
"appr_id"],
4755 "user_id" => $row[
"user_fi"],
4756 "code" => $row[
"anonymous_id"],
4757 "finished" => (
bool) $row[
"state"]);
4759 return array(
"code" => $a_code,
"runs" =>
$res);
4771 $set =
$ilDB->query(
"SELECT sf.anonymous_id FROM svy_finished sf" .
4772 " WHERE sf.survey_fi = " .
$ilDB->quote($this->getSurveyId(),
"integer") .
4773 " AND sf.user_fi = " .
$ilDB->quote($a_user_id,
"integer"));
4774 $a_code =
$ilDB->fetchAssoc($set);
4775 return (
string) ($a_code[
"anonymous_id"] ??
"");
4789 $set =
$ilDB->query(
"SELECT user_fi FROM svy_finished" .
4790 " WHERE survey_fi = " .
$ilDB->quote($this->getSurveyId(),
"integer") .
4791 " AND anonymous_id = " .
$ilDB->quote($a_code,
"text"));
4807 bool $a_exclude_appraisee =
false
4813 $set =
$ilDB->query(
"SELECT finished_id, user_fi FROM svy_finished" .
4814 " WHERE survey_fi = " .
$ilDB->quote($this->getSurveyId(),
"integer") .
4815 " AND appr_id = " .
$ilDB->quote($a_appr_id,
"integer"));
4816 while ($row =
$ilDB->fetchAssoc($set)) {
4817 if ($a_exclude_appraisee && $row[
"user_fi"] == $a_appr_id) {
4820 $res[] = (
int) $row[
"finished_id"];
4836 $set =
$ilDB->query(
"SELECT finished_id, user_fi FROM svy_finished" .
4837 " WHERE survey_fi = " .
$ilDB->quote($this->getSurveyId(),
"integer") .
4838 " AND appr_id = " .
$ilDB->quote($a_appr_id,
"integer") .
4839 " AND user_fi = " .
$ilDB->quote($a_rat_id,
"integer"));
4840 if ($row =
$ilDB->fetchAssoc($set)) {
4841 return (
int) $row[
"finished_id"];
4851 $this->mode_skill_service = $a_val;
4856 return $this->mode_skill_service;
4863 int $a_appraisee_id,
4865 int $a_anonymous_id,
4866 ?
int $a_tstamp =
null
4874 $ilDB->manipulate(
"UPDATE svy_360_rater" .
4875 " SET mail_sent = " .
$ilDB->quote($a_tstamp,
"integer") .
4876 " WHERE obj_id = " .
$ilDB->quote($this->getSurveyId(),
"integer") .
4877 " AND appr_id = " .
$ilDB->quote($a_appraisee_id,
"integer") .
4878 " AND user_id = " .
$ilDB->quote($a_user_id,
"integer") .
4879 " AND anonymous_id = " .
$ilDB->quote($a_anonymous_id,
"integer"));
4891 $user =
$DIC->user();
4894 $ilDB->manipulate(
"UPDATE svy_360_appr" .
4895 " SET has_closed = " .
$ilDB->quote(time(),
"integer") .
4896 " WHERE obj_id = " .
$ilDB->quote($this->getSurveyId(),
"integer") .
4897 " AND user_id = " .
$ilDB->quote($a_user_id,
"integer"));
4901 if ($this->getSkillService() && $skmg_set->isActivated()) {
4903 $sskill->writeAndAddAppraiseeSkills($a_user_id);
4907 if ($user->
getId() !== $a_user_id) {
4908 $this->sendAppraiseeCloseNotification($a_user_id);
4919 $ilDB->manipulate(
"UPDATE svy_360_appr" .
4920 " SET has_closed = " .
$ilDB->quote(
null,
"integer") .
4921 " WHERE obj_id = " .
$ilDB->quote($this->getSurveyId(),
"integer"));
4927 public static function validateExternalRaterCode(
4934 $anonym_repo =
$DIC->survey()
4940 if (!$anonym_repo->isExternalRaterValidated($a_ref_id)) {
4941 $svy =
new self($a_ref_id);
4944 $domain_service =
$DIC->survey()->internal()->domain();
4945 $code_manager = $domain_service->code($svy, 0);
4946 $feature_config = $domain_service->modeFeatureConfig($svy->getMode());
4947 $access_manager = $domain_service->access($a_ref_id, 0);
4949 if ($access_manager->canStartSurvey() &&
4951 $code_manager->exists($a_code)) {
4952 $anonymous_id = $svy->getAnonymousIdByCode($a_code);
4953 if ($anonymous_id) {
4954 if (count($svy->getAppraiseesToRate(
null, $anonymous_id))) {
4955 $anonym_repo->setExternalRaterValidation($a_ref_id,
true);
4960 $anonym_repo->setExternalRaterValidation($a_ref_id,
false);
4964 return $anonym_repo->isExternalRaterValidated($a_ref_id);
4974 return $this->reminder_status;
4979 $this->reminder_status = $a_value;
4984 return $this->reminder_start;
4989 $this->reminder_start = $a_value;
4994 return $this->reminder_end;
4999 $this->reminder_end = $a_value;
5004 return $this->reminder_frequency;
5009 $this->reminder_frequency = $a_value;
5014 return $this->reminder_target;
5019 $this->reminder_target = $a_value;
5024 return $this->reminder_last_sent;
5029 if ($a_value ==
"") {
5032 $this->reminder_last_sent = $a_value;
5036 bool $selectDefault =
false
5038 if ($selectDefault) {
5039 $defaultTemplateId = 0;
5040 $this->getReminderMailTemplates($defaultTemplateId);
5042 if ($defaultTemplateId > 0) {
5043 return $defaultTemplateId;
5047 return $this->reminder_tmpl;
5052 $this->reminder_tmpl = $a_value;
5057 return $this->tutor_ntf_status;
5065 $this->tutor_ntf_status = $a_value;
5073 return $this->tutor_ntf_recipients;
5081 $this->tutor_ntf_recipients = $a_value;
5092 return $this->tutor_ntf_target;
5097 $this->tutor_ntf_target = $a_value;
5102 return $this->tutor_res_status;
5107 $this->tutor_res_status = $a_value;
5112 return $this->tutor_res_recipients;
5117 $this->tutor_res_recipients = $a_value;
5128 if ($this->getTutorNotificationStatus()) {
5131 $user_ids = $this->getNotificationTargetUserIds(($this->getTutorNotificationTarget() === self::NOTIFICATION_INVITED_USERS));
5133 $set =
$ilDB->query(
"SELECT COUNT(*) numall FROM svy_finished" .
5134 " WHERE survey_fi = " .
$ilDB->quote($this->getSurveyId(),
"integer") .
5135 " AND state = " .
$ilDB->quote(1,
"integer") .
5136 " AND " .
$ilDB->in(
"user_fi", $user_ids,
"",
"integer"));
5137 $row =
$ilDB->fetchAssoc($set);
5140 if ((
int) $row[
"numall"] === count($user_ids)) {
5141 $this->sendTutorNotification();
5154 $access =
$DIC->access();
5156 $rater_ids = array();
5157 foreach ($this->getAppraiseesData() as $app) {
5158 $this->svy_log->debug(
"Handle appraisee " . $app[
'user_id']);
5160 if (!$this->isAppraiseeClosed($app[
'user_id'])) {
5161 $this->svy_log->debug(
"Check self evaluation, self: " . $this->get360SelfAppraisee() .
", target: " . $this->getReminderTarget());
5164 if ($this->get360SelfEvaluation() &&
5165 in_array($this->getReminderTarget(), array(self::NOTIFICATION_APPRAISEES, self::NOTIFICATION_APPRAISEES_AND_RATERS))) {
5166 $this->svy_log->debug(
"...1");
5168 if (!$this->is360SurveyStarted((
int) $app[
'user_id'], (
int) $app[
'user_id'])) {
5169 $this->svy_log->debug(
"...2");
5170 if (!isset($rater_ids[$app[
'user_id']])) {
5171 $rater_ids[$app[
'user_id']] = array();
5173 if (!isset($app[
"user_id"], $rater_ids[$app[
'user_id']])) {
5174 $rater_ids[$app[
'user_id']][] = $app[
"user_id"];
5179 $this->svy_log->debug(
"Check raters.");
5184 $this->getReminderTarget(),
5185 array(self::NOTIFICATION_RATERS, self::NOTIFICATION_APPRAISEES_AND_RATERS),
5189 foreach ($this->getRatersData($app[
'user_id']) as $rater) {
5191 if ($rater[
"login"] !==
"") {
5194 if ($rater_id > 0) {
5196 if (!($rater[
"anonymous_id"] ??
false) && !($rater[
"finished"] ??
false)) {
5197 if (!isset($rater_ids[$rater_id])) {
5198 $rater_ids[$rater_id] = array();
5200 if (!in_array($app[
"user_id"], $rater_ids[$rater_id])) {
5201 $rater_ids[$rater_id][] = $app[
"user_id"];
5210 $this->svy_log->debug(
"Found raters:" . count($rater_ids));
5212 foreach ($rater_ids as
$id => $app) {
5214 $this->send360ReminderToUser((
int)
$id, $app);
5221 array $a_appraisee_ids
5223 $this->svy_log->debug(
"Send mail to:" . $a_user_id);
5226 $ntf->setLangModules(array(
"svy",
"survey"));
5227 $ntf->setRefId($this->getRefId());
5228 $ntf->setGotoLangId(
'url');
5231 $lng = $ntf->getUserLanguage($a_user_id);
5233 $ntf->setIntroductionLangId(
"svy_user_added_rater_reminder_mail");
5234 $subject = str_replace(
"%1", $this->
getTitle(),
$lng->txt(
"svy_user_added_rater"));
5236 foreach ($a_appraisee_ids as $appraisee_id) {
5247 $ntf->composeAndGetMessage($a_user_id,
null,
"read",
true),
5262 $tree = $this->tree;
5265 if ($a_use_invited) {
5266 $user_ids = $this->invitation_manager->getAllForSurvey($this->getSurveyId());
5268 $parent_grp_ref_id = $tree->checkForParentType($this->getRefId(),
"grp");
5269 if ($parent_grp_ref_id) {
5271 $user_ids = $part->getMembers();
5273 $parent_crs_ref_id = $tree->checkForParentType($this->getRefId(),
"crs");
5274 if ($parent_crs_ref_id) {
5276 $user_ids = $part->getMembers();
5291 foreach ($this->getTutorNotificationRecipients() as
$user_id) {
5294 $ulng->loadLanguageModule(
'survey');
5296 $subject = sprintf($ulng->txt(
'survey_notification_tutor_subject'), $this->getTitle());
5299 $message .= $ulng->txt(
'survey_notification_tutor_body') .
":\n\n";
5301 $message .=
"\n" . $ulng->txt(
'survey_notification_tutor_link') .
": " . $link;
5304 $mail_obj->appendInstallationSignature(
true);
5319 $ilAccess = $this->access;
5322 $now_with_format = date(
"YmdHis", $now);
5323 $today = date(
"Y-m-d");
5325 $this->svy_log->debug(
"Check status and dates.");
5329 $this->getOfflineStatus() ||
5330 !$this->getReminderStatus() ||
5331 ($this->getStartDate() && $now_with_format < $this->getStartDate()) ||
5332 ($this->getEndDate() && $now_with_format > $this->getEndDate())) {
5337 $start = $this->getReminderStart();
5341 $end = $this->getReminderEnd();
5345 if ($today < $start ||
5346 ($end && $today > $end)) {
5350 $this->svy_log->debug(
"Check access period.");
5355 ($now < $item_data[
"timing_start"] ||
5356 $now > $item_data[
"timing_end"])) {
5360 $this->svy_log->debug(
"Check frequency.");
5364 $cut->increment(
IL_CAL_DAY, $this->getReminderFrequency() * -1);
5365 if (!$this->getReminderLastSent() ||
5366 $cut->get(
IL_CAL_DATE) >= substr($this->getReminderLastSent(), 0, 10)) {
5367 $missing_ids = array();
5368 if (!$this->feature_config->usesAppraisees()) {
5369 $this->svy_log->debug(
"Entering survey mode.");
5372 $user_ids = $this->getNotificationTargetUserIds(($this->getReminderTarget() === self::NOTIFICATION_INVITED_USERS));
5375 $finished_ids = array();
5376 $set =
$ilDB->query(
"SELECT user_fi FROM svy_finished" .
5377 " WHERE survey_fi = " .
$ilDB->quote($this->getSurveyId(),
"integer") .
5378 " AND state = " .
$ilDB->quote(1,
"text") .
5379 " AND " .
$ilDB->in(
"user_fi", $user_ids,
"",
"integer"));
5380 while ($row =
$ilDB->fetchAssoc($set)) {
5381 $finished_ids[] = $row[
"user_fi"];
5385 $missing_ids = array_diff($user_ids, $finished_ids);
5387 foreach ($missing_ids as $idx =>
$user_id) {
5389 if (!$ilAccess->checkAccessOfUser(
$user_id,
"read",
"", $this->getRefId(),
"svy", $this->getId())) {
5390 unset($missing_ids[$idx]);
5395 $this->sentReminder($missing_ids);
5399 $this->svy_log->debug(
"Entering 360 mode.");
5401 $this->sent360Reminders();
5405 $this->setReminderLastSent($today);
5408 return count($missing_ids);
5414 protected function sentReminder(
5415 array $a_recipient_ids
5422 if ($this->getReminderTemplate() &&
5423 array_key_exists($this->getReminderTemplate(), $this->getReminderMailTemplates())) {
5425 $templateService =
$DIC->mail()->textTemplates();
5426 $tmpl = $templateService->loadTemplateForId($this->getReminderTemplate());
5428 $tmpl_params = array(
5429 "ref_id" => $this->getRefId(),
5434 $tmpl_params =
null;
5438 foreach ($a_recipient_ids as
$user_id) {
5440 $subject = $tmpl->getSubject();
5441 $message = $this->sentReminderPlaceholders($tmpl->getMessage(),
$user_id, $tmpl_params);
5447 $ulng->loadLanguageModule(
'survey');
5449 $subject = sprintf($ulng->txt(
'survey_reminder_subject'), $this->getTitle());
5452 $message .= $ulng->txt(
'survey_reminder_body') .
":\n\n";
5454 $message .=
"\n" . $ulng->txt(
'survey_reminder_link') .
": " . $link;
5458 $mail_obj->appendInstallationSignature(
true);
5471 ?
int $starting_time =
null
5473 $this->activation_starting_time = $starting_time;
5477 ?
int $ending_time =
null
5479 $this->activation_ending_time = $ending_time;
5484 return $this->activation_starting_time;
5489 return $this->activation_ending_time;
5494 $this->view_own_results = $a_value;
5499 return $this->view_own_results;
5504 $this->mail_own_results = $a_value;
5509 return $this->mail_own_results;
5514 $this->mail_confirmation = $a_value;
5519 return $this->mail_confirmation;
5524 $this->anon_user_list = $a_value;
5529 return $this->anon_user_list;
5540 $surveySetting =
new ilSetting(
"survey");
5541 if (!$surveySetting->get(
"skipped_is_custom",
false)) {
5542 return $lng->txt(
"skipped");
5544 return $surveySetting->get(
"skipped_custom_value",
"");
5549 ?
int &$defaultTemplateId =
null
5555 $templateService =
$DIC->mail()->textTemplates();
5557 $res[$tmpl->getTplId()] = $tmpl->getTitle();
5558 if (
null !== $defaultTemplateId && $tmpl->isDefault()) {
5559 $defaultTemplateId = $tmpl->getTplId();
5569 array $a_context_params
5575 $user = new \ilObjUser($a_user_id);
5577 $a_message = $this->placeholder_resolver->resolve(
$context, $a_message, $user, $a_context_params);
5578 }
catch (\Exception
$e) {
5587 $this->mode = $a_value;
5597 $this->mode_self_eval_results = $a_value;
5602 return $this->mode_self_eval_results;
5617 $q =
"SELECT obj_fi FROM svy_svy" .
5618 " WHERE tutor_res_cron IS NULL" .
5619 " AND tutor_res_status = " .
$ilDB->quote(1,
"integer") .
5620 " AND enddate < " .
$ilDB->quote(date(
"Ymd000000"),
"text");
5623 $q =
"SELECT obj_fi FROM svy_svy" .
5624 " WHERE tutor_res_status = " .
$ilDB->quote(1,
"integer") .
5625 " AND enddate < " .
$ilDB->quote(date(
"Ymd000000"),
"text");
5632 while ($row =
$ilDB->fetchAssoc($set)) {
5633 $res[] = (
int) $row[
"obj_fi"];
5643 $sum_score += call_user_func([
$c,
"getMaxSumScore"], $this->getSurveyId());
$id
plugin.php for ilComponentBuildPluginInfoObjectiveTest::testAddPlugins
Basic class for all survey question types The SurveyQuestionGUI class defines and encapsulates basic ...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static _getOriginalId(int $question_id, bool $a_return_question_id_if_no_original=true)
Returns the original id of a question.
static _instanciateQuestionEvaluation(int $question_id, ?array $a_finished_ids=null)
static _includeClass(string $question_type, int $gui=0)
Include the php class file for a given question type.
static _getQuestionType(int $question_id)
Returns the question type of a question with a given id.
static _isComplete(int $question_id)
Checks whether the question is complete or not.
static sortArray(array $array, string $a_array_sortby_key, string $a_array_sortorder="asc", bool $a_numeric=false, bool $a_keep_keys=false)
static _getInstance(int $a_copy_id)
@classDescription Date and time handling
static makeDirParents(string $a_dir)
Create a new directory and all parent directories.
static makeDir(string $a_dir)
creates a new directory and inherits all filesystem permissions of the parent directory You may pass ...
static delDir(string $a_dir, bool $a_clean_only=false)
removes a dir and all its content (subdirs and files) recursively
static getDataDir()
get data directory (outside webspace)
static moveUploadedFile(string $a_file, string $a_name, string $a_target, bool $a_raise_errors=true, string $a_mode="move_uploaded")
move uploaded file
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static _getLanguageOfUser(int $a_usr_id)
Get language object of user.
txt(string $a_topic, string $a_default_lang_fallback_mod="")
gets the text for a given topic if the topic is not in the list, the topic itself with "-" will be re...
static _getStaticLink(?int $a_ref_id, string $a_type='', bool $a_fallback_goto=true, string $append="")
static getLogger(string $a_component_id)
Get component logger.
Component logger with individual log levels by component id.
setLangModules(array $a_modules)
Class ilObjSurveyQuestionPool.
static _getQuestionClasses()
static _getQuestionTypeTranslations()
set360SelfAppraisee(bool $a_value)
sendRaterNotification(int $a_user_id, int $a_appraisee_id)
string $author
A text representation of the authors name.
isAccessibleWithoutCode()
isUnusedCode(string $a_code, int $a_user_id)
Participants InvitationsManager $invitation_manager
addMaterialTag(ilXmlWriter $a_xml_writer, string $a_material, bool $close_material_tag=true, bool $add_mobs=true, ?array $attribs=null)
Creates an XML material tag from a plain text or xhtml text.
getSurveyPages()
Returns the survey pages in an array (a page contains one or more questions)
getNextPage(int $active_page_question_id, int $direction)
Get current, previous or next page.
removeQuestionFromBlock(int $question_id, int $questionblock_id)
addRater(int $a_appraisee_id, int $a_user_id, int $a_anonymous_id=0)
isSurveyCodeUsed(string $code)
setEndDateAndTime(string $end_date, string $end_time)
importSurveyCode(string $a_anonymize_key, int $a_created, array $a_data)
const EVALUATION_ACCESS_PARTICIPANTS
isSurveyFinishedByCode(string $a_code)
Get if survey is finished for a specific anonymous user code.
const RESULTS_SELF_EVAL_NONE
setStartDateAndTime(string $start_date, string $start_time)
getExternalCodeRecipients(bool $a_check_finished=false)
Mode FeatureConfig $feature_config
removeQuestion(int $question_id)
setAnonymousUserList(bool $a_value)
closeAppraisee(int $a_user_id)
bool $calculate_sum_score
moveQuestions(array $move_questions, int $target_index, int $insert_mode)
Move questions and/or questionblocks to another position.
getFinishedIdForAppraiseeIdAndRaterId(int $a_appr_id, int $a_rat_id)
Get finished id for an appraisee and a rater.
addAppraisee(int $a_user_id)
getUserSpecificResults(array $finished_ids)
Calculates the evaluation data for the user specific results.
getQuestionblockQuestions(int $questionblock_id)
getSurveyFinishedIds()
Get run ids.
setReminderStatus(bool $a_value)
sendNotificationMail(int $a_user_id, string $a_anonymize_id, int $a_appr_id=0)
These mails are sent to tutors for each single participant that finishes a survey.
string $mailparticipantdata
getActivationVisibility()
getTextblock(int $question_id)
int $activation_ending_time
setSelfEvaluationResults(int $a_value)
setTutorNotificationStatus(bool $a_value)
Activates mail being sent to tutors after all participants have finished the survey.
prepareTextareaOutput(string $txt_output)
Prepares a string for a text area output in surveys.
createImportDirectory()
creates data directory for import files (data_dir/svy_data/svy_<id>/import)
static _addQuestionblock(string $title="", int $owner=0, bool $show_questiontext=true, bool $show_blocktitle=false, bool $compress_view=false)
is360SurveyStarted(int $appr_id, int $user_id, ?string $anonymous_code=null)
getAvailableQuestionpools(bool $use_obj_id=false, bool $could_be_offline=false, bool $showPath=false, string $permission="read")
Returns the available question pools for the active user.
__construct(int $a_id=0, bool $a_call_by_reference=true)
getUserSettings(int $usr_id, string $key)
setReminderLastSent(?string $a_value)
getSurveyCodesTableData(?array $ids=null, ?string $lang=null)
Fetches the data for the survey codes table.
array $tutor_res_recipients
isQuestionInSurvey(int $a_question_fi)
set360Results(int $a_value)
getEvaluationByUser(array $questions, int $active_id)
Calculates the evaluation data for a given run.
set360RaterSent(int $a_appraisee_id, int $a_user_id, int $a_anonymous_id, ?int $a_tstamp=null)
setSurveyId(int $survey_id)
isQuestionInAnyBlock(int $a_question_fi)
sendAppraiseeNotification(int $a_user_id)
static _getQuestionblock(int $questionblock_id)
get question block properties
locateImportFiles(string $a_dir)
Locates the import directory and the xml file in a directory with an unzipped import file.
getTutorNotificationRecipients()
Mail being sent to tutors after all participants have finished the survey?
getSurveyQuestions(bool $with_answers=false)
Returns the survey questions and questionblocks in an array.
setOutro(string $outro="")
getSelfEvaluationResults()
int $activation_starting_time
addQuestion(int $question_id)
Adds a question to the survey (used in importer!)
setTutorResultsRecipients(array $a_value)
const NOTIFICATION_INVITED_USERS
const RESULTS_SELF_EVAL_ALL
updateConstraint(int $precondition_id, int $if_question_id, int $relation, float $value, int $conjunction)
getExistingQuestions()
Gets the question id's of the questions which are already in the survey.
deleteConstraint(int $constraint_id)
Deletes a single constraint.
setReminderTemplate(?int $a_value)
setSkillService(bool $a_val)
removeSelectedSurveyResults(array $finished_ids)
Deletes the user data of a given array of survey participants.
saveUserAccessCode(int $user_id, string $access_code)
Saves a survey access code for a registered user to the database.
setObligatoryStates(array $obligatory_questions)
Sets the obligatory states for questions in a survey from the questions form.
setActivationEndDate(?int $ending_time=null)
setIntroduction(string $introduction="")
setEndDate(string $end_date="")
ilPluginAdmin $plugin_admin
sendCodes(int $not_sent, string $subject, string $message, string $lang)
setStartDate(string $start_date="")
getQuestionblocksTable(array $arrFilter)
Retrieve data for question block browser.
getUserAccessCode(int $user_id)
Returns a survey access code that was saved for a registered user.
const NOTIFICATION_PARENT_COURSE
const EVALUATION_ACCESS_ALL
isRater(int $a_appraisee_id, int $a_user_id, int $a_anonymous_id=0)
InternalDomainService $domain
bool $activation_visibility
deleteWorkingData(int $question_id, int $active_id)
Deletes the working data of a question in the database.
int $mode_self_eval_results
getQuestionsTable(array $arrFilter)
Retrieve data for question browser.
insertQuestionblock(int $questionblock_id)
getUserDataFromActiveId(int $active_id, bool $force_non_anonymous=false)
Returns run information.
getUserData(array $ids)
Returns a data of all users specified by id list.
getTutorNotificationTarget()
Group that is checked for the "all participants have finished" mail Either a) all members of a parent...
getNotificationTargetUserIds(bool $a_use_invited)
These users must finish the survey to trigger the tutor notification "all users finished the survey" ...
ILIAS SurveyQuestionPool Export ImportManager $import_manager
getFinishedIdsForAppraiseeId(int $a_appr_id, bool $a_exclude_appraisee=false)
const QUESTIONTITLES_VISIBLE
getLastActivePage(int $active_id)
Returns the question id of the last active page a user visited in a survey.
deleteSurveyCode(string $survey_code)
setReminderFrequency(int $a_value)
setShowQuestionTitles(bool $a_show)
toXML()
Returns a QTI xml representation of the survey.
setActivationStartDate(?int $starting_time=null)
getAnonymousIdByCode(string $a_code)
getLastAccess(int $finished_id)
sendTutorNotification()
Send mail to tutors after all participants have finished the survey.
getReminderTemplate(bool $selectDefault=false)
loadWorkingData(int $question_id, int $active_id)
Gets the given answer data of a question in a run.
deleteConstraints(int $question_id)
Deletes the constraints for a question.
getQuestionpoolTitles(bool $could_be_offline=false, bool $showPath=false)
Returns the available question pools for the active user.
const NOTIFICATION_APPRAISEES_AND_RATERS
setPage(int $finished_id, int $page_id)
Sets the number of the active survey page.
static getSurveysWithTutorResults()
static _getConstraints(int $survey_id)
saveUserSettings(int $usr_id, string $key, string $title, string $value)
const ANONYMIZE_FREEACCESS
int $survey_id
A unique positive numerical ID which identifies the survey.
saveHeading(string $heading, int $insertbefore)
updateOrder(array $a_order)
getQuestionType(int $question_id)
deleteUserSettings(int $id)
addConstraintToQuestion(int $to_question_id, int $constraint_id)
setTutorResultsStatus(bool $a_value)
getTutorResultsRecipients()
updateConjunctionForQuestions(array $questions, int $conjunction)
setActivationVisibility(bool $a_value)
static _hasDatasets(int $survey_id)
deleteAllUserData(bool $reset_LP=true)
Deletes all user data of a survey.
getMailParticipantData()
Preceding text (incl.
setMailNotification(bool $a_notification)
Activate mail to tutors each time a participant finishes the survey.
getAllRelations(bool $short_as_key=false)
sendAppraiseeCloseNotification(int $a_user_id)
int $display_question_titles
deleteAppraisee(int $a_user_id)
getMailAddresses()
(Tutor) Recipients of "single participant has finished" mails
setTutorNotificationRecipients(array $a_value)
Set tutor recipients for "all participants have finished" mail.
isComplete()
Check if survey is complete for use.
getSurveyParticipants(?array $finished_ids=null, bool $force_non_anonymous=false, bool $include_invites=false)
setReminderTarget(int $a_value)
getQuestionblockQuestionIds(int $questionblock_id)
ilMailTemplatePlaceholderResolver $placeholder_resolver
addConstraint(int $if_question_id, int $relation, float $value, int $conjunction)
Adds a constraint.
getQuestionGUI(string $questiontype, int $question_id)
getActiveID(int $user_id, string $anonymize_id, int $appr_id)
Get run id.
getConstraints(int $question_id)
Returns the constraints to a given question or questionblock.
saveAuthorToMetadata(string $a_author="")
Saves an authors name into the lifecycle metadata if no lifecycle metadata exists This will only be c...
checkTutorNotification()
Check, if mail to tutors after all participants have finished the survey should be sent.
getWorkingtimeForParticipant(int $finished_id)
findCodeForUser(int $a_user_id)
deleteRater(int $a_appraisee_id, int $a_user_id, int $a_anonymous_id=0)
saveCompletionStatus()
Saves the completion status of the survey.
static getSurveySkippedValue()
getSurveyCodesForExport(?array $a_codes=null, ?array $a_ids=null)
Return a list of survey codes for file export, note: user_key needs to be null to export a record.
const EVALUATION_ACCESS_OFF
static _instanciateQuestion(int $question_id)
Creates an instance of a question with a given question id.
createReference()
creates reference for object
updateCode(int $a_id, string $a_email, string $a_last_name, string $a_first_name, int $a_sent)
setMailParticipantData(string $a_data)
Set preceding text (incl.
duplicateQuestionForSurvey(int $question_id, bool $a_force=false)
Takes a question and creates a copy of the question for use in the survey.
isHTML(string $a_text)
Checks if a given string contains HTML or not.
setCalculateSumScore(bool $a_val)
string $reminder_last_sent
modifyQuestionblock(int $questionblock_id, string $title, bool $show_questiontext, bool $show_blocktitle, bool $compress_view=false)
setTutorNotificationTarget(int $a_value)
setEvaluationAccess(string $evaluation_access=self::EVALUATION_ACCESS_OFF)
getImportDirectory()
get import directory of survey
deleteSurveyRecord()
Deletes the survey from the database.
createQuestionblock(string $title, bool $show_questiontext, bool $show_blocktitle, array $questions, bool $compress_view=false)
cloneTextblocks(array $mapping)
Clones the text blocks of survey questions.
isAppraiseeClosed(int $a_user_id)
const RESULTS_SELF_EVAL_OWN
sent360Reminders()
Send 360 reminders.
getTutorNotificationStatus()
finishSurvey(int $finished_id, int $appr_id=0)
Finishes the survey creating an entry in the database.
isAppraisee(int $a_user_id)
const NOTIFICATION_APPRAISEES
unfoldQuestionblocks(array $questionblocks)
setMailConfirmation(bool $a_value)
getParticipantTextResults(int $active_id)
isSurveyCodeUnique(string $code)
string $evaluation_access
setReminderStart(?ilDate $a_value=null)
getReminderMailTemplates(?int &$defaultTemplateId=null)
setReminderEnd(?ilDate $a_value=null)
setAnonymize(int $a_anonymize)
set anonymize status
removeConstraintsConcerningQuestion(int $question_id)
Remove constraints concerning a question with a given question_id.
importObject(array $file_info, int $svy_qpl_id)
addQuestionToBlock(int $question_id, int $questionblock_id)
removeQuestions(array $remove_questions, array $remove_questionblocks)
getAppraiseesToRate(?int $a_user_id, ?int $a_anonymous_id=null)
getUserSurveyExecutionStatus(?string $a_code=null)
Get current user execution status.
set360SelfRaters(bool $a_value)
getRatersData(int $a_appraisee_id)
getMailNotification()
Send mail to tutors each time a participant finishes the survey?
setMailAddresses(string $a_addresses)
Set (Tutor) Recipients of "single participant has finished" mails.
getPrecondition(int $constraint_id)
Returns a precondition with a given id.
checkConstraint(array $constraint_data, ?array $working_data)
Checks if a constraint is valid.
setActivationLimited(bool $a_value)
setPoolUsage(bool $a_value)
insertQuestion(int $question_id)
Inserts a question in the survey and saves the relation to the database.
setMailOwnResults(bool $a_value)
send360ReminderToUser(int $a_user_id, array $a_appraisee_ids)
array $tutor_ntf_recipients
set360SelfEvaluation(bool $a_value)
setViewOwnResults(bool $a_value)
createExportDirectory()
creates data directory for export files (data_dir/svy_data/svy_<id>/export)
const NOTIFICATION_RATERS
setAuthor(string $author="")
canExportSurveyCode()
Checks if the survey code can be exported with the survey evaluation.
ILIAS Survey InternalDataService $data_manager
getVariables(int $question_id)
Returns all variables (answer options/scale values) of a question.
isAnonymizedParticipant(string $key)
sentReminderPlaceholders(string $a_message, int $a_user_id, array $a_context_params)
ILIAS Survey Code CodeManager $code_manager
ILIAS Survey InternalService $survey_service
const QUESTIONTITLES_HIDDEN
static _lookupFullname(int $a_user_id)
getFullname(int $max_strlen=0)
static _getUserData(array $a_internalids)
static getUserIdsByEmail(string $a_email)
static _lookupName(int $a_user_id)
static _lookupId(string|array $a_user_str)
static _lookupLogin(int $a_user_id)
static _lookupEmail(int $a_user_id)
Class ilObjectActivation.
const TIMINGS_DEACTIVATED
static getItem(int $ref_id)
static getInstance(int $obj_id)
Class ilObject Basic functions for all objects.
setOfflineStatus(bool $status)
static _lookupObjId(int $ref_id)
static _lookupTitle(int $obj_id)
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static _getUsedHTMLTagsAsString(string $module='')
static _replaceMediaObjectImageSrc(string $a_text, int $a_direction=0, string $nic='')
Replaces image source from mob image urls with the mob id or replaces mob id with the correct image s...
Skill management settings.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
Handles survey reminder mail placeholders.
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
static getNamePresentation( $a_user_id, bool $a_user_image=false, bool $a_profile_link=false, string $a_profile_back_link='', bool $a_force_first_lastname=false, bool $a_omit_login=false, bool $a_sortable=true, bool $a_return_data_array=false, $a_ctrl_path=null)
Default behaviour is:
static is_email(string $a_email, ?ilMailRfc822AddressParserFactory $mailAddressParserFactory=null)
This preg-based function checks whether an e-mail address is formally valid.
static stripSlashes(string $a_str, bool $a_strip_html=true, string $a_allow="")
static _getObjectsByOperations( $a_obj_type, string $a_operation, int $a_usr_id=0, int $limit=0)
Get all objects of a specific type and check access This function is not recursive,...
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
xmlElement(string $tag, $attrs=null, $data=null, $encode=true, $escape=true)
Writes a basic element (no children, just textual content)
xmlEndTag(string $tag)
Writes an endtag.
return['delivery_method'=> 'php',]
This file is part of ILIAS, a powerful learning management system published by ILIAS open source e-Le...
usesAppraisees()
If raters rate single persons (appraisees) this mode is activated.
Interface ilAccessHandler This interface combines all available interfaces which can be called via gl...
checkAccessOfUser(int $a_user_id, string $a_permission, string $a_cmd, int $a_ref_id, string $a_type="", ?int $a_obj_id=null, ?int $a_tree_id=null)
check access for an object (provide $a_type and $a_obj_id if available for better performance)
if(! $DIC->user() ->getId()||!ilLTIConsumerAccess::hasCustomProviderCreationAccess()) $params
__construct(Container $dic, ilPlugin $plugin)
@inheritDoc
FeatureConfig $feature_config
if(!file_exists('../ilias.ini.php'))