Learnpath: Enable survey access in LP without invitation - refs #5713

pull/5766/head
christianbeeznst 1 year ago
parent 3c939ba353
commit 24e0a60f53
  1. 7
      public/main/inc/lib/api.lib.php
  2. 24
      public/main/lp/learnpath.class.php
  3. 2
      public/main/lp/lp_view.php
  4. 75
      public/main/survey/fillsurvey.php
  5. 79
      public/main/survey/survey.lib.php
  6. 153
      public/main/survey/surveyUtil.class.php

@ -2438,7 +2438,12 @@ function api_check_password($password)
*/
function api_get_session_id()
{
return (int) Session::read('sid', 0);
$sessionId = (int) Session::read('sid', 0);
if (empty($sessionId) && !empty($_REQUEST['sid'])) {
$sessionId = (int) $_REQUEST['sid'];
}
return $sessionId;
}
/**

@ -10,6 +10,7 @@ use Chamilo\CoreBundle\ServiceHelper\ThemeHelper;
use Chamilo\CourseBundle\Entity\CLpRelUser;
use Chamilo\CoreBundle\Framework\Container;
use Chamilo\CoreBundle\Repository\Node\CourseRepository;
use Chamilo\CourseBundle\Entity\CSurvey;
use Chamilo\CourseBundle\Repository\CLpRelUserRepository;
use Chamilo\CourseBundle\Component\CourseCopy\CourseArchiver;
use Chamilo\CourseBundle\Component\CourseCopy\CourseBuilder;
@ -2767,7 +2768,7 @@ class learnpath
// then change the lp type to thread it as a normal Chamilo LP not a SCO.
if (in_array(
$lp_item_type,
['quiz', 'document', 'final_item', 'link', 'forum', 'thread', 'student_publication']
['quiz', 'document', 'final_item', 'link', 'forum', 'thread', 'student_publication', 'survey']
)
) {
$lp_type = CLp::LP_TYPE;
@ -8015,6 +8016,27 @@ class learnpath
}
return $main_dir_path.'work/work.php?'.api_get_cidreq().'&id='.$rowItem->getPath().'&'.$extraParams;
case TOOL_SURVEY:
$surveyId = (int) $id;
$repo = Container::getSurveyRepository();
if (!empty($surveyId)) {
/** @var CSurvey $survey */
$survey = $repo->find($surveyId);
$autoSurveyLink = SurveyUtil::generateFillSurveyLink(
$survey,
'auto',
api_get_course_entity($course_id),
$session_id
);
$lpParams = [
'lp_id' => $learningPathId,
'lp_item_id' => $id_in_path,
'origin' => 'learnpath',
];
return $autoSurveyLink.'&'.http_build_query($lpParams).'&'.$extraParams;
}
}
return $link;

@ -565,7 +565,7 @@ $frameReady = Display::getFrameReadyBlock(
'#content_id, #content_id_blank',
$itemType,
'function () {
var arr = ["link", "sco", "xapi", "quiz", "h5p", "forum"];
var arr = ["link", "sco", "xapi", "quiz", "h5p", "forum", "survey"];
return $.inArray(olms.lms_item_type, arr) !== -1;
}'

@ -60,6 +60,8 @@ if (empty($courseInfo)) {
$courseId = $courseInfo['real_id'];
$userInfo = api_get_user_info();
$sessionId = isset($_GET['sid']) ? (int) $_GET['sid'] : api_get_session_id();
$lpItemId = isset($_GET['lp_item_id']) ? (int) $_GET['lp_item_id'] : 0;
$allowSurveyInLp = true;
if (!empty($userInfo)) {
$interbreadcrumb[] = [
@ -89,6 +91,16 @@ if (null === $survey) {
$surveyId = $survey->getIid();
$invitationCode = $_GET['invitationcode'] ?? null;
$lpItemCondition = '';
if ($allowSurveyInLp && !empty($lpItemId)) {
$lpItemCondition = " AND c_lp_item_id = $lpItemId";
}
$sessionCondition = '';
if (true === api_get_setting('survey.show_surveys_base_in_sessions')) {
$sessionCondition = api_get_session_condition($sessionId);
}
/*$surveyCode = isset($_GET['scode']) ? Database::escape_string($_GET['scode']) : '';
if ('' != $surveyCode) {
// Firstly we check if this survey is ready for anonymous use:
@ -122,7 +134,9 @@ if ('auto' === $invitationCode) {
$userid,
$surveyCode,
$courseId,
$sessionId
$sessionId,
0,
$lpItemId
);
$lastInvitation = current($invitations);
@ -142,7 +156,9 @@ if ('auto' === $invitationCode) {
FROM $table_survey_invitation
WHERE
c_id = $courseId AND
invitation_code = '".Database::escape_string($autoInvitationCode)."'";
invitation_code = '".Database::escape_string($autoInvitationCode)."'
$sessionCondition
$lpItemCondition";
$result = Database::query($sql);
$now = api_get_utc_datetime();
if (0 == Database::num_rows($result)) {
@ -153,7 +169,7 @@ if ('auto' === $invitationCode) {
'invitation_code' => $autoInvitationCode,
'invitation_date' => $now,
'answered' => 0,
'c_lp_item_id' => 0,
'c_lp_item_id' => $lpItemId,
];
Database::insert($table_survey_invitation, $params);
}
@ -167,7 +183,9 @@ if ('auto' === $invitationCode) {
$sql = "SELECT * FROM $table_survey_invitation
WHERE
c_id = $courseId AND
invitation_code = '".Database::escape_string($invitationCode)."'";
invitation_code = '".Database::escape_string($invitationCode)."'
$sessionCondition
$lpItemCondition";
$result = Database::query($sql);
if (Database::num_rows($result) < 1) {
api_not_allowed(true, get_lang('Wrong invitation code'));
@ -256,7 +274,8 @@ if (count($_POST) > 0) {
SurveyUtil::remove_answer(
$survey_invitation['user_id'],
$surveyId,
$survey_question_id
$survey_question_id,
$lpItemId
);
foreach ($value as $answer_key => &$answer_value) {
@ -273,7 +292,9 @@ if (count($_POST) > 0) {
$survey,
$question,
$option_id,
$option_value
$option_value,
'',
$lpItemId
);
}
} else {
@ -298,7 +319,8 @@ if (count($_POST) > 0) {
SurveyUtil::remove_answer(
$survey_invitation['user_id'],
$surveyId,
$survey_question_id
$survey_question_id,
$lpItemId
);
SurveyUtil::saveAnswer(
@ -307,7 +329,8 @@ if (count($_POST) > 0) {
$question,
$value,
$option_value,
$other
$other,
$lpItemId
);
}
}
@ -358,15 +381,24 @@ if (count($_POST) > 0) {
SurveyUtil::remove_answer(
$survey_invitation['user_id'],
$survey_invitation['survey_id'],
$survey_question_id
$survey_question_id,
api_get_course_int_id(),
$lpItemId
);
$surveyId = (int) $survey_invitation['survey_id'];
$repo = Container::getSurveyRepository();
$survey = $repo->find($surveyId);
SurveyUtil::saveAnswer(
$survey_invitation['user_id'],
$survey_invitation['survey_id'],
api_get_user_entity($survey_invitation['user_id']),
$survey,
$questionList[$survey_question_id],
$value,
$option_value
$option_value,
'',
$lpItemId
);
}
}
@ -398,12 +430,16 @@ if ('' != $survey->getFormFields() &&
}
}
$url = api_get_self().'?cid='.$courseId.'&sid='.$sessionId;
$url = api_get_self().'?'.api_get_cidreq();
$listQueryParams = explode('&', $_SERVER['QUERY_STRING']);
foreach ($listQueryParams as $param) {
$url .= '&'.Security::remove_XSS($param);
}
if (!empty($lpItemId)) {
$url .= '&lp_item_id='.$lpItemId;
}
// We use the same form as in auth/profile.php
$form = new FormValidator('profile', 'post', $url);
if (api_is_western_name_order()) {
@ -611,10 +647,10 @@ if ($survey->getFormFields() &&
if (isset($_POST['finish_survey'])) {
echo Display::return_message(get_lang('You have finished this survey.'), 'confirm');
echo Security::remove_XSS($survey->getSurveythanks());
SurveyManager::updateSurveyAnswered($survey, $survey_invitation['user_id']);
SurveyManager::updateSurveyAnswered($survey, $survey_invitation['user_id'], $lpItemId);
SurveyUtil::flagSurveyAsAnswered($survey->getCode(), $survey_invitation['c_id']);
if ($courseInfo && !api_is_anonymous()) {
if ($courseInfo && !api_is_anonymous() && 'learnpath' !== api_get_origin()) {
echo '<br /><br />';
echo Display::toolbarButton(
get_lang('Return to Course Homepage'),
@ -1179,7 +1215,7 @@ $g_ic = isset($_GET['invitationcode']) ? Security::remove_XSS($_GET['invitationc
$g_cr = isset($_GET['cidReq']) ? Security::remove_XSS($_GET['cidReq']) : '';
$p_l = isset($_POST['language']) ? Security::remove_XSS($_POST['language']) : '';
$add_parameters = isset($_GET['user_id']) ? '&user_id='.intval($_GET['user_id']) : '';
$url = api_get_self().'?cid='.$courseId.'&sid='.$sessionId.$add_parameters.
$url = api_get_self().'?'.api_get_cidreq().$add_parameters.
'&course='.$g_c.
'&invitationcode='.$g_ic.
'&show='.$show.
@ -1189,6 +1225,11 @@ if (!empty($_GET['language'])) {
$lang = Security::remove_XSS($_GET['language']);
$url .= '&language='.$lang;
}
if (!empty($lpItemId)) {
$url .= '&lp_item_id='.$lpItemId;
}
$form = new FormValidator(
'question',
'post',
@ -1256,7 +1297,7 @@ if (isset($questions) && is_array($questions)) {
}
$form->addHtml('<div>'.Security::remove_XSS($question['survey_question']).'</div> ');
$userAnswerData = SurveyUtil::get_answers_of_question_by_user($question['survey_id'], $question['question_id']);
$userAnswerData = SurveyUtil::get_answers_of_question_by_user($question['survey_id'], $question['question_id'], $lpItemId);
$finalAnswer = null;
if (!empty($userAnswerData[$user_id])) {

@ -769,7 +769,7 @@ class SurveyManager
/**
* Updates c_survey.answered: number of people who have taken the survey (=filled at least one question).
*/
public static function updateSurveyAnswered(CSurvey $survey, $user)
public static function updateSurveyAnswered(CSurvey $survey, $user, $lpItemId = 0): void
{
$em = Database::getManager();
$surveyId = $survey->getIid();
@ -780,6 +780,15 @@ class SurveyManager
$em->persist($survey);
$em->flush();
$lpItemCondition = '';
if (!empty($lpItemId)) {
$lpItemCondition = " AND c_lp_item_id = $lpItemId";
}
$sessionCondition = '';
if (true === api_get_configuration_value('show_surveys_base_in_sessions')) {
$sessionCondition = api_get_session_condition($sessionId);
}
$table = Database::get_course_table(TABLE_SURVEY_INVITATION);
// Storing that the user has finished the survey.
$sql = "UPDATE $table
@ -787,10 +796,11 @@ class SurveyManager
answered_at = '".api_get_utc_datetime()."',
answered = 1
WHERE
c_id = $courseId AND
session_id = $sessionId AND
user_id ='".Database::escape_string($user)."' AND
survey_id ='".$surveyId."'";
survey_id ='".$surveyId."'
$sessionCondition
$lpItemCondition";
Database::query($sql);
}
@ -2154,39 +2164,39 @@ class SurveyManager
}
}
/**
* @param int $userId
* @param string $surveyCode
* @param int $courseId
* @param int $sessionId
* @param int $groupId
*
* @return array|CSurveyInvitation[]
*/
public static function getUserInvitationsForSurveyInCourse(
$userId,
$surveyCode,
$courseId,
$sessionId = 0,
$groupId = 0
) {
int $userId,
string $surveyCode,
int $courseId,
int $sessionId = 0,
int $groupId = 0,
int $lpItemId = 0
): array {
$em = Database::getManager();
$invitationRepo = $em->getRepository(CSurveyInvitation::class);
$surveyRepo = $em->getRepository(CSurvey::class);
$survey = $surveyRepo->findBy(['code' => $surveyCode]);
$criteria = [
'user' => api_get_user_entity($userId),
'course' => api_get_course_entity($courseId),
'session' => api_get_session_entity($sessionId),
'group' => api_get_group_entity($groupId),
'survey' => $survey,
];
if (is_int($lpItemId) && $lpItemId > 0) {
$criteria['lpItemId'] = $lpItemId;
}
return $invitationRepo->findBy(
[
'user' => api_get_user_entity($userId),
'course' => api_get_course_entity($courseId),
'session' => api_get_session_entity($sessionId),
'group' => api_get_group_entity($groupId),
'survey' => $survey,
],
$criteria,
['invitationDate' => 'DESC']
);
}
/**
* @param array $userInfo
* @param int $answered (1 = answered 0 = not answered)
@ -2352,4 +2362,23 @@ class SurveyManager
return false;
}
public static function getInvitationsAnswered(
$surveyCode,
$courseId,
$sessionId = 0
): array
{
$invitationRepo = Database::getManager()->getRepository(CSurveyInvitation::class);
return $invitationRepo->findBy(
[
'cId' => $courseId,
'sessionId' => $sessionId,
'answered' => true,
'surveyCode' => $surveyCode,
],
['invitationDate' => 'DESC']
);
}
}

@ -78,14 +78,29 @@ class SurveyUtil
*
* @version January 2007
*/
public static function remove_answer($user, $survey_id, $question_id)
public static function remove_answer($user, $survey_id, $question_id, $course_id, $lpItemId = 0): void
{
$sessionId = api_get_session_id();
$course_id = intval($course_id);
// table definition
$table = Database::get_course_table(TABLE_SURVEY_ANSWER);
$lpItemCondition = '';
if (!empty($lpItemId)) {
$lpItemCondition = " AND c_lp_item_id = $lpItemId";
}
$sessionCondition = '';
if (true === api_get_configuration_value('show_surveys_base_in_sessions')) {
$sessionCondition = api_get_session_condition($sessionId);
}
$sql = "DELETE FROM $table
WHERE
user = '".Database::escape_string($user)."' AND
survey_id = '".intval($survey_id)."' AND
question_id = '".intval($question_id)."'";
question_id = '".intval($question_id)."'
$sessionCondition
$lpItemCondition";
Database::query($sql);
}
@ -95,8 +110,10 @@ class SurveyUtil
CSurveyQuestion $question,
$optionId,
$optionValue,
$otherOption = ''
) {
$otherOption = '',
$lpItemId = 0
): bool {
// Make the survey anonymous
if (1 == $survey->getAnonymous()) {
$surveyUser = Session::read('surveyuser');
@ -120,6 +137,7 @@ class SurveyUtil
->setQuestion($question)
->setOptionId($optionId)
->setValue((int) $optionValue)
->setLpItemId((int) $lpItemId)
->setSessionId($sessionId ?: null)
;
@ -223,10 +241,19 @@ class SurveyUtil
self::display_comparative_report();
break;
case 'completereport':
echo self::displayCompleteReport($survey);
if (true === api_get_configuration_value('allow_survey_tool_in_lp')) {
$surveysAnswered = SurveyManager::getInvitationsAnswered($survey->getCode(), api_get_course_int_id(), api_get_session_id());
if (count($surveysAnswered) > 0) {
foreach ($surveysAnswered as $survey) {
echo self::displayCompleteReport($survey, 0, true, true, !$survey->getAnonymous(), $survey->getLpItemId());
}
}
} else {
echo self::displayCompleteReport($survey, 0, true, true, !$survey->getAnonymous());
}
break;
case 'deleteuserreport':
self::delete_user_report($survey, $_GET['user']);
self::delete_user_report($survey->getIid(), $_GET['user']);
break;
}
}
@ -252,9 +279,16 @@ class SurveyUtil
$user_id = Database::escape_string($user_id);
if (!empty($survey_id) && !empty($user_id)) {
$sessionCondition = '';
if (true === api_get_configuration_value('show_surveys_base_in_sessions')) {
$sessionId = api_get_session_id();
$sessionCondition = api_get_session_condition($sessionId);
}
// delete data from survey_answer by user_id and survey_id
$sql = "DELETE FROM $table_survey_answer
WHERE c_id = $course_id AND survey_id = '".$survey_id."' AND user = '".$user_id."'";
WHERE c_id = $course_id AND survey_id = '".$survey_id."' AND user = '".$user_id."' $sessionCondition";
Database::query($sql);
// update field answered from survey_invitation by user_id and survey_id
$sql = "UPDATE $table_survey_invitation SET answered = '0'
@ -265,7 +299,7 @@ class SurveyUtil
WHERE
iid = '".$survey_id."'
) AND
user_id = '".$user_id."'";
user_id = '".$user_id."' $sessionCondition";
$result = Database::query($sql);
}
@ -379,11 +413,17 @@ class SurveyUtil
}
}
$sessionCondition = '';
if (true === api_get_configuration_value('show_surveys_base_in_sessions')) {
$sessionId = api_get_session_id();
$sessionCondition = api_get_session_condition($sessionId);
}
// Getting all the answers of the user
$sql = "SELECT * FROM $table_survey_answer
WHERE
survey_id = '".$surveyId."' AND
user = '".$userId."'";
user = '".$userId."' $sessionCondition";
$result = Database::query($sql);
while ($row = Database::fetch_assoc($result)) {
$answers[$row['question_id']][] = $row['option_id'];
@ -514,6 +554,15 @@ class SurveyUtil
$surveyId = $survey->getIid();
$action = isset($_GET['action']) ? Security::remove_XSS($_GET['action']) : '';
$course_id = api_get_course_int_id();
$sessionCondition = '';
if (true === api_get_configuration_value('show_surveys_base_in_sessions')) {
$sessionId = api_get_session_id();
$sessionCondition = api_get_session_condition($sessionId);
}
// Database table definitions
$table_survey_question = Database::get_course_table(TABLE_SURVEY_QUESTION);
$table_survey_question_option = Database::get_course_table(TABLE_SURVEY_QUESTION_OPTION);
$table_survey_answer = Database::get_course_table(TABLE_SURVEY_ANSWER);
@ -781,7 +830,7 @@ class SurveyUtil
WHERE
c_id = $course_id AND
option_id = '".Database::escape_string($_GET['viewoption'])."'
$sql_restriction";
$sql_restriction $sessionCondition";
$result = Database::query($sql);
echo '<ul>';
while ($row = Database::fetch_assoc($result)) {
@ -809,14 +858,13 @@ class SurveyUtil
$surveyId = $survey->getIid();
$questionId = $question->getIid();
$options = $survey->getOptions();
// Getting the options
/*$sql = "SELECT * FROM $table_survey_question_option
WHERE
survey_id= $surveyId AND
question_id = '".intval($question['iid'])."'
ORDER BY sort ASC";
$result = Database::query($sql);
while ($row = Database::fetch_array($result)) {*/
$sessionCondition = '';
if (true === api_get_configuration_value('show_surveys_base_in_sessions')) {
$sessionId = api_get_session_id();
$sessionCondition = api_get_session_condition($sessionId);
}
foreach ($options as $option) {
$options[$option->getIid()] = $option;
}
@ -827,6 +875,7 @@ class SurveyUtil
WHERE
survey_id= $surveyId AND
question_id = '".$questionId."'
$sessionCondition
GROUP BY option_id, value";
$result = Database::query($sql);
$number_of_answers = 0;
@ -936,7 +985,8 @@ class SurveyUtil
$userId = 0,
$addActionBar = true,
$addFilters = true,
$addExtraFields = true
$addExtraFields = true,
$lpItemId = 0
) {
// Database table definitions
$table_survey_question = Database::get_course_table(TABLE_SURVEY_QUESTION);
@ -950,8 +1000,38 @@ class SurveyUtil
return '';
}
$sessionCondition = '';
if (true === api_get_configuration_value('show_surveys_base_in_sessions')) {
$sessionId = api_get_session_id();
$sessionCondition = api_get_session_condition($sessionId);
}
$lpItemCondition = '';
if (!empty($lpItemId)) {
$lpItemCondition = " AND c_lp_item_id = $lpItemId";
}
$action = isset($_GET['action']) ? Security::remove_XSS($_GET['action']) : '';
$content = '';
if (!empty($lpItemId)) {
$tableLp = Database::get_course_table(TABLE_LP_MAIN);
$tableLpItem = Database::get_course_table(TABLE_LP_ITEM);
$sql = "SELECT l.name,
li.title
FROM $tableLpItem li
INNER JOIN $tableLp l
ON l.iid = li.lp_id AND
l.c_id = li.c_id
WHERE li.c_id = $course_id AND
li.iid = $lpItemId";
$rs = Database::query($sql);
if (Database::num_rows($rs) > 0) {
$row = Database::fetch_assoc($rs);
$lpName = $row['name'];
$lpItemTitle = $row['title'];
$content .= '<h3>'.$lpName.' : '.$lpItemTitle.'</h3>';
}
}
if ($addActionBar) {
$actions = '<a
href="'.api_get_path(WEB_CODE_PATH).'survey/reporting.php?survey_id='.$surveyId.'&'.api_get_cidreq().'">'
@ -1173,6 +1253,8 @@ class SurveyUtil
WHERE
survey_id = $surveyId
$userCondition
$sessionCondition
$lpItemCondition
ORDER BY iid, user ASC";
$result = Database::query($sql);
$i = 1;
@ -1359,6 +1441,12 @@ class SurveyUtil
$course = api_get_course_info();
$course_id = $course['real_id'];
$sessionCondition = '';
if (true === api_get_configuration_value('show_surveys_base_in_sessions')) {
$sessionId = api_get_session_id();
$sessionCondition = api_get_session_condition($sessionId);
}
$table_survey_question = Database::get_course_table(TABLE_SURVEY_QUESTION);
$table_survey_question_option = Database::get_course_table(TABLE_SURVEY_QUESTION_OPTION);
$table_survey_answer = Database::get_course_table(TABLE_SURVEY_ANSWER);
@ -1505,6 +1593,7 @@ class SurveyUtil
$sql = "SELECT * FROM $table_survey_answer
WHERE
survey_id = $surveyId
$sessionCondition
";
if (0 != $user_id) {
$user_id = (int) $user_id;
@ -2219,15 +2308,27 @@ class SurveyUtil
*
* @version February 2007 - Updated March 2008
*/
public static function get_answers_of_question_by_user($survey_id, $question_id)
public static function get_answers_of_question_by_user($survey_id, $question_id, $lpItemId = 0)
{
$course_id = api_get_course_int_id();
$table_survey_answer = Database::get_course_table(TABLE_SURVEY_ANSWER);
$sessionCondition = '';
if (true === api_get_configuration_value('show_surveys_base_in_sessions')) {
$sessionId = api_get_session_id();
$sessionCondition = api_get_session_condition($sessionId);
}
$lpItemCondition = '';
if (!empty($lpItemId)) {
$lpItemCondition = " AND c_lp_item_id = $lpItemId";
}
$sql = "SELECT * FROM $table_survey_answer
WHERE
survey_id='".intval($survey_id)."' AND
question_id='".intval($question_id)."'
$sessionCondition
$lpItemCondition
ORDER BY USER ASC";
$result = Database::query($sql);
$return = [];
@ -3861,11 +3962,8 @@ class SurveyUtil
/**
* Set a flag to the current survey as answered by the current user.
*
* @param string $surveyCode The survey code
* @param int $courseId The course ID
*/
public static function flagSurveyAsAnswered($surveyCode, $courseId)
public static function flagSurveyAsAnswered(string $surveyCode, int $courseId): void
{
$currentUserId = api_get_user_id();
$flag = sprintf('%s-%s-%d', $courseId, $surveyCode, $currentUserId);
@ -3879,13 +3977,8 @@ class SurveyUtil
/**
* Check whether a survey was answered by the current user.
*
* @param string $surveyCode The survey code
* @param int $courseId The course ID
*
* @return bool
*/
public static function isSurveyAnsweredFlagged($surveyCode, $courseId)
public static function isSurveyAnsweredFlagged(string $surveyCode, int $courseId): bool
{
$currentUserId = api_get_user_id();
$flagToCheck = sprintf('%s-%s-%d', $courseId, $surveyCode, $currentUserId);

Loading…
Cancel
Save