Browse Source

Merge pull request #1857 from miky96es/Feature-survey-copy

Feature copiar encuesta en cualquier curso dentro o fuera de una sesión.
Julio Montoya 7 years ago
parent
commit
92d04581b1
4 changed files with 235 additions and 31 deletions
  1. 39 0
      main/inc/lib/course.lib.php
  2. 37 31
      main/survey/copy_survey.php
  3. 155 0
      main/survey/survey.lib.php
  4. 4 0
      main/survey/surveyUtil.class.php

+ 39 - 0
main/inc/lib/course.lib.php

@@ -6548,4 +6548,43 @@ class CourseManager
 
         return $categories;
     }
+
+    /**
+     * Returns an array assoc with info from course and session, of all courses, inside sessions and not inside.
+     * @return array
+     */
+    public static function getAllCoursesArray()
+    {
+        // Database table definitions
+        $courseTable = Database::get_main_table(TABLE_MAIN_COURSE);
+        $sessionTable = Database::get_main_table(TABLE_MAIN_SESSION);
+        $sessionCourseTable = Database::get_main_table(TABLE_MAIN_SESSION_COURSE);
+
+        //select all courses without sessions
+        $sql = "SELECT course.id id,course.title title,0 session_id, course.code code
+                FROM $courseTable course 
+                ORDER BY course.title ASC" ;
+        //select all courses inside sessions
+        $sql1 = "SELECT course.id id,course.title title,session.id session_id,session.name session_name, 
+                 course.code code
+                 FROM $courseTable course ,$sessionTable session, $sessionCourseTable sessioncourse 
+                 WHERE course.id=sessioncourse.c_id 
+                 AND session.id=sessioncourse.session_id ORDER BY session.name ASC, course.title ASC" ;
+        $data = [];
+        //input rows of all courses not inside sessions in a array $data
+        $res = Database::query($sql);
+        if (Database::num_rows($res) > 0) {
+            while ($row = Database::fetch_array($res, "ASSOC")) {
+                $data[] = $row;
+            }
+        }
+        //input rows of all courses inside sessions in a array $data
+        $res1 = Database::query($sql1);
+        if (Database::num_rows($res1) > 0) {
+            while ($row = Database::fetch_array($res1, "ASSOC")) {
+                $data[] = $row;
+            }
+        }
+        return $data;
+    }
 }

+ 37 - 31
main/survey/copy_survey.php

@@ -30,47 +30,53 @@ echo Display::page_header(get_lang('CopySurvey'));
 if (Security::check_token('post')) {
     // Clear token
     Security::clear_token();
-    $surveyId = intval($_POST['surveys']);
-    $courseId = Security::remove_XSS($_POST['destination_course']);
-    $surveyCopyId = SurveyManager::copy_survey($surveyId, null, $courseId);
+    $surveyId = intval($_GET['survey_id']);
+    $arraySent = json_decode(Security::remove_XSS($_POST['destination_course']));
+    $courseId = $arraySent->courseId;
+    $sessionId = $arraySent->sessionId;
     // Copy the survey to the target course
-    SurveyManager::empty_survey($surveyCopyId, $courseId);
+    $surveyCopyId = SurveyManager::copySurveySession($surveyId, $courseId, $sessionId);
     // Empty the copied survey
-    echo Display::return_message(get_lang('SurveyCopied'), 'confirm');
+    SurveyManager::emptySurveyFromId($surveyCopyId);
+    Display::display_confirmation_message(get_lang('SurveyCopied'));
 }
 
-$surveys = SurveyManager::get_surveys(api_get_course_id(), api_get_session_id());
-$courses = CourseManager::get_courses_list();
-$form = new FormValidator(
-    'copy_survey',
-    'post',
-    'copy_survey.php?'.api_get_cidreq()
-);
-if (!$surveys) {
-    echo Display::return_message(get_lang('NoSurveyAvailable'), 'error');
-}
-if (count($courses) <= 1) {
-    echo Display::return_message(get_lang('CourseListNotAvailable'), 'error');
-}
-if ($surveys && count($courses) > 1) {
-    // Surveys select
-    $options = array();
-    foreach ($surveys as $survey) {
-        $options[$survey['survey_id']] = $survey['title'];
-    }
-    $form->addElement('select', 'surveys', get_lang('SelectSurvey'), $options);
-    // All-courses-but-current select
-    $currentCourseId = api_get_course_int_id();
-    $options = array();
-    foreach ($courses as $course) {
-        if ($course['id'] != $currentCourseId) {
-            $options[$course['id']] = $course['title'];
+
+$survey = SurveyManager::get_survey($_GET['survey_id']);
+$courses = CourseManager::getAllCoursesArray();
+// Survey
+$options = array();
+$currentCourseId = api_get_course_int_id();
+$currentSessionId = api_get_session_id();
+$option = str_replace("&nbsp;", '', strip_tags($survey['title']));
+$options = array();
+foreach ($courses as $course) {
+    if (($course['id'] != $currentCourseId || $course['session_id'] != $currentSessionId) &&
+        (api_is_global_platform_admin() || (CourseManager::is_course_teacher(api_get_user_id(), $course['code'])
+                && $course['session_id'] == 0) || api_is_coach($course['session_id'], $course['id']))) {
+        $value = array("courseId" => $course['id'], "sessionId" => $course['session_id']);
+        if (isset($course['session_name'])) {
+            $options[json_encode($value)] = $course['title'].' ['.$course['session_name'].']';
+        } else {
+            $options[json_encode($value)] = $course['title'];
         }
     }
+}
+
+$form = new FormValidator('copy_survey', 'post', 'copy_survey.php?survey_id='.$_GET['survey_id'].api_get_cidreq());
+if (!$survey) {
+    Display::display_error_message(get_lang('NoSurveyAvailable'));
+}
+if (count($courses) < 1 || count($options) < 1) {
+    Display::display_error_message(get_lang('CourseListNotAvailable'));
+}
+if ($survey && count($courses) >= 1 && count($options) >= 1) {
+    $form->addElement('text', 'survey_title', get_lang('Survey'), array('value' => $option, 'disabled' => 'disabled'));
     $form->addElement('select', 'destination_course', get_lang('SelectDestinationCourse'), $options);
     $form->addButtonCopy(get_lang('CopySurvey'));
 }
 
+
 // Add Security token
 $token = Security::get_token();
 $form->addElement('hidden', 'sec_token');

+ 155 - 0
main/survey/survey.lib.php

@@ -1865,4 +1865,159 @@ class SurveyManager
         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 true
+     */
+    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 = intval($surveyId);
+        $surveyData = self::getSurveyArrayFromId($surveyId);
+        $surveyCode = $surveyData['code'];
+        $courseId = intval($surveyData['c_id']);
+        $sessionId = intval($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";
+        Database::query($sql);
+
+        $sql = "UPDATE $surveyTable SET invited=0, answered=0 WHERE survey_id=$surveyId";
+        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
+     * @param int $sessionId
+     *
+     * @return bool when fails or return the new survey id
+     */
+    public static function copySurveySession($surveyId, $courseId, $sessionId)
+    {
+        // 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 = intval($surveyId);
+        $courseId = intval($courseId);
+        $sessionId = intval($sessionId);
+
+        $surveyData = self::getSurveyArrayFromId($surveyId);
+        if (empty($surveyData)) {
+            return true;
+        }
+
+        $params = $surveyData;
+        $params['code'] = self::generate_unique_code($params['code']);
+        $params['c_id'] = $courseId;
+        unset($params['survey_id']);
+        $params['session_id'] = $sessionId;
+        $params['title'] = $params['title'] . ' ' . get_lang('Copy');
+        unset($params['iid']);
+        Database::insert($surveyTable, $params);
+
+        $newSurveyId = Database::insert_id();
+        $sql = "UPDATE $surveyTable SET survey_id =$newSurveyId WHERE iid =$newSurveyId";
+        Database::query($sql);
+
+        $sql = "SELECT * FROM $surveyQuestionGroupTable WHERE survey_id=$surveyId";
+        $res = Database::query($sql);
+        while ($row = Database::fetch_array($res, 'ASSOC')) {
+            $params = array(
+                'c_id' => $courseId,
+                'name' => $row['name'],
+                'description' => $row['description'],
+                'survey_id' => $newSurveyId
+            );
+            $insertId = Database::insert($surveyQuestionGroupTable, $params);
+
+            $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";
+        $res = Database::query($sql);
+        while ($row = Database::fetch_array($res, 'ASSOC')) {
+            $params = array(
+                'c_id' => $courseId,
+                '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);
+            $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";
+
+        $res = Database::query($sql);
+        while ($row = Database::fetch_array($res, 'ASSOC')) {
+            $params = array(
+                'c_id' => $courseId,
+                '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);
+
+            $sql = "UPDATE $surveyOptionsTable SET question_option_id = $insertId WHERE iid = $insertId";
+            Database::query($sql);
+        }
+
+        return $newSurveyId;
+    }
+
+    /**
+     * Retrieves all the survey information as array
+     *
+     * @param integer $survey_id the id of the survey
+     *
+     * @return array
+     */
+    public static function getSurveyArrayFromId($surveyId)
+    {
+        $surveyId=intval($surveyId);
+        // Table definition
+        $surveyTable = Database:: get_course_table(TABLE_SURVEY);
+
+        $sql = "SELECT * FROM $surveyTable WHERE survey_id=$surveyId";
+        $result = Database::query($sql);
+        $return = array();
+        if (Database::num_rows($result) > 0) {
+            $return = Database::fetch_array($result, 'ASSOC');
+            return $return;
+        }
+    }
 }

+ 4 - 0
main/survey/surveyUtil.class.php

@@ -2820,6 +2820,10 @@ class SurveyUtil
                     api_get_path(WEB_CODE_PATH).'survey/generate_link.php?survey_id='.$survey_id.'&'.api_get_cidreq()
                 );
             }
+            $return .= Display::url(
+                Display::return_icon('backup.png', get_lang('CopySurvey'), '', ICON_SIZE_SMALL),
+                'copy_survey.php?survey_id='.$survey_id.'&'.api_get_cidreq()
+            );
             $return .= Display::url(
                 Display::return_icon('copy.png', get_lang('DuplicateSurvey'), '', ICON_SIZE_SMALL),
                 'survey_list.php?action=copy_survey&survey_id='.$survey_id.'&'.api_get_cidreq()