diff --git a/main/exercise/exercise.class.php b/main/exercise/exercise.class.php index 5391d3ee48..b90427a26a 100755 --- a/main/exercise/exercise.class.php +++ b/main/exercise/exercise.class.php @@ -1958,6 +1958,7 @@ class Exercise $this->id, $this->sessionId ); + if ($linkInfo !== false) { GradebookUtils::remove_resource_from_course_gradebook($linkInfo['id']); } @@ -3076,6 +3077,7 @@ class Exercise $categories = $exerciseObject->getCategoriesInExercise(true); // Get all questions no matter the order/category settings $questionList = $exerciseObject->getQuestionOrderedList(); + $sourceId = $exerciseObject->iId; // Force the creation of a new exercise $exerciseObject->updateTitle($exerciseObject->selectTitle().' - '.get_lang('Copy')); // Hides the new exercise @@ -3092,6 +3094,9 @@ class Exercise $em = Database::getManager(); if ($newId && !empty($questionList)) { + $extraField = new ExtraFieldValue('exercise'); + $extraField->copy($sourceId, $newId); + // Question creation foreach ($questionList as $oldQuestionId) { $oldQuestionObj = Question::read($oldQuestionId, null, false); @@ -3099,7 +3104,6 @@ class Exercise if ($newQuestionId) { $newQuestionObj = Question::read($newQuestionId, null, false); if (isset($newQuestionObj) && $newQuestionObj) { - //$newQuestionObj->addToList($newId); $sql = "INSERT INTO $exerciseRelQuestionTable (c_id, question_id, exercice_id, question_order) VALUES ($courseId, ".$newQuestionId.", ".$newId.", '$count')"; Database::query($sql); diff --git a/main/exercise/question.class.php b/main/exercise/question.class.php index 5e61ce3dfa..7262fd7d71 100755 --- a/main/exercise/question.class.php +++ b/main/exercise/question.class.php @@ -1438,6 +1438,10 @@ abstract class Question question_id = ".$id; Database::query($sql); + // Add extra fields. + $extraField = new ExtraFieldValue('question'); + $extraField->deleteValuesByItem($this->iid); + api_item_property_update( $this->course, TOOL_QUIZ, @@ -1454,7 +1458,7 @@ abstract class Question } else { // just removes the exercise from the list $this->removeFromList($deleteFromEx, $courseId); - if (api_get_setting('search_enabled') == 'true' && extension_loaded('xapian')) { + if (api_get_setting('search_enabled') === 'true' && extension_loaded('xapian')) { // disassociate question with this exercise $this->search_engine_edit($deleteFromEx, false, true); } @@ -1483,7 +1487,7 @@ abstract class Question * * @param array $courseInfo Course info of the destination course * - * @return false|string ID of the new question + * @return false|int ID of the new question */ public function duplicate($courseInfo = []) { @@ -1541,6 +1545,10 @@ abstract class Question WHERE iid = $newQuestionId"; Database::query($sql); + // Add extra fields. + $extraField = new ExtraFieldValue('question'); + $extraField->copy($this->iid, $newQuestionId); + if (!empty($options)) { // Saving the quiz_options foreach ($options as $item) { diff --git a/main/inc/lib/extra_field_value.lib.php b/main/inc/lib/extra_field_value.lib.php index ba65d081b5..5b53890969 100755 --- a/main/inc/lib/extra_field_value.lib.php +++ b/main/inc/lib/extra_field_value.lib.php @@ -1215,4 +1215,28 @@ class ExtraFieldValue extends Model return $valueList; } + + public function copy($sourceId, $destinationId) + { + if (empty($sourceId) || empty($destinationId)) { + return false; + } + + $extraField = new ExtraField($this->type); + $allFields = $extraField->get_all(); + $extraFieldValue = new ExtraFieldValue($this->type); + foreach ($allFields as $field) { + $variable = $field['variable']; + $sourceValues = $extraFieldValue->get_values_by_handler_and_field_variable($sourceId, $variable); + if (!empty($sourceValues) && isset($sourceValues['value']) && $sourceValues['value'] != '') { + $params = [ + 'extra_'.$variable => $sourceValues['value'], + 'item_id' => $destinationId + ]; + $extraFieldValue->saveFieldValues($params, true); + } + } + + return true; + } }