Chamilo is a learning management system focused on ease of use and accessibility
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
chamilo-lms/main/survey/survey.lib.php

2037 lines
77 KiB

<?php
/* For licensing terms, see /license.txt */
use Chamilo\CourseBundle\Entity\CSurveyInvitation;
use Doctrine\Common\Collections\Criteria;
/**
* Class SurveyManager
* @package chamilo.survey
* @author Patrick Cool <patrick.cool@UGent.be>, Ghent University:
* cleanup, refactoring and rewriting large parts (if not all) of the code
* @author Julio Montoya <gugli100@gmail.com>, Personality Test modification
* and rewriting large parts of the code
* @author cfasanando
* @todo move this file to inc/lib
* @todo use consistent naming for the functions (save vs store for instance)
*/
class SurveyManager
{
/**
* @param $code
*
* @return string
*/
public static function generate_unique_code($code)
{
if (empty($code)) {
return false;
}
$course_id = api_get_course_int_id();
$table_survey = Database::get_course_table(TABLE_SURVEY);
$code = Database::escape_string($code);
$num = 0;
$new_code = $code;
while (true) {
$sql = "SELECT * FROM $table_survey
WHERE code = '$new_code' AND c_id = $course_id";
$result = Database::query($sql);
if (Database::num_rows($result)) {
$num++;
$new_code = $code.$num;
} else {
break;
}
}
return $code.$num;
}
/**
* Deletes all survey invitations of a user
* @param int $user_id
*
* @return boolean
* @assert ('') === false
*/
public static function delete_all_survey_invitations_by_user($user_id)
{
$user_id = intval($user_id);
if (empty($user_id)) {
return false;
}
$table_survey_invitation = Database::get_course_table(TABLE_SURVEY_INVITATION);
$table_survey = Database::get_course_table(TABLE_SURVEY);
$sql = "SELECT survey_invitation_id, survey_code
FROM $table_survey_invitation WHERE user = '$user_id' AND c_id <> 0 ";
$result = Database::query($sql);
while ($row = Database::fetch_array($result, 'ASSOC')) {
$survey_invitation_id = $row['survey_invitation_id'];
$survey_code = $row['survey_code'];
$sql2 = "DELETE FROM $table_survey_invitation
WHERE survey_invitation_id = '$survey_invitation_id' AND c_id <> 0";
if (Database::query($sql2)) {
$sql3 = "UPDATE $table_survey SET
invited = invited-1
WHERE c_id <> 0 AND code ='$survey_code'";
Database::query($sql3);
}
}
}
/**
*
* @param string $course_code
* @param int $session_id
*
* @return array
* @assert ('') === false
*/
public static function get_surveys($course_code, $session_id = 0)
{
$table_survey = Database::get_course_table(TABLE_SURVEY);
if (empty($course_code)) {
return false;
}
$course_info = api_get_course_info($course_code);
if (empty($course_info)) {
return false;
}
$session_condition = api_get_session_condition($session_id, true, true);
$sql = "SELECT * FROM $table_survey
WHERE c_id = {$course_info['real_id']} $session_condition ";
$result = Database::query($sql);
$result = Database::store_result($result, 'ASSOC');
return $result;
}
/**
* Retrieves all the survey information
*
* @param integer $survey_id the id of the survey
* @param boolean $shared this parameter determines if
* we have to get the information of a survey from the central (shared) database or from the
* course database
* @param string course code optional
*
* @author Patrick Cool <patrick.cool@UGent.be>, Ghent University
* @version February 2007
* @assert ('') === false
* @return array
*
* @todo this is the same function as in create_new_survey.php
*/
public static function get_survey(
$survey_id,
$shared = 0,
$course_code = '',
$simple_return = false
) {
// Table definition
if (!empty($course_code)) {
$my_course_id = $course_code;
} elseif (isset($_GET['course'])) {
$my_course_id = Security::remove_XSS($_GET['course']);
} else {
$my_course_id = api_get_course_id();
}
$courseInfo = api_get_course_info($my_course_id);
$table_survey = Database::get_course_table(TABLE_SURVEY);
if ($shared != 0) {
$table_survey = Database::get_main_table(TABLE_MAIN_SHARED_SURVEY_QUESTION);
$sql = "SELECT * FROM $table_survey
WHERE survey_id='".intval($survey_id)."' ";
} else {
if (empty($courseInfo)) {
return [];
}
$sql = "SELECT * FROM $table_survey
WHERE
survey_id='".intval($survey_id)."' AND
c_id = ".$courseInfo['real_id'];
}
$result = Database::query($sql);
$return = [];
if (Database::num_rows($result) > 0) {
$return = Database::fetch_array($result, 'ASSOC');
if ($simple_return) {
return $return;
}
// We do this (temporarily) to have the array match the quickform elements immediately
// idealiter the fields in the db match the quickform fields
$return['survey_code'] = $return['code'];
$return['survey_title'] = $return['title'];
$return['survey_subtitle'] = $return['subtitle'];
$return['survey_language'] = $return['lang'];
$return['start_date'] = $return['avail_from'];
$return['end_date'] = $return['avail_till'];
$return['survey_share'] = $return['is_shared'];
$return['survey_introduction'] = $return['intro'];
$return['survey_thanks'] = $return['surveythanks'];
$return['survey_type'] = $return['survey_type'];
$return['one_question_per_page'] = $return['one_question_per_page'];
$return['show_form_profile'] = $return['show_form_profile'];
$return['input_name_list'] = isset($return['input_name_list']) ? $return['input_name_list'] : null;
$return['shuffle'] = $return['shuffle'];
$return['parent_id'] = $return['parent_id'];
$return['survey_version'] = $return['survey_version'];
$return['anonymous'] = $return['anonymous'];
$return['c_id'] = isset($return['c_id']) ? $return['c_id'] : 0;
$return['session_id'] = isset($return['session_id']) ? $return['session_id'] : 0;
}
return $return;
}
/**
* @param string $code
* @return string
*/
public static function generateSurveyCode($code)
{
return strtolower(CourseManager::generate_course_code($code));
}
/**
* This function stores a survey in the database.
*
* @param array $values
*
* @return array $return the type of return message that has to be displayed and the message in it
*
* @author Patrick Cool <patrick.cool@UGent.be>, Ghent University
* @version February 2007
*/
public static function store_survey($values)
{
$_user = api_get_user_info();
$course_id = api_get_course_int_id();
$session_id = api_get_session_id();
$courseCode = api_get_course_id();
$table_survey = Database::get_course_table(TABLE_SURVEY);
$shared_survey_id = 0;
if (!isset($values['survey_id'])) {
// Check if the code doesn't soon exists in this language
$sql = 'SELECT 1 FROM '.$table_survey.'
WHERE
c_id = '.$course_id.' AND
code="'.Database::escape_string($values['survey_code']).'" AND
lang="'.Database::escape_string($values['survey_language']).'"';
$rs = Database::query($sql);
if (Database::num_rows($rs) > 0) {
Display::addFlash(
Display::return_message(
get_lang('ThisSurveyCodeSoonExistsInThisLanguage'),
'error'
)
);
$return['type'] = 'error';
$return['id'] = isset($values['survey_id']) ? $values['survey_id'] : 0;
return $return;
}
if (!isset($values['anonymous'])) {
$values['anonymous'] = 0;
}
$values['anonymous'] = intval($values['anonymous']);
$additional['columns'] = '';
$extraParams = [];
if ($values['anonymous'] == 0) {
// Input_name_list
$values['show_form_profile'] = isset($values['show_form_profile']) ? $values['show_form_profile'] : 0;
$extraParams['show_form_profile'] = $values['show_form_profile'];
if ($values['show_form_profile'] == 1) {
// Input_name_list
$fields = explode(',', $values['input_name_list']);
$field_values = '';
foreach ($fields as & $field) {
if ($field != '') {
if ($values[$field] == '') {
$values[$field] = 0;
}
$field_values .= $field.':'.$values[$field].'@';
}
}
$extraParams['form_fields'] = $field_values;
} else {
$extraParams['form_fields'] = '';
}
} else {
// Input_name_list
$extraParams['show_form_profile'] = 0;
$extraParams['form_fields'] = '';
}
if ($values['survey_type'] == 1) {
$extraParams['survey_type'] = 1;
$extraParams['shuffle'] = $values['shuffle'];
$extraParams['one_question_per_page'] = $values['one_question_per_page'];
$extraParams['parent_id'] = $values['parent_id'];
// Logic for versioning surveys
if (!empty($values['parent_id'])) {
$versionValue = '';
$sql = 'SELECT survey_version
FROM '.$table_survey.'
WHERE
c_id = '.$course_id.' AND
parent_id = '.intval($values['parent_id']).'
ORDER BY survey_version DESC
LIMIT 1';
$rs = Database::query($sql);
if (Database::num_rows($rs) === 0) {
$sql = 'SELECT survey_version FROM '.$table_survey.'
WHERE
c_id = '.$course_id.' AND
survey_id = '.intval($values['parent_id']);
$rs = Database::query($sql);
$getversion = Database::fetch_array($rs, 'ASSOC');
if (empty($getversion['survey_version'])) {
$versionValue = ++$getversion['survey_version'];
} else {
$versionValue = $getversion['survey_version'];
}
} else {
$row = Database::fetch_array($rs, 'ASSOC');
$pos = api_strpos($row['survey_version']);
if ($pos === false) {
$row['survey_version'] = $row['survey_version'] + 1;
$versionValue = $row['survey_version'];
} else {
$getlast = explode('\.', $row['survey_version']);
$lastversion = array_pop($getlast);
$lastversion = $lastversion + 1;
$add = implode('.', $getlast);
if ($add != '') {
$insertnewversion = $add.'.'.$lastversion;
} else {
$insertnewversion = $lastversion;
}
$versionValue = $insertnewversion;
}
}
$extraParams['survey_version'] = $versionValue;
}
}
$params = [
'c_id' => $course_id,
'code' => self::generateSurveyCode($values['survey_code']),
'title' => $values['survey_title'],
'subtitle' => $values['survey_subtitle'],
'author' => $_user['user_id'],
'lang' => $values['survey_language'],
'avail_from' => $values['start_date'],
'avail_till' => $values['end_date'],
'is_shared' => $shared_survey_id,
'template' => 'template',
'intro' => $values['survey_introduction'],
'surveythanks' => $values['survey_thanks'],
'creation_date' => api_get_utc_datetime(),
'anonymous' => $values['anonymous'],
'session_id' => api_get_session_id(),
'visible_results' => $values['visible_results']
];
$params = array_merge($params, $extraParams);
$survey_id = Database::insert($table_survey, $params);
if ($survey_id > 0) {
$sql = "UPDATE $table_survey SET survey_id = $survey_id
WHERE iid = $survey_id";
Database::query($sql);
// Insert into item_property
api_item_property_update(
api_get_course_info(),
TOOL_SURVEY,
$survey_id,
'SurveyAdded',
api_get_user_id()
);
}
if ($values['survey_type'] == 1 && !empty($values['parent_id'])) {
self::copy_survey($values['parent_id'], $survey_id);
}
Display::addFlash(
Display::return_message(
get_lang('SurveyCreatedSuccesfully'),
'success'
)
);
$return['id'] = $survey_id;
} else {
// Check whether the code doesn't soon exists in this language
$sql = 'SELECT 1 FROM '.$table_survey.'
WHERE
c_id = '.$course_id.' AND
code = "'.Database::escape_string($values['survey_code']).'" AND
lang = "'.Database::escape_string($values['survey_language']).'" AND
survey_id !='.intval($values['survey_id']);
$rs = Database::query($sql);
if (Database::num_rows($rs) > 0) {
Display::addFlash(
Display::return_message(
get_lang('ThisSurveyCodeSoonExistsInThisLanguage'),
'error'
)
);
$return['type'] = 'error';
$return['id'] = isset($values['survey_id']) ? $values['survey_id'] : 0;
return $return;
}
if (!isset($values['anonymous'])
|| (isset($values['anonymous']) && $values['anonymous'] == '')
) {
$values['anonymous'] = 0;
}
$values['shuffle'] = isset($values['shuffle']) ? $values['shuffle'] : null;
$values['one_question_per_page'] = isset($values['one_question_per_page'])
? $values['one_question_per_page']
: null;
$values['show_form_profile'] = isset($values['show_form_profile']) ? $values['show_form_profile'] : null;
$extraParams = [];
$extraParams['shuffle'] = $values['shuffle'];
$extraParams['one_question_per_page'] = $values['one_question_per_page'];
$extraParams['shuffle'] = $values['shuffle'];
if ($values['anonymous'] == 0) {
$extraParams['show_form_profile'] = $values['show_form_profile'];
if ($values['show_form_profile'] == 1) {
$fields = explode(',', $values['input_name_list']);
$field_values = '';
foreach ($fields as &$field) {
if ($field != '') {
if (!isset($values[$field]) ||
(isset($values[$field]) && $values[$field] == '')
) {
$values[$field] = 0;
}
$field_values .= $field.':'.$values[$field].'@';
}
}
$extraParams['form_fields'] = $field_values;
} else {
$extraParams['form_fields'] = '';
}
} else {
$extraParams['show_form_profile'] = 0;
$extraParams['form_fields'] = '';
}
$params = [
'title' => $values['survey_title'],
'subtitle' => $values['survey_subtitle'],
'author' => $_user['user_id'],
'lang' => $values['survey_language'],
'avail_from' => $values['start_date'],
'avail_till' => $values['end_date'],
'is_shared' => $shared_survey_id,
'template' => 'template',
'intro' => $values['survey_introduction'],
'surveythanks' => $values['survey_thanks'],
'anonymous' => $values['anonymous'],
'session_id' => api_get_session_id(),
'visible_results' => $values['visible_results'],
];
$params = array_merge($params, $extraParams);
Database::update(
$table_survey,
$params,
[
'c_id = ? AND survey_id = ?' => [
$course_id,
$values['survey_id'],
],
]
);
// Update into item_property (update)
api_item_property_update(
api_get_course_info(),
TOOL_SURVEY,
$values['survey_id'],
'SurveyUpdated',
api_get_user_id()
);
Display::addFlash(
Display::return_message(
get_lang('SurveyUpdatedSuccesfully'),
'confirmation'
)
);
$return['id'] = $values['survey_id'];
}
$survey_id = intval($return['id']);
// Gradebook
$gradebook_option = false;
if (isset($values['survey_qualify_gradebook'])) {
$gradebook_option = $values['survey_qualify_gradebook'] > 0;
}
$gradebook_link_type = 8;
$link_info = GradebookUtils::isResourceInCourseGradebook(
$courseCode,
$gradebook_link_type,
$survey_id,
$session_id
);
$gradebook_link_id = isset($link_info['id']) ? $link_info['id'] : false;
if ($gradebook_option) {
if ($survey_id > 0) {
$title_gradebook = ''; // Not needed here.
$description_gradebook = ''; // Not needed here.
$survey_weight = floatval($_POST['survey_weight']);
$max_score = 1;
if (!$gradebook_link_id) {
GradebookUtils::add_resource_to_course_gradebook(
$values['category_id'],
$courseCode,
$gradebook_link_type,
$survey_id,
$title_gradebook,
$survey_weight,
$max_score,
$description_gradebook,
1,
$session_id
);
} else {
GradebookUtils::updateResourceFromCourseGradebook(
$gradebook_link_id,
$courseCode,
$survey_weight
);
}
}
} else {
// Delete everything of the gradebook for this $linkId
GradebookUtils::remove_resource_from_course_gradebook($gradebook_link_id);
}
return $return;
}
/**
* This function stores a shared survey in the central database.
*
* @param array $values
* @return array $return the type of return message that has to be displayed and the message in it
*
* @author Patrick Cool <patrick.cool@UGent.be>, Ghent University
* @version February 2007
*/
public function store_shared_survey($values)
{
$_user = api_get_user_info();
$_course = api_get_course_info();
// Table definitions
$table_survey = Database::get_main_table(TABLE_MAIN_SHARED_SURVEY);
if (!$values['survey_id'] ||
!is_numeric($values['survey_id']) ||
$values['survey_share']['survey_share'] == 'true'
) {
$sql = "INSERT INTO $table_survey (code, title, subtitle, author, lang, template, intro, surveythanks, creation_date, course_code) VALUES (
'".Database::escape_string($values['survey_code'])."',
'".Database::escape_string($values['survey_title'])."',
'".Database::escape_string($values['survey_subtitle'])."',
'".intval($_user['user_id'])."',
'".Database::escape_string($values['survey_language'])."',
'".Database::escape_string('template')."',
'".Database::escape_string($values['survey_introduction'])."',
'".Database::escape_string($values['survey_thanks'])."',
'".api_get_utc_datetime()."',
'".$_course['id']."')";
Database::query($sql);
$return = Database::insert_id();
$sql = "UPDATE $table_survey SET survey_id = $return WHERE iid = $return";
Database::query($sql);
} else {
$sql = "UPDATE $table_survey SET
code = '".Database::escape_string($values['survey_code'])."',
title = '".Database::escape_string($values['survey_title'])."',
subtitle = '".Database::escape_string($values['survey_subtitle'])."',
author = '".intval($_user['user_id'])."',
lang = '".Database::escape_string($values['survey_language'])."',
template = '".Database::escape_string('template')."',
intro = '".Database::escape_string($values['survey_introduction'])."',
surveythanks = '".Database::escape_string($values['survey_thanks'])."'
WHERE survey_id = '".Database::escape_string($values['survey_share']['survey_share'])."'";
Database::query($sql);
$return = $values['survey_share']['survey_share'];
}
return $return;
}
/**
* This function deletes a survey (and also all the question in that survey
*
* @param int $survey_id id of the survey that has to be deleted
* @param bool $shared
* @param int $course_id
* @return true
*
* @author Patrick Cool <patrick.cool@UGent.be>, Ghent University
* @version January 2007
*/
public static function delete_survey($survey_id, $shared = false, $course_id = 0)
{
// Database table definitions
if (empty($course_id)) {
$course_id = api_get_course_int_id();
}
$survey_id = intval($survey_id);
if (empty($survey_id)) {
return false;
}
$course_info = api_get_course_info_by_id($course_id);
$course_id = $course_info['real_id'];
$table_survey = Database::get_course_table(TABLE_SURVEY);
$table_survey_question_group = Database::get_course_table(TABLE_SURVEY_QUESTION_GROUP);
if ($shared) {
$table_survey = Database::get_main_table(TABLE_MAIN_SHARED_SURVEY);
// Deleting the survey
$sql = "DELETE FROM $table_survey
WHERE survey_id='".$survey_id."'";
Database::query($sql);
} else {
$sql = "DELETE FROM $table_survey
WHERE c_id = $course_id AND survey_id='".$survey_id."'";
Database::query($sql);
}
// Deleting groups of this survey
$sql = "DELETE FROM $table_survey_question_group
WHERE c_id = $course_id AND survey_id='".$survey_id."'";
Database::query($sql);
// Deleting the questions of the survey
self::delete_all_survey_questions($survey_id, $shared);
// Update into item_property (delete)
api_item_property_update(
$course_info,
TOOL_SURVEY,
$survey_id,
'SurveyDeleted',
api_get_user_id()
);
return true;
}
/**
* @param int $survey_id
* @param int $new_survey_id
* @param int $targetCourseId
*
* @return bool
*/
public static function copy_survey(
$survey_id,
$new_survey_id = null,
$targetCourseId = null
) {
$course_id = api_get_course_int_id();
if (!$targetCourseId) {
$targetCourseId = $course_id;
}
// Database table definitions
$table_survey = Database::get_course_table(TABLE_SURVEY);
$table_survey_question_group = Database::get_course_table(TABLE_SURVEY_QUESTION_GROUP);
$table_survey_question = Database::get_course_table(TABLE_SURVEY_QUESTION);
$table_survey_options = Database::get_course_table(TABLE_SURVEY_QUESTION_OPTION);
$survey_id = intval($survey_id);
// Get groups
$survey_data = self::get_survey($survey_id, 0, null, true);
if (empty($survey_data)) {
return true;
}
if (empty($new_survey_id)) {
$params = $survey_data;
$params['code'] = self::generate_unique_code($params['code']);
$params['c_id'] = $targetCourseId;
unset($params['survey_id']);
$params['session_id'] = api_get_session_id();
$params['title'] = $params['title'].' '.get_lang('Copy');
unset($params['iid']);
Database::insert($table_survey, $params);
$new_survey_id = Database::insert_id();
if ($new_survey_id) {
$sql = "UPDATE $table_survey SET survey_id = $new_survey_id
WHERE iid = $new_survey_id";
Database::query($sql);
// Insert into item_property
api_item_property_update(
api_get_course_info(),
TOOL_SURVEY,
$new_survey_id,
'SurveyAdded',
api_get_user_id()
);
}
} else {
$new_survey_id = intval($new_survey_id);
}
$sql = "SELECT * FROM $table_survey_question_group
WHERE c_id = $course_id AND survey_id='".$survey_id."'";
$res = Database::query($sql);
while ($row = Database::fetch_array($res, 'ASSOC')) {
$params = [
'c_id' => $targetCourseId,
'name' => $row['name'],
'description' => $row['description'],
'survey_id' => $new_survey_id
];
$insertId = Database::insert($table_survey_question_group, $params);
$sql = "UPDATE $table_survey_question_group SET id = iid
WHERE iid = $insertId";
Database::query($sql);
$group_id[$row['id']] = $insertId;
}
// Get questions
$sql = "SELECT * FROM $table_survey_question
WHERE c_id = $course_id AND survey_id='".$survey_id."'";
$res = Database::query($sql);
while ($row = Database::fetch_array($res, 'ASSOC')) {
$params = [
'c_id' => $targetCourseId,
'survey_id' => $new_survey_id,
'survey_question' => $row['survey_question'],
'survey_question_comment' => $row['survey_question_comment'],
'type' => $row['type'],
'display' => $row['display'],
'sort' => $row['sort'],
'shared_question_id' => $row['shared_question_id'],
'max_value' => $row['max_value'],
'survey_group_pri' => $row['survey_group_pri'],
'survey_group_sec1' => $row['survey_group_sec1'],
'survey_group_sec2' => $row['survey_group_sec2']
];
$insertId = Database::insert($table_survey_question, $params);
$sql = "UPDATE $table_survey_question SET question_id = iid WHERE iid = $insertId";
Database::query($sql);
$question_id[$row['question_id']] = $insertId;
}
// Get questions options
$sql = "SELECT * FROM $table_survey_options
WHERE c_id = $course_id AND survey_id='".$survey_id."'";
$res = Database::query($sql);
while ($row = Database::fetch_array($res, 'ASSOC')) {
$params = [
'c_id' => $targetCourseId,
'question_id' => $question_id[$row['question_id']],
'survey_id' => $new_survey_id,
'option_text' => $row['option_text'],
'sort' => $row['sort'],
'value' => $row['value']
];
$insertId = Database::insert($table_survey_options, $params);
$sql = "UPDATE $table_survey_options SET question_option_id = $insertId
WHERE iid = $insertId";
Database::query($sql);
}
return $new_survey_id;
}
/**
* This function duplicates a survey (and also all the question in that survey
*
* @param int $survey_id id of the survey that has to be duplicated
* @param int $courseId id of the course which survey has to be duplicated
* @return true
*
* @author Eric Marguin <e.marguin@elixir-interactive.com>, Elixir Interactive
* @version October 2007
*/
public static function empty_survey($survey_id, $courseId = 0)
{
// Database table definitions
$table_survey_invitation = Database::get_course_table(TABLE_SURVEY_INVITATION);
$table_survey_answer = Database::get_course_table(TABLE_SURVEY_ANSWER);
$table_survey = Database::get_course_table(TABLE_SURVEY);
$courseId = (int) $courseId;
$courseId = empty($courseId) ? api_get_course_int_id() : $courseId;
$datas = self::get_survey($survey_id);
$session_where = '';
if (api_get_session_id() != 0) {
$session_where = ' AND session_id = "'.api_get_session_id().'" ';
}
$sql = 'DELETE FROM '.$table_survey_invitation.'
WHERE
c_id = '.$courseId.' AND
survey_code = "'.Database::escape_string($datas['code']).'" '.$session_where.' ';
Database::query($sql);
$sql = 'DELETE FROM '.$table_survey_answer.'
WHERE c_id = '.$courseId.' AND survey_id='.intval($survey_id);
Database::query($sql);
$sql = 'UPDATE '.$table_survey.' SET invited=0, answered=0
WHERE c_id = '.$courseId.' AND survey_id='.intval($survey_id);
Database::query($sql);
return true;
}
/**
* This function recalculates the number of people who have taken the survey (=filled at least one question)
*
* @param array $survey_data
* @param array $user
* @param string $survey_code
* @return bool
*
* @author Patrick Cool <patrick.cool@UGent.be>, Ghent University
* @version February 2007
*/
public static function update_survey_answered($survey_data, $user, $survey_code)
{
// Database table definitions
$table_survey = Database::get_course_table(TABLE_SURVEY);
$table_survey_invitation = Database::get_course_table(TABLE_SURVEY_INVITATION);
$survey_id = $survey_data['survey_id'];
$course_id = $survey_data['c_id'];
$session_id = $survey_data['session_id'];
// Getting a list with all the people who have filled the survey
$people_filled = self::get_people_who_filled_survey($survey_id, false, $course_id);
$number = intval(count($people_filled));
// Storing this value in the survey table
$sql = "UPDATE $table_survey
SET answered = $number
WHERE
c_id = $course_id AND
survey_id = ".intval($survey_id);
Database::query($sql);
$allow = api_get_configuration_value('survey_answered_at_field');
// Requires DB change:
// ALTER TABLE c_survey_invitation ADD answered_at DATETIME DEFAULT NULL;
$answeredAt = '';
if ($allow) {
$answeredAt = "answered_at = '".api_get_utc_datetime()."',";
}
// Storing that the user has finished the survey.
$sql = "UPDATE $table_survey_invitation
SET $answeredAt
answered = 1
WHERE
c_id = $course_id AND
session_id = $session_id AND
user ='".Database::escape_string($user)."' AND
survey_code='".Database::escape_string($survey_code)."'";
Database::query($sql);
}
/***
* SURVEY QUESTION FUNCTIONS
*/
/**
* This function return the "icon" of the question type
*
* @author Patrick Cool <patrick.cool@UGent.be>, Ghent University
* @version February 2007
*/
public static function icon_question($type)
{
// the possible question types
$possible_types = [
'personality',
'yesno',
'multiplechoice',
'multipleresponse',
'open',
'dropdown',
'comment',
'pagebreak',
'percentage',
'score',
];
// the images array
$icon_question = [
'yesno' => 'yesno.png',
'personality' => 'yesno.png',
'multiplechoice' => 'mcua.png',
'multipleresponse' => 'mcma.png',
'open' => 'open_answer.png',
'dropdown' => 'dropdown.png',
'percentage' => 'percentagequestion.png',
'score' => 'scorequestion.png',
'comment' => 'commentquestion.png',
'pagebreak' => 'page_end.png',
];
if (in_array($type, $possible_types)) {
return $icon_question[$type];
} else {
return false;
}
}
/**
* This function retrieves all the information of a question
*
* @param integer $question_id the id of the question
* @param bool $shared
* @return array
*
* @author Patrick Cool <patrick.cool@UGent.be>, Ghent University
* @version January 2007
*
* @todo one sql call should do the trick
*/
public static function get_question($question_id, $shared = false)
{
// Table definitions
$tbl_survey_question = Database::get_course_table(TABLE_SURVEY_QUESTION);
$table_survey_question_option = Database::get_course_table(TABLE_SURVEY_QUESTION_OPTION);
$course_id = api_get_course_int_id();
$sql = "SELECT * FROM $tbl_survey_question
WHERE c_id = $course_id AND question_id='".intval($question_id)."'
ORDER BY `sort` ";
$sqlOption = " SELECT * FROM $table_survey_question_option
WHERE c_id = $course_id AND question_id='".intval($question_id)."'
ORDER BY `sort` ";
if ($shared) {
$tbl_survey_question = Database::get_main_table(TABLE_MAIN_SHARED_SURVEY_QUESTION);
$table_survey_question_option = Database::get_main_table(TABLE_MAIN_SHARED_SURVEY_QUESTION_OPTION);
$sql = "SELECT * FROM $tbl_survey_question
WHERE question_id='".intval($question_id)."'
ORDER BY `sort` ";
$sqlOption = "SELECT * FROM $table_survey_question_option
WHERE question_id='".intval($question_id)."'
ORDER BY `sort` ";
}
// Getting the information of the question
$result = Database::query($sql);
$row = Database::fetch_array($result, 'ASSOC');
$return['survey_id'] = $row['survey_id'];
$return['question_id'] = $row['question_id'];
$return['type'] = $row['type'];
$return['question'] = $row['survey_question'];
$return['horizontalvertical'] = $row['display'];
$return['shared_question_id'] = $row['shared_question_id'];
$return['maximum_score'] = $row['max_value'];
$return['is_required'] = api_get_configuration_value('allow_required_survey_questions')
? $row['is_required']
: false;
if ($row['survey_group_pri'] != 0) {
$return['assigned'] = $row['survey_group_pri'];
$return['choose'] = 1;
} else {
$return['assigned1'] = $row['survey_group_sec1'];
$return['assigned2'] = $row['survey_group_sec2'];
$return['choose'] = 2;
}
// Getting the information of the question options
$result = Database::query($sqlOption);
while ($row = Database::fetch_array($result, 'ASSOC')) {
/** @todo this should be renamed to options instead of answers */
$return['answers'][] = $row['option_text'];
$return['values'][] = $row['value'];
/** @todo this can be done more elegantly (used in reporting) */
$return['answersid'][] = $row['question_option_id'];
}
return $return;
}
/**
* This function gets all the question of any given survey
*
* @param integer $survey_id the id of the survey
* @param int $course_id
* @return array containing all the questions of the survey
*
* @author Patrick Cool <patrick.cool@UGent.be>, Ghent University
* @version February 2007
*
* @todo one sql call should do the trick
*/
public static function get_questions($survey_id, $course_id = 0)
{
// Table definitions
$tbl_survey_question = Database::get_course_table(TABLE_SURVEY_QUESTION);
$table_survey_question_option = Database::get_course_table(TABLE_SURVEY_QUESTION_OPTION);
$course_id = (int) $course_id;
if (empty($course_id)) {
$course_id = api_get_course_int_id();
}
// Getting the information of the question
$sql = "SELECT * FROM $tbl_survey_question
WHERE c_id = $course_id AND survey_id='".intval($survey_id)."'";
$result = Database::query($sql);
$return = [];
while ($row = Database::fetch_array($result, 'ASSOC')) {
$return[$row['question_id']]['survey_id'] = $row['survey_id'];
$return[$row['question_id']]['question_id'] = $row['question_id'];
$return[$row['question_id']]['type'] = $row['type'];
$return[$row['question_id']]['question'] = $row['survey_question'];
$return[$row['question_id']]['horizontalvertical'] = $row['display'];
$return[$row['question_id']]['maximum_score'] = $row['max_value'];
$return[$row['question_id']]['sort'] = $row['sort'];
}
// Getting the information of the question options
$sql = "SELECT * FROM $table_survey_question_option
WHERE c_id = $course_id AND survey_id='".intval($survey_id)."'";
$result = Database::query($sql);
while ($row = Database::fetch_array($result, 'ASSOC')) {
$return[$row['question_id']]['answers'][] = $row['option_text'];
}
return $return;
}
/**
* This function saves a question in the database.
* This can be either an update of an existing survey or storing a new survey
* @param array $survey_data
* @param array $form_content all the information of the form
*
* @author Patrick Cool <patrick.cool@UGent.be>, Ghent University
* @version January 2007
*/
public static function save_question($survey_data, $form_content)
{
$return_message = '';
if (strlen($form_content['question']) > 1) {
// Checks length of the question
$empty_answer = false;
if ($survey_data['survey_type'] == 1) {
if (empty($form_content['choose'])) {
$return_message = 'PleaseChooseACondition';
return $return_message;
}
if (($form_content['choose'] == 2) &&
($form_content['assigned1'] == $form_content['assigned2'])
) {
$return_message = 'ChooseDifferentCategories';
return $return_message;
}
}
if ($form_content['type'] != 'percentage') {
if (isset($form_content['answers'])) {
for ($i = 0; $i < count($form_content['answers']); $i++) {
if (strlen($form_content['answers'][$i]) < 1) {
$empty_answer = true;
break;
}
}
}
}
if ($form_content['type'] == 'score') {
if (strlen($form_content['maximum_score']) < 1) {
$empty_answer = true;
}
}
$additional = [];
$course_id = api_get_course_int_id();
if (!$empty_answer) {
// Table definitions
$tbl_survey_question = Database::get_course_table(TABLE_SURVEY_QUESTION);
// Getting all the information of the survey
$survey_data = self::get_survey($form_content['survey_id']);
// Storing the question in the shared database
if (is_numeric($survey_data['survey_share']) && $survey_data['survey_share'] != 0) {
$shared_question_id = self::save_shared_question($form_content, $survey_data);
$form_content['shared_question_id'] = $shared_question_id;
}
// Storing a new question
if ($form_content['question_id'] == '' || !is_numeric($form_content['question_id'])) {
// Finding the max sort order of the questions in the given survey
$sql = "SELECT max(sort) AS max_sort
FROM $tbl_survey_question
WHERE c_id = $course_id AND survey_id='".intval($form_content['survey_id'])."'";
$result = Database::query($sql);
$row = Database::fetch_array($result, 'ASSOC');
$max_sort = $row['max_sort'];
// Some variables defined for survey-test type
$extraParams = [];
if (isset($_POST['choose'])) {
if ($_POST['choose'] == 1) {
$extraParams['survey_group_pri'] = $_POST['assigned'];
} elseif ($_POST['choose'] == 2) {
$extraParams['survey_group_sec1'] = $_POST['assigned1'];
$extraParams['survey_group_sec2'] = $_POST['assigned2'];
}
}
$questionComment = isset($form_content['question_comment'])
? $form_content['question_comment']
: '';
$maxScore = isset($form_content['maximum_score']) ? $form_content['maximum_score'] : '';
$display = isset($form_content['horizontalvertical']) ? $form_content['horizontalvertical'] : '';
$params = [
'c_id' => $course_id,
'survey_id' => $form_content['survey_id'],
'survey_question' => $form_content['question'],
'survey_question_comment' => $questionComment,
'type' => $form_content['type'],
'display' => $display,
'sort' => $max_sort + 1,
'shared_question_id' => $form_content['shared_question_id'],
'max_value' => $maxScore,
];
if (api_get_configuration_value('allow_required_survey_questions')) {
$params['is_required'] = isset($form_content['is_required']);
}
$params = array_merge($params, $extraParams);
$question_id = Database::insert($tbl_survey_question, $params);
if ($question_id) {
$sql = "UPDATE $tbl_survey_question SET question_id = $question_id
WHERE iid = $question_id";
Database::query($sql);
$form_content['question_id'] = $question_id;
$return_message = 'QuestionAdded';
}
} else {
// Updating an existing question
$extraParams = [];
if (isset($_POST['choose'])) {
if ($_POST['choose'] == 1) {
$extraParams['survey_group_pri'] = $_POST['assigned'];
$extraParams['survey_group_sec1'] = 0;
$extraParams['survey_group_sec2'] = 0;
} elseif ($_POST['choose'] == 2) {
$extraParams['survey_group_pri'] = 0;
$extraParams['survey_group_sec1'] = $_POST['assigned1'];
$extraParams['survey_group_sec2'] = $_POST['assigned2'];
}
}
$maxScore = isset($form_content['maximum_score']) ? $form_content['maximum_score'] : null;
$questionComment = isset($form_content['question_comment'])
? $form_content['question_comment']
: null;
// Adding the question to the survey_question table
$params = [
'survey_question' => $form_content['question'],
'survey_question_comment' => $questionComment,
'display' => $form_content['horizontalvertical'],
];
if (api_get_configuration_value('allow_required_survey_questions')) {
$params['is_required'] = isset($form_content['is_required']);
}
$params = array_merge($params, $extraParams);
Database::update(
$tbl_survey_question,
$params,
[
'c_id = ? AND question_id = ?' => [
$course_id,
$form_content['question_id'],
],
]
);
$return_message = 'QuestionUpdated';
}
if (!empty($form_content['survey_id'])) {
//Updating survey
api_item_property_update(
api_get_course_info(),
TOOL_SURVEY,
$form_content['survey_id'],
'SurveyUpdated',
api_get_user_id()
);
}
// Storing the options of the question
self::save_question_options($form_content, $survey_data);
} else {
$return_message = 'PleasFillAllAnswer';
}
} else {
$return_message = 'PleaseEnterAQuestion';
}
if (!empty($return_message)) {
Display::addFlash(Display::return_message(get_lang($return_message)));
}
return $return_message;
}
/**
* This function saves the question in the shared database
*
* @param array $form_content all the information of the form
* @param array $survey_data all the information of the survey
*
* @author Patrick Cool <patrick.cool@UGent.be>, Ghent University
* @version February 2007
* @return int
*
* @todo editing of a shared question
*/
public function save_shared_question($form_content, $survey_data)
{
$_course = api_get_course_info();
// Table definitions
$tbl_survey_question = Database::get_main_table(TABLE_MAIN_SHARED_SURVEY_QUESTION);
// Storing a new question
if ($form_content['shared_question_id'] == '' ||
!is_numeric($form_content['shared_question_id'])
) {
// Finding the max sort order of the questions in the given survey
$sql = "SELECT max(sort) AS max_sort FROM $tbl_survey_question
WHERE survey_id='".intval($survey_data['survey_share'])."'
AND code='".Database::escape_string($_course['id'])."'";
$result = Database::query($sql);
$row = Database::fetch_array($result, 'ASSOC');
$max_sort = $row['max_sort'];
// Adding the question to the survey_question table
$sql = "INSERT INTO $tbl_survey_question (survey_id, survey_question, survey_question_comment, type, display, sort, code) VALUES (
'".Database::escape_string($survey_data['survey_share'])."',
'".Database::escape_string($form_content['question'])."',
'".Database::escape_string($form_content['question_comment'])."',
'".Database::escape_string($form_content['type'])."',
'".Database::escape_string($form_content['horizontalvertical'])."',
'".Database::escape_string($max_sort + 1)."',
'".Database::escape_string($_course['id'])."')";
Database::query($sql);
$shared_question_id = Database::insert_id();
} else {
// Updating an existing question
// adding the question to the survey_question table
$sql = "UPDATE $tbl_survey_question SET
survey_question = '".Database::escape_string($form_content['question'])."',
survey_question_comment = '".Database::escape_string($form_content['question_comment'])."',
display = '".Database::escape_string($form_content['horizontalvertical'])."'
WHERE
question_id = '".intval($form_content['shared_question_id'])."' AND
code = '".Database::escape_string($_course['id'])."'";
Database::query($sql);
$shared_question_id = $form_content['shared_question_id'];
}
return $shared_question_id;
}
/**
* This functions moves a question of a survey up or down
*
* @param string $direction
* @param integer $survey_question_id
* @param integer $survey_id
*
* @author Patrick Cool <patrick.cool@UGent.be>, Ghent University
* @version January 2007
*/
public static function move_survey_question(
$direction,
$survey_question_id,
$survey_id
) {
// Table definition
$table_survey_question = Database::get_course_table(TABLE_SURVEY_QUESTION);
$course_id = api_get_course_int_id();
if ($direction == 'moveup') {
$sort = 'DESC';
}
if ($direction == 'movedown') {
$sort = 'ASC';
}
// Finding the two questions that needs to be swapped
$sql = "SELECT * FROM $table_survey_question
WHERE c_id = $course_id AND survey_id='".Database::escape_string($survey_id)."'
ORDER BY sort $sort";
$result = Database::query($sql);
$found = false;
while ($row = Database::fetch_array($result, 'ASSOC')) {
if ($found) {
$question_id_two = $row['question_id'];
$question_sort_two = $row['sort'];
$found = false;
}
if ($row['question_id'] == $survey_question_id) {
$found = true;
$question_id_one = $row['question_id'];
$question_sort_one = $row['sort'];
}
}
$sql1 = "UPDATE $table_survey_question
SET sort = '".Database::escape_string($question_sort_two)."'
WHERE c_id = $course_id AND question_id='".intval($question_id_one)."'";
Database::query($sql1);
$sql2 = "UPDATE $table_survey_question
SET sort = '".Database::escape_string($question_sort_one)."'
WHERE c_id = $course_id AND question_id='".intval($question_id_two)."'";
Database::query($sql2);
}
/**
* This function deletes all the questions of a given survey
* This function is normally only called when a survey is deleted
*
* @param int $survey_id the id of the survey that has to be deleted
* @return true
*
* @author Patrick Cool <patrick.cool@UGent.be>, Ghent University
* @version January 2007
*/
public static function delete_all_survey_questions($survey_id, $shared = false)
{
$course_id = api_get_course_int_id();
// Table definitions
$table_survey_question = Database::get_course_table(TABLE_SURVEY_QUESTION);
$course_condition = " c_id = $course_id AND ";
if ($shared) {
$course_condition = '';
$table_survey_question = Database::get_main_table(TABLE_MAIN_SHARED_SURVEY_QUESTION);
}
$sql = "DELETE FROM $table_survey_question
WHERE $course_condition survey_id='".intval($survey_id)."'";
// Deleting the survey questions
Database::query($sql);
// Deleting all the options of the questions of the survey
self::delete_all_survey_questions_options($survey_id, $shared);
// Deleting all the answers on this survey
self::delete_all_survey_answers($survey_id);
}
/**
* This function deletes a survey question and all its options
*
* @param int $survey_id the id of the survey
* @param int $question_id the id of the question
* @param bool $shared
*
* @todo also delete the answers to this question
*
* @author Patrick Cool <patrick.cool@UGent.be>, Ghent University
* @version March 2007
*/
public static function delete_survey_question($survey_id, $question_id, $shared = false)
{
$course_id = api_get_course_int_id();
// Table definitions
$table_survey_question = Database::get_course_table(TABLE_SURVEY_QUESTION);
if ($shared) {
self::delete_shared_survey_question($survey_id, $question_id);
}
// Deleting the survey questions
$sql = "DELETE FROM $table_survey_question
WHERE
c_id = $course_id AND
survey_id='".intval($survey_id)."' AND
question_id='".intval($question_id)."'";
Database::query($sql);
// Deleting the options of the question of the survey
self::delete_survey_question_option($survey_id, $question_id, $shared);
}
/**
* This function deletes a shared survey question from the main database and all its options
*
* @param int $question_id the id of the question
*
* @todo delete all the options of this question
*
* @author Patrick Cool <patrick.cool@UGent.be>, Ghent University
* @version March 2007
*/
public static function delete_shared_survey_question($survey_id, $question_id)
{
// Table definitions
$table_survey_question = Database::get_main_table(TABLE_MAIN_SHARED_SURVEY_QUESTION);
$table_survey_question_option = Database::get_main_table(TABLE_MAIN_SHARED_SURVEY_QUESTION_OPTION);
// First we have to get the shared_question_id
$question_data = self::get_question($question_id);
// Deleting the survey questions
$sql = "DELETE FROM $table_survey_question
WHERE question_id='".intval($question_data['shared_question_id'])."'";
Database::query($sql);
// Deleting the options of the question of the survey question
$sql = "DELETE FROM $table_survey_question_option
WHERE question_id='".intval($question_data['shared_question_id'])."'";
Database::query($sql);
}
/**
* This function stores the options of the questions in the table
*
* @param array $form_content
* @author Patrick Cool <patrick.cool@UGent.be>, Ghent University
* @version January 2007
*
* @todo writing the update statement when editing a question
*/
public static function save_question_options($form_content, $survey_data)
{
$course_id = api_get_course_int_id();
// A percentage question type has options 1 -> 100
if ($form_content['type'] == 'percentage') {
for ($i = 1; $i < 101; $i++) {
$form_content['answers'][] = $i;
}
}
if (is_numeric($survey_data['survey_share']) && $survey_data['survey_share'] != 0) {
self::save_shared_question_options($form_content, $survey_data);
}
// Table definition
$table_survey_question_option = Database::get_course_table(TABLE_SURVEY_QUESTION_OPTION);
// We are editing a question so we first have to remove all the existing options from the database
if (is_numeric($form_content['question_id'])) {
$sql = "DELETE FROM $table_survey_question_option
WHERE c_id = $course_id AND question_id = '".intval($form_content['question_id'])."'";
Database::query($sql);
}
$counter = 1;
if (isset($form_content['answers']) && is_array($form_content['answers'])) {
for ($i = 0; $i < count($form_content['answers']); $i++) {
$values = isset($form_content['values']) ? $form_content['values'][$i] : '';
$params = [
'c_id' => $course_id,
'question_id' => $form_content['question_id'],
'survey_id' => $form_content['survey_id'],
'option_text' => $form_content['answers'][$i],
'value' => $values,
'sort' => $counter,
];
$insertId = Database::insert($table_survey_question_option, $params);
if ($insertId) {
$sql = "UPDATE $table_survey_question_option
SET question_option_id = $insertId
WHERE iid = $insertId";
Database::query($sql);
$counter++;
}
}
}
}
/**
* This function stores the options of the questions in the shared table
*
* @param array $form_content
*
* @author Patrick Cool <patrick.cool@UGent.be>, Ghent University
* @version February 2007
*
* @todo writing the update statement when editing a question
*/
public function save_shared_question_options($form_content, $survey_data)
{
if (is_array($form_content) && is_array($form_content['answers'])) {
// Table definition
$table = Database::get_main_table(TABLE_MAIN_SHARED_SURVEY_QUESTION_OPTION);
// We are editing a question so we first have to remove all the existing options from the database
$sql = "DELETE FROM $table
WHERE question_id = '".Database::escape_string($form_content['shared_question_id'])."'";
Database::query($sql);
$counter = 1;
foreach ($form_content['answers'] as & $answer) {
$params = [
'question_id' => $form_content['shared_question_id'],
'survey_id' => $survey_data['is_shared'],
'option_text' => $answer,
'sort' => $counter,
];
Database::insert($table, $params);
$counter++;
}
}
}
/**
* This function deletes all the options of the questions of a given survey
* This function is normally only called when a survey is deleted
*
* @param $survey_id the id of the survey that has to be deleted
* @return true
*
* @author Patrick Cool <patrick.cool@UGent.be>, Ghent University
* @version January 2007
*/
public static function delete_all_survey_questions_options($survey_id, $shared = false)
{
// Table definitions
$table_survey_question_option = Database::get_course_table(TABLE_SURVEY_QUESTION_OPTION);
$course_id = api_get_course_int_id();
$course_condition = " c_id = $course_id AND ";
if ($shared) {
$course_condition = '';
$table_survey_question_option = Database::get_main_table(TABLE_MAIN_SHARED_SURVEY_QUESTION_OPTION);
}
$sql = "DELETE FROM $table_survey_question_option
WHERE $course_condition survey_id='".intval($survey_id)."'";
// Deleting the options of the survey questions
Database::query($sql);
return true;
}
/**
* This function deletes the options of a given question
*
* @param int $survey_id
* @param int $question_id
* @param bool $shared
*
* @return bool
*
* @author Patrick Cool <patrick.cool@UGent.be>, Ghent University
* @author Julio Montoya
* @version March 2007
*/
public static function delete_survey_question_option(
$survey_id,
$question_id,
$shared = false
) {
$course_id = api_get_course_int_id();
$course_condition = " c_id = $course_id AND ";
// Table definitions
$table_survey_question_option = Database::get_course_table(TABLE_SURVEY_QUESTION_OPTION);
if ($shared) {
$course_condition = '';
$table_survey_question_option = Database::get_main_table(TABLE_MAIN_SHARED_SURVEY_QUESTION_OPTION);
}
// Deleting the options of the survey questions
$sql = "DELETE from $table_survey_question_option
WHERE
$course_condition survey_id='".intval($survey_id)."' AND
question_id='".intval($question_id)."'";
Database::query($sql);
return true;
}
/**
* SURVEY ANSWERS FUNCTIONS
*/
/**
* This function deletes all the answers anyone has given on this survey
* This function is normally only called when a survey is deleted
*
* @param $survey_id the id of the survey that has to be deleted
* @return true
*
* @todo write the function
*
* @author Patrick Cool <patrick.cool@UGent.be>, Ghent University
* @version January 2007,december 2008
*/
public static function delete_all_survey_answers($survey_id)
{
$course_id = api_get_course_int_id();
$table_survey_answer = Database::get_course_table(TABLE_SURVEY_ANSWER);
$survey_id = intval($survey_id);
$sql = "DELETE FROM $table_survey_answer
WHERE c_id = $course_id AND survey_id=$survey_id";
Database::query($sql);
return true;
}
/**
* @param int $user_id
* @param int $survey_id
* @param int $course_id
* @return bool
*/
public static function is_user_filled_survey($user_id, $survey_id, $course_id)
{
$table_survey_answer = Database::get_course_table(TABLE_SURVEY_ANSWER);
$user_id = intval($user_id);
$course_id = intval($course_id);
$survey_id = intval($survey_id);
$sql = "SELECT DISTINCT user
FROM $table_survey_answer
WHERE
c_id = $course_id AND
user = $user_id AND
survey_id = $survey_id";
$result = Database::query($sql);
if (Database::num_rows($result)) {
return true;
}
return false;
}
/**
* This function gets all the persons who have filled the survey
*
* @param integer $survey_id
* @return array
*
* @author Patrick Cool <patrick.cool@UGent.be>, Ghent University
* @version February 2007
*/
public static function get_people_who_filled_survey(
$survey_id,
$all_user_info = false,
$course_id = null
) {
// Database table definition
$table_survey_answer = Database::get_course_table(TABLE_SURVEY_ANSWER);
$table_user = Database::get_main_table(TABLE_MAIN_USER);
// Variable initialisation
$return = [];
if (empty($course_id)) {
$course_id = api_get_course_int_id();
} else {
$course_id = intval($course_id);
}
if ($all_user_info) {
$order_clause = api_sort_by_first_name()
? ' ORDER BY user.firstname, user.lastname'
: ' ORDER BY user.lastname, user.firstname';
$sql = "SELECT DISTINCT
answered_user.user as invited_user,
user.firstname,
user.lastname,
user.user_id
FROM $table_survey_answer answered_user
LEFT JOIN $table_user as user ON answered_user.user = user.user_id
WHERE
answered_user.c_id = $course_id AND
survey_id= '".Database::escape_string($survey_id)."' ".
$order_clause;
} else {
$sql = "SELECT DISTINCT user FROM $table_survey_answer
WHERE c_id = $course_id AND survey_id= '".Database::escape_string($survey_id)."' ";
}
$res = Database::query($sql);
while ($row = Database::fetch_array($res, 'ASSOC')) {
if ($all_user_info) {
$userInfo = api_get_user_info($row['user_id']);
$row['user_info'] = $userInfo;
$return[] = $row;
} else {
$return[] = $row['user'];
}
}
return $return;
}
/**
* @return bool
*/
public static function survey_generation_hash_available()
{
if (extension_loaded('mcrypt')) {
return true;
}
return false;
}
/**
* @param int $survey_id
* @param int $course_id
* @param int $session_id
* @param int $group_id
* @return string
*/
public static function generate_survey_hash($survey_id, $course_id, $session_id, $group_id)
{
$hash = hash('sha512', api_get_security_key().'_'.$course_id.'_'.$session_id.'_'.$group_id.'_'.$survey_id);
return $hash;
}
/**
* @param int $survey_id
* @param int $course_id
* @param int $session_id
* @param int $group_id
* @param string $hash
*
* @return bool
*/
public static function validate_survey_hash($survey_id, $course_id, $session_id, $group_id, $hash)
{
$survey_generated_hash = self::generate_survey_hash($survey_id, $course_id, $session_id, $group_id);
if ($survey_generated_hash == $hash) {
return true;
}
return false;
}
/**
* @param int $survey_id
* @param int $course_id
* @param int $session_id
* @param int $group_id
*
* @return string
*/
public static function generate_survey_link(
$survey_id,
$course_id,
$session_id,
$group_id
) {
$code = self::generate_survey_hash(
$survey_id,
$course_id,
$session_id,
$group_id
);
return api_get_path(WEB_CODE_PATH).'survey/link.php?h='.$code.'&i='.$survey_id.'&c='.intval($course_id).'&s='
.intval($session_id).'&g='.$group_id;
}
/**
* Check if the current user has mandatory surveys no-answered
* and redirect to fill the first found survey
*/
public static function protectByMandatory()
{
if (strpos($_SERVER['SCRIPT_NAME'], 'fillsurvey.php') !== false) {
return;
}
$userId = api_get_user_id();
$courseId = api_get_course_int_id();
$sessionId = api_get_session_id();
if (!$userId) {
return;
}
if (!$courseId) {
return;
}
try {
/** @var CSurveyInvitation $invitation */
$invitation = Database::getManager()
->createQuery("
SELECT i FROM ChamiloCourseBundle:CSurveyInvitation i
INNER JOIN ChamiloCourseBundle:CSurvey s WITH s.code = i.surveyCode
INNER JOIN ChamiloCoreBundle:ExtraFieldValues efv WITH efv.itemId = s.iid
INNER JOIN ChamiloCoreBundle:ExtraField ef WITH efv.field = ef.id
WHERE i.answered = 0
AND i.cId = :course
AND i.user = :user
AND i.sessionId = :session
AND :now BETWEEN s.availFrom AND s.availTill
AND ef.variable = :variable
AND efv.value = 1
ORDER BY s.availTill ASC
")
->setMaxResults(1)
->setParameters([
'course' => $courseId,
'user' => $userId,
'session' => $sessionId,
'now' => new DateTime('UTC', new DateTimeZone('UTC')),
'variable' => 'is_mandatory'
])
->getSingleResult();
} catch (Exception $e) {
$invitation = null;
}
if (!$invitation) {
return;
}
$urlParams = http_build_query([
'course' => api_get_course_id(),
'invitationcode' => $invitation->getInvitationCode()
]);
Display::addFlash(
Display::return_message(get_lang('MandatorySurveyNoAnswered'), 'warning')
);
header('Location: '.api_get_path(WEB_CODE_PATH).'survey/fillsurvey.php?'.$urlParams.'&'.api_get_cidreq());
exit;
}
/**
* This function empty surveys (invitations and answers)
*
* @param int $surveyId id of the survey to empty
* @return bool
*/
public static function emptySurveyFromId($surveyId)
{
// Database table definitions
$surveyInvitationTable = Database:: get_course_table(TABLE_SURVEY_INVITATION);
$surveyAnswerTable = Database:: get_course_table(TABLE_SURVEY_ANSWER);
$surveyTable = Database:: get_course_table(TABLE_SURVEY);
$surveyId = (int) $surveyId;
$surveyData = self::get_survey($surveyId);
if (empty($surveyData)) {
return false;
}
$surveyCode = $surveyData['survey_code'];
$courseId = (int) $surveyData['c_id'];
$sessionId = (int) $surveyData['session_id'];
$sql = "DELETE FROM $surveyInvitationTable
WHERE session_id = $sessionId AND c_id = $courseId AND survey_code = '$surveyCode' ";
Database::query($sql);
$sql = "DELETE FROM $surveyAnswerTable
WHERE survey_id = $surveyId AND c_id = $courseId ";
Database::query($sql);
$sql = "UPDATE $surveyTable
SET invited = 0, answered = 0
WHERE survey_id = $surveyId AND c_id = $courseId AND session_id = $sessionId ";
Database::query($sql);
return true;
}
/**
* This function copy survey specifying course id and session id where will be copied
*
* @param int $surveyId
* @param int $courseId target course id
* @param int $sessionId target session id
*
* @return bool|int when fails or return the new survey id
*/
public static function copySurveySession($surveyId, $targetCourseId, $targetSessionId)
{
// Database table definitions
$surveyTable = Database::get_course_table(TABLE_SURVEY);
$surveyQuestionGroupTable = Database::get_course_table(TABLE_SURVEY_QUESTION_GROUP);
$surveyQuestionTable = Database::get_course_table(TABLE_SURVEY_QUESTION);
$surveyOptionsTable = Database::get_course_table(TABLE_SURVEY_QUESTION_OPTION);
$surveyId = (int)$surveyId;
$targetCourseId = (int)$targetCourseId;
$targetSessionId = (int)$targetSessionId;
$surveyData = self::get_survey($surveyId, 0, '', true);
if (empty($surveyData) || empty($targetCourseId)) {
return false;
}
$originalCourseId = $surveyData['c_id'];
$originalSessionId = $surveyData['session_id'];
$surveyData['code'] = self::generate_unique_code($surveyData['code']);
$surveyData['c_id'] = $targetCourseId;
$surveyData['session_id'] = $targetSessionId;
// Add a "Copy" suffix if copied inside the same course
if ($targetCourseId == $originalCourseId) {
$surveyData['title'] = $surveyData['title'].' '.get_lang('Copy');
}
unset($surveyData['iid']);
unset($surveyData['id']);
$newSurveyId = Database::insert($surveyTable, $surveyData);
if ($newSurveyId) {
$sql = "UPDATE $surveyTable SET survey_id = $newSurveyId
WHERE iid = $newSurveyId";
Database::query($sql);
$sql = "SELECT * FROM $surveyQuestionGroupTable
WHERE survey_id = $surveyId AND c_id = $originalCourseId ";
$res = Database::query($sql);
while ($row = Database::fetch_array($res, 'ASSOC')) {
$params = [
'c_id' => $targetCourseId,
'name' => $row['name'],
'description' => $row['description'],
'survey_id' => $newSurveyId
];
$insertId = Database::insert($surveyQuestionGroupTable, $params);
if ($insertId) {
$sql = "UPDATE $surveyQuestionGroupTable SET id = iid WHERE iid = $insertId";
Database::query($sql);
$group_id[$row['id']] = $insertId;
}
}
// Get questions
$sql = "SELECT * FROM $surveyQuestionTable
WHERE survey_id = $surveyId AND c_id = $originalCourseId";
$res = Database::query($sql);
while ($row = Database::fetch_array($res, 'ASSOC')) {
$params = [
'c_id' => $targetCourseId,
'survey_id' => $newSurveyId,
'survey_question' => $row['survey_question'],
'survey_question_comment' => $row['survey_question_comment'],
'type' => $row['type'],
'display' => $row['display'],
'sort' => $row['sort'],
'shared_question_id' => $row['shared_question_id'],
'max_value' => $row['max_value'],
'survey_group_pri' => $row['survey_group_pri'],
'survey_group_sec1' => $row['survey_group_sec1'],
'survey_group_sec2' => $row['survey_group_sec2']
];
$insertId = Database::insert($surveyQuestionTable, $params);
if ($insertId) {
$sql = "UPDATE $surveyQuestionTable
SET question_id = iid
WHERE iid = $insertId";
Database::query($sql);
$question_id[$row['question_id']] = $insertId;
}
}
// Get questions options
$sql = "SELECT * FROM $surveyOptionsTable
WHERE survey_id = $surveyId AND c_id = $originalCourseId";
$res = Database::query($sql);
while ($row = Database::fetch_array($res, 'ASSOC')) {
$params = [
'c_id' => $targetCourseId,
'question_id' => $question_id[$row['question_id']],
'survey_id' => $newSurveyId,
'option_text' => $row['option_text'],
'sort' => $row['sort'],
'value' => $row['value']
];
$insertId = Database::insert($surveyOptionsTable, $params);
if ($insertId) {
$sql = "UPDATE $surveyOptionsTable SET question_option_id = $insertId WHERE iid = $insertId";
Database::query($sql);
}
}
return $newSurveyId;
}
return false;
}
}