|
|
|
|
@ -6,11 +6,8 @@ |
|
|
|
|
* @author unknown, the initial survey that did not make it in 1.8 because of bad code |
|
|
|
|
* @author Patrick Cool <patrick.cool@UGent.be>, Ghent University: cleanup, refactoring and rewriting large parts of the code |
|
|
|
|
* @author Julio Montoya Armas <gugli100@gmail.com>, Chamilo: Personality Test modification and rewriting large parts of the code as well |
|
|
|
|
* @version $Id: survey_list.php 10680 2007-01-11 21:26:23Z pcool $ |
|
|
|
|
* |
|
|
|
|
* @todo use quickforms for the forms |
|
|
|
|
* @todo use FormValidator for the forms |
|
|
|
|
* @todo check if the user already filled the survey and if this is the case then the answers have to be updated and not stored again. |
|
|
|
|
* alterantively we could not allow people from filling the survey twice. |
|
|
|
|
* @todo performance could be improved if not the survey_id was stored with the invitation but the survey_code |
|
|
|
|
*/ |
|
|
|
|
// Language file that needs to be included |
|
|
|
|
@ -68,16 +65,15 @@ $surveyCode = isset($_GET['scode']) ? Database::escape_string($_GET['scode']) : |
|
|
|
|
|
|
|
|
|
if ($surveyCode != "") { |
|
|
|
|
// Firstly we check if this survey is ready for anonymous use: |
|
|
|
|
$sqlAnonymous = "SELECT anonymous FROM $table_survey WHERE c_id = $course_id AND code ='".$surveyCode."'"; |
|
|
|
|
$resultAnonymous = Database::query($sqlAnonymous); |
|
|
|
|
$sql = "SELECT anonymous FROM $table_survey |
|
|
|
|
WHERE c_id = $course_id AND code ='".$surveyCode."'"; |
|
|
|
|
$resultAnonymous = Database::query($sql); |
|
|
|
|
$rowAnonymous = Database::fetch_array($resultAnonymous, 'ASSOC'); |
|
|
|
|
// If is anonymous and is not allowed to take the survey to anonymous users, forbid access: |
|
|
|
|
if (!isset($rowAnonymous['anonymous']) || ($rowAnonymous['anonymous'] == 0 && api_is_anonymous($_user['user_id'], true)) || count($rowAnonymous) == 0) { |
|
|
|
|
api_not_allowed(); |
|
|
|
|
} |
|
|
|
|
// If is anonymous and it is allowed to take the survey as anonymous, mark survey as anonymous: |
|
|
|
|
} else { |
|
|
|
|
//nothing to do |
|
|
|
|
// If is anonymous and it is allowed to take the survey as anonymous, mark survey as anonymous. |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// Header |
|
|
|
|
@ -95,7 +91,8 @@ $invitationcode = $_GET['invitationcode']; |
|
|
|
|
// Start auto-invitation feature FS#3403 (all-users-can-do-the-survey-URL handling) |
|
|
|
|
if ($invitationcode == 'auto' && isset($_GET['scode'])) { |
|
|
|
|
$userid = $_user['user_id']; |
|
|
|
|
$surveyCode = Database::escape_string($_GET['scode']); // Survey_code of the survey |
|
|
|
|
// Survey_code of the survey |
|
|
|
|
$surveyCode = Database::escape_string($_GET['scode']); |
|
|
|
|
if ($isAnonymous) { |
|
|
|
|
$autoInvitationcode = "auto-ANONY_".md5(time())."-$surveyCode"; |
|
|
|
|
} else { |
|
|
|
|
@ -110,9 +107,13 @@ if ($invitationcode == 'auto' && isset($_GET['scode'])) { |
|
|
|
|
// Check availability |
|
|
|
|
$row = Database :: fetch_array($result, 'ASSOC'); |
|
|
|
|
$tempdata = survey_manager :: get_survey($row['survey_id']); |
|
|
|
|
check_time_availability($tempdata); //exit if survey not available anymore |
|
|
|
|
//exit if survey not available anymore |
|
|
|
|
check_time_availability($tempdata); |
|
|
|
|
// Check for double invitation records (insert should be done once) |
|
|
|
|
$sql = "SELECT user from $table_survey_invitation WHERE c_id = $course_id AND invitation_code = '".Database::escape_string($autoInvitationcode)."'"; |
|
|
|
|
$sql = "SELECT user from $table_survey_invitation |
|
|
|
|
WHERE |
|
|
|
|
c_id = $course_id AND |
|
|
|
|
invitation_code = '".Database::escape_string($autoInvitationcode)."'"; |
|
|
|
|
$result = Database::query($sql); |
|
|
|
|
if (Database :: num_rows($result) == 0) { // Ok |
|
|
|
|
$sql = "INSERT INTO $table_survey_invitation (c_id, survey_code,user, invitation_code, invitation_date) "; |
|
|
|
|
@ -130,7 +131,7 @@ $sql = "SELECT * FROM $table_survey_invitation |
|
|
|
|
WHERE |
|
|
|
|
c_id = $course_id AND |
|
|
|
|
invitation_code = '".Database :: escape_string($invitationcode)."'"; |
|
|
|
|
$result = Database::query($sql); // false = suppress errors |
|
|
|
|
$result = Database::query($sql); |
|
|
|
|
if (Database::num_rows($result) < 1) { |
|
|
|
|
Display :: display_error_message(get_lang('WrongInvitationCode'), false); |
|
|
|
|
Display :: display_footer(); |
|
|
|
|
@ -140,7 +141,10 @@ if (Database::num_rows($result) < 1) { |
|
|
|
|
$survey_invitation = Database::fetch_array($result, 'ASSOC'); |
|
|
|
|
|
|
|
|
|
// Now we check if the user already filled the survey |
|
|
|
|
if ($isAnonymous && isset($_SESSION['surveyuser']) || ($survey_invitation['answered'] == 1 && !isset($_GET['user_id']))) { |
|
|
|
|
if ( !isset($_POST['finish_survey']) && |
|
|
|
|
($isAnonymous && isset($_SESSION['surveyuser'])) || |
|
|
|
|
($survey_invitation['answered'] == 1 && !isset($_GET['user_id'])) |
|
|
|
|
) { |
|
|
|
|
Display :: display_error_message(get_lang('YouAlreadyFilledThisSurvey'), false); |
|
|
|
|
Display :: display_footer(); |
|
|
|
|
exit; |
|
|
|
|
@ -158,7 +162,7 @@ if (Database::num_rows($result) > 1) { |
|
|
|
|
if ($_POST['language']) { |
|
|
|
|
$survey_invitation['survey_id'] = $_POST['language']; |
|
|
|
|
} else { |
|
|
|
|
echo '<form id="language" name="language" method="POST" action="'.api_get_self().'?course='.$_GET['course'].'&invitationcode='.$_GET['invitationcode'].'&cidReq='.$_GET['cidReq'].'">'; |
|
|
|
|
echo '<form id="language" name="language" method="POST" action="'.api_get_self().'?course='.Security::remove_XSS($_GET['course']).'&invitationcode='.Security::remove_XSS($_GET['invitationcode']).'&cidReq='.Security::remove_XSS($_GET['cidReq']).'">'; |
|
|
|
|
echo '<select name="language">'; |
|
|
|
|
while ($row = Database::fetch_array($result, 'ASSOC')) { |
|
|
|
|
echo '<option value="'.$row['survey_id'].'">'.$row['lang'].'</option>'; |
|
|
|
|
@ -181,7 +185,8 @@ $survey_data['survey_id'] = $survey_invitation['survey_id']; |
|
|
|
|
// Storing the answers |
|
|
|
|
if (count($_POST) > 0) { |
|
|
|
|
if ($survey_data['survey_type'] === '0') { |
|
|
|
|
// Getting all the types of the question (because of the special treatment of the score question type |
|
|
|
|
// Getting all the types of the question |
|
|
|
|
// (because of the special treatment of the score question type |
|
|
|
|
$sql = "SELECT * FROM $table_survey_question |
|
|
|
|
WHERE |
|
|
|
|
c_id = $course_id AND |
|
|
|
|
@ -199,11 +204,19 @@ if (count($_POST) > 0) { |
|
|
|
|
// Finding the question id by removing 'question' |
|
|
|
|
$survey_question_id = str_replace('question', '', $key); |
|
|
|
|
|
|
|
|
|
// If the post value is an array then we have a multiple response question or a scoring question type |
|
|
|
|
// remark: when it is a multiple response then the value of the array is the option_id |
|
|
|
|
// when it is a scoring question then the key of the array is the option_id and the value is the value |
|
|
|
|
/* If the post value is an array then we have a multiple response question or a scoring question type |
|
|
|
|
remark: when it is a multiple response then the value of the array is the option_id |
|
|
|
|
when it is a scoring question then the key of the array is the option_id and the value is the value |
|
|
|
|
*/ |
|
|
|
|
if (is_array($value)) { |
|
|
|
|
SurveyUtil::remove_answer($survey_invitation['user'], $survey_invitation['survey_id'], $survey_question_id, $course_id); |
|
|
|
|
|
|
|
|
|
SurveyUtil::remove_answer( |
|
|
|
|
$survey_invitation['user'], |
|
|
|
|
$survey_invitation['survey_id'], |
|
|
|
|
$survey_question_id, |
|
|
|
|
$course_id |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
foreach ($value as $answer_key => & $answer_value) { |
|
|
|
|
if ($types[$survey_question_id] == 'score') { |
|
|
|
|
$option_id = $answer_key; |
|
|
|
|
@ -212,7 +225,15 @@ if (count($_POST) > 0) { |
|
|
|
|
$option_id = $answer_value; |
|
|
|
|
$option_value = ''; |
|
|
|
|
} |
|
|
|
|
SurveyUtil::store_answer($survey_invitation['user'], $survey_invitation['survey_id'], $survey_question_id, $option_id, $option_value, $survey_data); |
|
|
|
|
|
|
|
|
|
SurveyUtil::store_answer( |
|
|
|
|
$survey_invitation['user'], |
|
|
|
|
$survey_invitation['survey_id'], |
|
|
|
|
$survey_question_id, |
|
|
|
|
$option_id, |
|
|
|
|
$option_value, |
|
|
|
|
$survey_data |
|
|
|
|
); |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
// All the other question types (open question, multiple choice, percentage, ...) |
|
|
|
|
@ -263,19 +284,33 @@ if (count($_POST) > 0) { |
|
|
|
|
// Finding the question id by removing 'question' |
|
|
|
|
$survey_question_id = str_replace('question', '', $key); |
|
|
|
|
// We select the correct answer and the puntuacion |
|
|
|
|
echo $sql = "SELECT value FROM $table_survey_question_option WHERE c_id = $course_id AND question_option_id='".Database::escape_string($value)."'"; |
|
|
|
|
$sql = "SELECT value FROM $table_survey_question_option |
|
|
|
|
WHERE c_id = $course_id AND question_option_id='".Database::escape_string($value)."'"; |
|
|
|
|
$result = Database::query($sql); |
|
|
|
|
$row = Database::fetch_array($result, 'ASSOC'); |
|
|
|
|
$option_value = $row['value']; |
|
|
|
|
//$option_value = 0; |
|
|
|
|
$survey_question_answer = $value; |
|
|
|
|
// We save the answer after making sure that a possible previous attempt is deleted |
|
|
|
|
SurveyUtil::remove_answer($survey_invitation['user'], $survey_invitation['survey_id'], $survey_question_id, $course_id); |
|
|
|
|
SurveyUtil::store_answer($survey_invitation['user'], $survey_invitation['survey_id'], $survey_question_id, $value, $option_value, $survey_data); |
|
|
|
|
//SurveyUtil::store_answer($user,$survey_id,$question_id, $option_id, $option_value, $survey_data); |
|
|
|
|
SurveyUtil::remove_answer( |
|
|
|
|
$survey_invitation['user'], |
|
|
|
|
$survey_invitation['survey_id'], |
|
|
|
|
$survey_question_id, |
|
|
|
|
$course_id |
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
SurveyUtil::store_answer( |
|
|
|
|
$survey_invitation['user'], |
|
|
|
|
$survey_invitation['survey_id'], |
|
|
|
|
$survey_question_id, |
|
|
|
|
$value, |
|
|
|
|
$option_value, |
|
|
|
|
$survey_data |
|
|
|
|
); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} else { // In case it's another type than 0 or 1 |
|
|
|
|
} else { |
|
|
|
|
// In case it's another type than 0 or 1 |
|
|
|
|
die(get_lang('ErrorSurveyTypeUnknown')); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
@ -483,7 +518,11 @@ if (isset($_POST['finish_survey'])) { |
|
|
|
|
Display::display_confirmation_message(get_lang('SurveyFinished')); |
|
|
|
|
echo $survey_data['survey_thanks']; |
|
|
|
|
|
|
|
|
|
survey_manager::update_survey_answered($survey_data, $survey_invitation['user'], $survey_invitation['survey_code']); |
|
|
|
|
survey_manager::update_survey_answered( |
|
|
|
|
$survey_data, |
|
|
|
|
$survey_invitation['user'], |
|
|
|
|
$survey_invitation['survey_code'] |
|
|
|
|
); |
|
|
|
|
unset($_SESSION['paged_questions']); |
|
|
|
|
unset($_SESSION['page_questions_sec']); |
|
|
|
|
Display :: display_footer(); |
|
|
|
|
@ -529,7 +568,7 @@ if (isset($_GET['show']) || isset($_POST['personality'])) { |
|
|
|
|
$_SESSION['_cid'] = $course_id; |
|
|
|
|
$_SESSION['_real_cid'] = $course_id; |
|
|
|
|
|
|
|
|
|
if (key_exists($_GET['show'], $paged_questions)) { |
|
|
|
|
if (array_key_exists($_GET['show'], $paged_questions)) { |
|
|
|
|
if (isset($_GET['user_id'])) { |
|
|
|
|
|
|
|
|
|
// Get the user into survey answer table (user or anonymus) |
|
|
|
|
@ -821,7 +860,10 @@ if (isset($_GET['show']) || isset($_POST['personality'])) { |
|
|
|
|
echo '</pre>'; |
|
|
|
|
*/ |
|
|
|
|
// Create the new select with the questions from the secondary phase |
|
|
|
|
if (empty($_SESSION['page_questions_sec']) && !is_array($_SESSION['page_questions_sec']) && count($_SESSION['page_questions_sec'] == 0)) { |
|
|
|
|
if (empty($_SESSION['page_questions_sec']) && |
|
|
|
|
!is_array($_SESSION['page_questions_sec']) && |
|
|
|
|
count($_SESSION['page_questions_sec'] == 0) |
|
|
|
|
) { |
|
|
|
|
|
|
|
|
|
$sql = "SELECT * FROM $table_survey_question |
|
|
|
|
WHERE |
|
|
|
|
@ -1026,9 +1068,8 @@ if (isset($_GET['show']) || isset($_POST['personality'])) { |
|
|
|
|
$questions[$row['sort']]['survey_group_sec1'] = $row['survey_group_sec1']; |
|
|
|
|
$questions[$row['sort']]['survey_group_sec2'] = $row['survey_group_sec2']; |
|
|
|
|
$questions[$row['sort']]['survey_group_pri'] = $row['survey_group_pri']; |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
// If the type is a page break we are finished loading the questions for this page |
|
|
|
|
else { |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
$counter++; |
|
|
|
|
@ -1121,16 +1162,8 @@ if ($survey_data['survey_type'] === '0') { |
|
|
|
|
$paged_questions_sec = array(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* echo '<br />'; |
|
|
|
|
echo 'num pages:'.$numberofpages; echo '<br />'; |
|
|
|
|
echo 'show :'.$show;echo '<br />'; |
|
|
|
|
echo 'personality :'.$personality; |
|
|
|
|
echo '<br />'; |
|
|
|
|
*/ |
|
|
|
|
//echo $show.' / '.$numberofpages.'<br />'; |
|
|
|
|
if ($personality == 0) |
|
|
|
|
if (($show <= $numberofpages) || !$_GET['show']) { //$show = $_GET['show'] + 1 |
|
|
|
|
//echo '<input type="submit" name="next_survey_page" value="' . get_lang('Next') . ' " class="next" />'; |
|
|
|
|
if ($personality == 0) { |
|
|
|
|
if (($show <= $numberofpages) || !$_GET['show']) { |
|
|
|
|
echo '<button type="submit" name="next_survey_page" class="next">'.get_lang('Next').'</button>'; |
|
|
|
|
if ($survey_data['one_question_per_page'] == 0) { |
|
|
|
|
if ($personality >= 0) { |
|
|
|
|
@ -1146,17 +1179,10 @@ if ($survey_data['survey_type'] === '0') { |
|
|
|
|
echo '<input type="hidden" name="personality" value="'.$personality.'">'; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if ($show > $numberofpages && $_GET['show'] && $personality == 0) { |
|
|
|
|
echo '<input type="hidden" name="personality" value="'.$personality.'">'; |
|
|
|
|
//$numberofpages = count($paged_questions); |
|
|
|
|
//echo $numberofpages = count($paged_questions_sec); |
|
|
|
|
//echo $personality.' / '.$numberofpages; |
|
|
|
|
//echo '<br />'; |
|
|
|
|
//if ($personality > count($paged_questions_sec) - 1) |
|
|
|
|
//|| $numberofpages == $show +$personality +1 |
|
|
|
|
//echo $show + $personality; |
|
|
|
|
//echo $numberofpages; |
|
|
|
|
} elseif ($personality > 0) { |
|
|
|
|
if ($survey_data['one_question_per_page'] == 1) { |
|
|
|
|
if ($show >= $numberofpages) { |
|
|
|
|
@ -1170,9 +1196,8 @@ if ($survey_data['survey_type'] === '0') { |
|
|
|
|
echo '<button type="submit" name="finish_survey" class="next">'.get_lang('FinishSurvey').'</button>'; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} elseif ($survey_data['form_fields'] == '') { |
|
|
|
|
// This is the case when the show_profile_form is true but there are not form_fields |
|
|
|
|
elseif ($survey_data['form_fields'] == '') { |
|
|
|
|
//echo '<input type="submit" name="next_survey_page" value="' . get_lang('Next') . ' " class="next" />'; |
|
|
|
|
echo '<button type="submit" name="next_survey_page" class="next">'.get_lang('Next').'</button>'; |
|
|
|
|
} elseif (!is_array($user_data)) { |
|
|
|
|
@ -1189,6 +1214,7 @@ Display :: display_footer(); |
|
|
|
|
* Check whether this survey has ended. If so, display message and exit rhis script |
|
|
|
|
*/ |
|
|
|
|
function check_time_availability($surv_data) { |
|
|
|
|
|
|
|
|
|
$start_date = mktime(0, 0, 0, substr($surv_data['start_date'], 5, 2), substr($surv_data['start_date'], 8, 2), substr($surv_data['start_date'], 0, 4)); |
|
|
|
|
$end_date = mktime(0, 0, 0, substr($surv_data['end_date'], 5, 2), substr($surv_data['end_date'], 8, 2), substr($surv_data['end_date'], 0, 4)); |
|
|
|
|
$cur_date = time(); |
|
|
|
|
|