@@ -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.
0 commit comments