Skip to content

Commit 9d2eb0a

Browse files
Survey: Merge copy_survey() and copySurveySession() #3278 - refs #3278
1 parent e3993e5 commit 9d2eb0a

File tree

3 files changed

+74
-224
lines changed

3 files changed

+74
-224
lines changed

public/main/survey/copy_survey.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@
6969
$sessionId = $courseParts[1];
7070

7171
// Copy the survey to the target course
72-
$surveyCopyId = SurveyManager::copySurveySession($surveyId, $courseId, $sessionId);
72+
$surveyCopyId = SurveyManager::copySurvey($surveyId, null, $courseId, $sessionId);
7373
if ($surveyCopyId) {
7474
// Empty the copied survey
7575
SurveyManager::emptySurveyFromId($surveyCopyId);

public/main/survey/survey.lib.php

+72-222
Original file line numberDiff line numberDiff line change
@@ -358,7 +358,7 @@ public static function store_survey($values)
358358
}
359359

360360
if (1 == $values['survey_type'] && !empty($values['parent_id'])) {
361-
self::copy_survey($values['parent_id'], $survey_id);
361+
self::copySurvey($values['parent_id'], $survey_id);
362362
}
363363

364364
Display::addFlash(
@@ -559,114 +559,90 @@ public static function deleteSurvey(CSurvey $survey)
559559

560560
/**
561561
* Copy given survey to a new (optional) given survey ID.
562-
*
563-
* @param int $survey_id
564-
* @param int $new_survey_id
565-
* @param int $targetCourseId
566-
*
567-
* @return bool
568562
*/
569-
public static function copy_survey($survey_id, $new_survey_id = null, $targetCourseId = null)
570-
{
571-
$course_id = api_get_course_int_id();
563+
public static function copySurvey(
564+
int $surveyId,
565+
?int $newSurveyId = null,
566+
?int $targetCourseId = null,
567+
?int $targetSessionId = null
568+
): ?int {
569+
$originalCourseId = api_get_course_int_id();
572570
if (!$targetCourseId) {
573-
$targetCourseId = $course_id;
571+
$targetCourseId = $originalCourseId;
574572
}
575573

576-
// Database table definitions
577-
$table_survey = Database::get_course_table(TABLE_SURVEY);
578-
$table_survey_question_group = Database::get_course_table(TABLE_SURVEY_QUESTION_GROUP);
579-
$table_survey_question = Database::get_course_table(TABLE_SURVEY_QUESTION);
580-
$table_survey_options = Database::get_course_table(TABLE_SURVEY_QUESTION_OPTION);
581-
$survey_id = (int) $survey_id;
582574
$repo = Container::getSurveyRepository();
583575

584-
// Get groups
585-
$survey_data = self::get_survey($survey_id, 0, null, true);
586-
if (empty($survey_data)) {
587-
return true;
576+
$surveyTable = Database::get_course_table(TABLE_SURVEY);
577+
$surveyQuestionTable = Database::get_course_table(TABLE_SURVEY_QUESTION);
578+
$surveyOptionsTable = Database::get_course_table(TABLE_SURVEY_QUESTION_OPTION);
579+
580+
$surveyData = self::get_survey($surveyId, 0, null, true);
581+
if (empty($surveyData)) {
582+
return null;
588583
}
589584

590-
if (empty($new_survey_id)) {
591-
$params = $survey_data;
592-
$params['code'] = self::generate_unique_code($params['code']);
593-
$params['c_id'] = $targetCourseId;
594-
unset($params['survey_id']);
595-
$params['session_id'] = api_get_session_id();
596-
$params['title'] = $params['title'].' '.get_lang('Copy');
597-
unset($params['iid']);
598-
$params['invited'] = 0;
599-
$params['answered'] = 0;
585+
if (empty($newSurveyId)) {
586+
$surveyData['code'] = self::generate_unique_code($surveyData['code']);
587+
$surveyData['session_id'] = $targetSessionId ?? api_get_session_id();
600588

601-
$course = api_get_course_entity();
602-
$session = api_get_session_entity();
603-
$survey = new CSurvey();
604-
$survey->setShowFormProfile($params['show_form_profile']);
605-
$survey->setFormFields($params['form_fields']);
606-
$survey
607-
->setSurveyType($params['survey_type'])
608-
->setShuffle($params['shuffle'])
609-
->setOneQuestionPerPage($params['one_question_per_page'])
610-
;
611-
$survey->setSurveyVersion($params['survey_version']);
612-
$survey
613-
->setCode($params['code'])
614-
->setTitle($params['title'])
615-
->setSubtitle($params['subtitle'])
616-
->setLang($params['lang'])
617-
->setAvailFrom(new \DateTime($params['avail_from']))
618-
->setAvailTill(new \DateTime($params['avail_till']))
619-
->setIsShared($params['is_shared'])
620-
->setTemplate($params['template'])
621-
->setIntro($params['intro'])
622-
->setSurveyThanks($params['surveythanks'])
623-
->setAnonymous($params['anonymous'])
624-
->setVisibleResults($params['visible_results'])
625-
->setSurveyType($params['survey_type'])
626-
->setParent($course)
627-
->addCourseLink($course, $session)
628-
;
629-
630-
if (isset($params['parent_id']) && !empty($params['parent_id'])) {
631-
$parent = $repo->find($params['parent_id']);
632-
$survey->setSurveyParent($parent);
589+
if ($targetCourseId === $originalCourseId) {
590+
$surveyData['title'] .= ' '.get_lang('Copy');
633591
}
634592

635-
$repo->create($survey);
636-
$new_survey_id = $survey->getIid();
637-
} else {
638-
$new_survey_id = (int) $new_survey_id;
639-
}
640-
641-
/*$sql = "SELECT * FROM $table_survey_question_group
642-
WHERE iid = $survey_id";
643-
644-
$res = Database::query($sql);
645-
while ($row = Database::fetch_assoc($res)) {
646-
$params = [
647-
'c_id' => $targetCourseId,
648-
'name' => $row['title'],
649-
'description' => $row['description'],
650-
'survey_id' => $new_survey_id,
651-
];
593+
unset($surveyData['iid'], $surveyData['id']);
652594

653-
$insertId = Database::insert($table_survey_question_group, $params);
595+
if ($targetSessionId) {
596+
$newSurveyId = Database::insert($surveyTable, $surveyData);
597+
} else {
598+
$course = api_get_course_entity();
599+
$session = api_get_session_entity();
654600

655-
$sql = "UPDATE $table_survey_question_group SET id = iid
656-
WHERE iid = $insertId";
657-
Database::query($sql);
601+
$survey = new CSurvey();
602+
$survey
603+
->setSurveyType($surveyData['survey_type'])
604+
->setSurveyVersion($surveyData['survey_version'])
605+
->setCode($surveyData['code'])
606+
->setTitle($surveyData['title'])
607+
->setSubtitle($surveyData['subtitle'])
608+
->setLang($surveyData['lang'])
609+
->setAvailFrom(new \DateTime($surveyData['avail_from']))
610+
->setAvailTill(new \DateTime($surveyData['avail_till']))
611+
->setIsShared($surveyData['is_shared'])
612+
->setTemplate($surveyData['template'])
613+
->setIntro($surveyData['intro'])
614+
->setSurveyThanks($surveyData['surveythanks'])
615+
->setAnonymous($surveyData['anonymous'])
616+
->setVisibleResults($surveyData['visible_results'])
617+
->setShuffle($surveyData['shuffle'])
618+
->setOneQuestionPerPage($surveyData['one_question_per_page'])
619+
->setShowFormProfile($surveyData['show_form_profile'])
620+
->setFormFields($surveyData['form_fields'])
621+
->setParent($course)
622+
->addCourseLink($course, $session);
623+
624+
if (!empty($surveyData['parent_id'])) {
625+
$parent = $repo->find($surveyData['parent_id']);
626+
if ($parent) {
627+
$survey->setSurveyParent($parent);
628+
}
629+
}
658630

659-
$group_id[$row['id']] = $insertId;
660-
}*/
631+
$repo->create($survey);
632+
$newSurveyId = $survey->getIid();
633+
}
634+
}
661635

662-
// Get questions
663-
$sql = "SELECT * FROM $table_survey_question
664-
WHERE survey_id = $survey_id";
636+
if (empty($newSurveyId)) {
637+
return null;
638+
}
665639

640+
$sql = "SELECT * FROM $surveyQuestionTable WHERE survey_id = $surveyId";
666641
$res = Database::query($sql);
642+
$question_id = [];
667643
while ($row = Database::fetch_assoc($res)) {
668644
$params = [
669-
'survey_id' => $new_survey_id,
645+
'survey_id' => $newSurveyId,
670646
'survey_question' => $row['survey_question'],
671647
'survey_question_comment' => $row['survey_question_comment'],
672648
'type' => $row['type'],
@@ -683,31 +659,26 @@ public static function copy_survey($survey_id, $new_survey_id = null, $targetCou
683659
$params['is_required'] = $row['is_required'];
684660
}
685661

686-
$insertId = Database::insert($table_survey_question, $params);
662+
$insertId = Database::insert($surveyQuestionTable, $params);
687663
if ($insertId) {
688-
/*$sql = "UPDATE $table_survey_question SET question_id = iid WHERE iid = $insertId";
689-
Database::query($sql);*/
690664
$question_id[$row['iid']] = $insertId;
691665
}
692666
}
693667

694-
// Get questions options
695-
$sql = "SELECT * FROM $table_survey_options
696-
WHERE survey_id='".$survey_id."'";
697-
668+
$sql = "SELECT * FROM $surveyOptionsTable WHERE survey_id = $surveyId";
698669
$res = Database::query($sql);
699670
while ($row = Database::fetch_assoc($res)) {
700671
$params = [
701-
'question_id' => $question_id[$row['question_id']],
702-
'survey_id' => $new_survey_id,
672+
'question_id' => $question_id[$row['question_id']] ?? 0,
673+
'survey_id' => $newSurveyId,
703674
'option_text' => $row['option_text'],
704675
'sort' => $row['sort'],
705676
'value' => $row['value'],
706677
];
707-
$insertId = Database::insert($table_survey_options, $params);
678+
Database::insert($surveyOptionsTable, $params);
708679
}
709680

710-
return $new_survey_id;
681+
return $newSurveyId;
711682
}
712683

713684
/**
@@ -1674,127 +1645,6 @@ public static function emptySurveyFromId($surveyId)
16741645
return true;
16751646
}
16761647

1677-
/**
1678-
* Copy survey specifying course ID and session ID where will be copied.
1679-
*
1680-
* @param int $surveyId
1681-
* @param int $targetCourseId target course id
1682-
* @param int $targetSessionId target session id
1683-
*
1684-
* @return bool|int when fails or return the new survey id
1685-
*/
1686-
public static function copySurveySession($surveyId, $targetCourseId, $targetSessionId)
1687-
{
1688-
// Database table definitions
1689-
$surveyTable = Database::get_course_table(TABLE_SURVEY);
1690-
$surveyQuestionGroupTable = Database::get_course_table(TABLE_SURVEY_QUESTION_GROUP);
1691-
$surveyQuestionTable = Database::get_course_table(TABLE_SURVEY_QUESTION);
1692-
$surveyOptionsTable = Database::get_course_table(TABLE_SURVEY_QUESTION_OPTION);
1693-
$surveyId = (int) $surveyId;
1694-
$targetCourseId = (int) $targetCourseId;
1695-
$targetSessionId = (int) $targetSessionId;
1696-
1697-
$surveyData = self::get_survey($surveyId, 0, '', true);
1698-
if (empty($surveyData) || empty($targetCourseId)) {
1699-
return false;
1700-
}
1701-
1702-
$originalCourseId = $surveyData['c_id'];
1703-
$originalSessionId = $surveyData['session_id'];
1704-
1705-
$surveyData['code'] = self::generate_unique_code($surveyData['code']);
1706-
$surveyData['c_id'] = $targetCourseId;
1707-
$surveyData['session_id'] = $targetSessionId;
1708-
// Add a "Copy" suffix if copied inside the same course
1709-
if ($targetCourseId == $originalCourseId) {
1710-
$surveyData['title'] = $surveyData['title'].' '.get_lang('Copy');
1711-
}
1712-
unset($surveyData['iid']);
1713-
unset($surveyData['id']);
1714-
1715-
$newSurveyId = Database::insert($surveyTable, $surveyData);
1716-
1717-
if ($newSurveyId) {
1718-
$sql = "SELECT * FROM $surveyQuestionGroupTable
1719-
WHERE c_id = $originalCourseId AND survey_id = $surveyId";
1720-
$res = Database::query($sql);
1721-
while ($row = Database::fetch_assoc($res)) {
1722-
$params = [
1723-
'c_id' => $targetCourseId,
1724-
'name' => $row['title'],
1725-
'description' => $row['description'],
1726-
'survey_id' => $newSurveyId,
1727-
];
1728-
$insertId = Database::insert($surveyQuestionGroupTable, $params);
1729-
if ($insertId) {
1730-
$sql = "UPDATE $surveyQuestionGroupTable SET id = iid WHERE iid = $insertId";
1731-
Database::query($sql);
1732-
$group_id[$row['id']] = $insertId;
1733-
}
1734-
}
1735-
1736-
// Get questions
1737-
$sql = "SELECT * FROM $surveyQuestionTable
1738-
WHERE c_id = $originalCourseId AND survey_id = $surveyId";
1739-
$res = Database::query($sql);
1740-
while ($row = Database::fetch_assoc($res)) {
1741-
$params = [
1742-
'c_id' => $targetCourseId,
1743-
'survey_id' => $newSurveyId,
1744-
'survey_question' => $row['survey_question'],
1745-
'survey_question_comment' => $row['survey_question_comment'],
1746-
'type' => $row['type'],
1747-
'display' => $row['display'],
1748-
'sort' => $row['sort'],
1749-
'shared_question_id' => $row['shared_question_id'],
1750-
'max_value' => $row['max_value'],
1751-
'survey_group_pri' => $row['survey_group_pri'],
1752-
'survey_group_sec1' => $row['survey_group_sec1'],
1753-
'survey_group_sec2' => $row['survey_group_sec2'],
1754-
];
1755-
1756-
if (isset($row['is_required'])) {
1757-
$params['is_required'] = $row['is_required'];
1758-
}
1759-
1760-
$insertId = Database::insert($surveyQuestionTable, $params);
1761-
if ($insertId) {
1762-
/*$sql = "UPDATE $surveyQuestionTable
1763-
SET question_id = iid
1764-
WHERE iid = $insertId";
1765-
Database::query($sql);*/
1766-
1767-
$question_id[$row['iid']] = $insertId;
1768-
}
1769-
}
1770-
1771-
// Get questions options
1772-
$sql = "SELECT * FROM $surveyOptionsTable
1773-
WHERE survey_id = $surveyId AND c_id = $originalCourseId";
1774-
1775-
$res = Database::query($sql);
1776-
while ($row = Database::fetch_assoc($res)) {
1777-
$params = [
1778-
'c_id' => $targetCourseId,
1779-
'question_id' => $question_id[$row['question_id']],
1780-
'survey_id' => $newSurveyId,
1781-
'option_text' => $row['option_text'],
1782-
'sort' => $row['sort'],
1783-
'value' => $row['value'],
1784-
];
1785-
$insertId = Database::insert($surveyOptionsTable, $params);
1786-
if ($insertId) {
1787-
$sql = "UPDATE $surveyOptionsTable SET question_option_id = $insertId WHERE iid = $insertId";
1788-
Database::query($sql);
1789-
}
1790-
}
1791-
1792-
return $newSurveyId;
1793-
}
1794-
1795-
return false;
1796-
}
1797-
17981648
/**
17991649
* Copy/duplicate one question (into the same survey).
18001650
* Note: Relies on the question iid to find all necessary info.

public/main/survey/survey_list.php

+1-1
Original file line numberDiff line numberDiff line change
@@ -504,7 +504,7 @@
504504
break;
505505
case 'copy_survey':
506506
if (!empty($surveyId) && api_is_allowed_to_edit()) {
507-
SurveyManager::copy_survey($surveyId);
507+
SurveyManager::copySurvey($surveyId);
508508
Display::addFlash(Display::return_message(get_lang('SurveyCopied'), 'confirmation', false));
509509
header('Location: '.$listUrl);
510510
exit;

0 commit comments

Comments
 (0)