diff --git a/mod/lesson/locallib.php b/mod/lesson/locallib.php index 11012058b77..8d9f5f4c831 100644 --- a/mod/lesson/locallib.php +++ b/mod/lesson/locallib.php @@ -2266,45 +2266,77 @@ abstract class lesson_page extends lesson_base { $properties->timemodified = time(); $properties = file_postupdate_standard_editor($properties, 'contents', array('noclean'=>true, 'maxfiles'=>EDITOR_UNLIMITED_FILES, 'maxbytes'=>$maxbytes), $context, 'mod_lesson', 'page_contents', $properties->id); $DB->update_record("lesson_pages", $properties); - - for ($i = 0; $i < $this->lesson->maxanswers; $i++) { - if (!array_key_exists($i, $this->answers)) { - $this->answers[$i] = new stdClass; - $this->answers[$i]->lessonid = $this->lesson->id; - $this->answers[$i]->pageid = $this->id; - $this->answers[$i]->timecreated = $this->timecreated; + if ($this->type == self::TYPE_STRUCTURE && $this->get_typeid() != LESSON_PAGE_BRANCHTABLE) { + if (count($answers) > 1) { + $answer = array_shift($answers); + foreach ($answers as $a) { + $DB->delete_record('lesson_answers', array('id' => $a->id)); + } + } else if (count($answers) == 1) { + $answer = array_shift($answers); + } else { + $answer = new stdClass; + $answer->lessonid = $properties->lessonid; + $answer->pageid = $properties->id; + $answer->timecreated = time(); } - if (!empty($properties->answer_editor[$i]) && is_array($properties->answer_editor[$i])) { - $this->answers[$i]->answer = $properties->answer_editor[$i]['text']; - $this->answers[$i]->answerformat = $properties->answer_editor[$i]['format']; + $answer->timemodified = time(); + if (isset($properties->jumpto[0])) { + $answer->jumpto = $properties->jumpto[0]; } - if (!empty($properties->response_editor[$i]) && is_array($properties->response_editor[$i])) { - $this->answers[$i]->response = $properties->response_editor[$i]['text']; - $this->answers[$i]->responseformat = $properties->response_editor[$i]['format']; + if (isset($properties->score[0])) { + $answer->score = $properties->score[0]; } - - // we don't need to check for isset here because properties called it's own isset method. - if ($this->answers[$i]->answer != '') { - if (isset($properties->jumpto[$i])) { - $this->answers[$i]->jumpto = $properties->jumpto[$i]; - } - if ($this->lesson->custom && isset($properties->score[$i])) { - $this->answers[$i]->score = $properties->score[$i]; - } - if (!isset($this->answers[$i]->id)) { - $this->answers[$i]->id = $DB->insert_record("lesson_answers", $this->answers[$i]); - } else { - $DB->update_record("lesson_answers", $this->answers[$i]->properties()); + if (!empty($answer->id)) { + $DB->update_record("lesson_answers", $answer->properties()); + } else { + $DB->insert_record("lesson_answers", $answer); + } + } else { + for ($i = 0; $i < $this->lesson->maxanswers; $i++) { + if (!array_key_exists($i, $this->answers)) { + $this->answers[$i] = new stdClass; + $this->answers[$i]->lessonid = $this->lesson->id; + $this->answers[$i]->pageid = $this->id; + $this->answers[$i]->timecreated = $this->timecreated; } - // Save files in answers and responses. - $this->save_answers_files($context, $maxbytes, $this->answers[$i], - $properties->answer_editor[$i], $properties->response_editor[$i]); + if (!empty($properties->answer_editor[$i]) && is_array($properties->answer_editor[$i])) { + $this->answers[$i]->answer = $properties->answer_editor[$i]['text']; + $this->answers[$i]->answerformat = $properties->answer_editor[$i]['format']; + } + if (!empty($properties->response_editor[$i]) && is_array($properties->response_editor[$i])) { + $this->answers[$i]->response = $properties->response_editor[$i]['text']; + $this->answers[$i]->responseformat = $properties->response_editor[$i]['format']; + } - } else if (isset($this->answers[$i]->id)) { - $DB->delete_records('lesson_answers', array('id'=>$this->answers[$i]->id)); - unset($this->answers[$i]); + if (isset($this->answers[$i]->answer) && $this->answers[$i]->answer != '') { + if (isset($properties->jumpto[$i])) { + $this->answers[$i]->jumpto = $properties->jumpto[$i]; + } + if ($this->lesson->custom && isset($properties->score[$i])) { + $this->answers[$i]->score = $properties->score[$i]; + } + if (!isset($this->answers[$i]->id)) { + $this->answers[$i]->id = $DB->insert_record("lesson_answers", $this->answers[$i]); + } else { + $DB->update_record("lesson_answers", $this->answers[$i]->properties()); + } + + // Save files in answers and responses. + if (isset($properties->response_editor[$i])) { + $this->save_answers_files($context, $maxbytes, $this->answers[$i], + $properties->answer_editor[$i], $properties->response_editor[$i]); + } else { + $this->save_answers_files($context, $maxbytes, $this->answers[$i], + $properties->answer_editor[$i]); + } + + } else if (isset($this->answers[$i]->id)) { + $DB->delete_records('lesson_answers', array('id' => $this->answers[$i]->id)); + unset($this->answers[$i]); + } } } return true; diff --git a/mod/lesson/pagetypes/endofbranch.php b/mod/lesson/pagetypes/endofbranch.php index fdbfc3e095e..c715677f7d6 100644 --- a/mod/lesson/pagetypes/endofbranch.php +++ b/mod/lesson/pagetypes/endofbranch.php @@ -98,44 +98,7 @@ class lesson_page_type_endofbranch extends lesson_page { public function get_grayout() { return 1; } - public function update($properties, $context = null, $maxbytes = null) { - global $DB, $PAGE; - $properties->id = $this->properties->id; - $properties->lessonid = $this->lesson->id; - if (empty($properties->qoption)) { - $properties->qoption = '0'; - } - $properties->timemodified = time(); - $properties = file_postupdate_standard_editor($properties, 'contents', array('noclean'=>true, 'maxfiles'=>EDITOR_UNLIMITED_FILES, 'maxbytes'=>$PAGE->course->maxbytes), context_module::instance($PAGE->cm->id), 'mod_lesson', 'page_contents', $properties->id); - $DB->update_record("lesson_pages", $properties); - - $answers = $this->get_answers(); - if (count($answers)>1) { - $answer = array_shift($answers); - foreach ($answers as $a) { - $DB->delete_record('lesson_answers', array('id'=>$a->id)); - } - } else if (count($answers)==1) { - $answer = array_shift($answers); - } else { - $answer = new stdClass; - } - - $answer->timemodified = time(); - if (isset($properties->jumpto[0])) { - $answer->jumpto = $properties->jumpto[0]; - } - if (isset($properties->score[0])) { - $answer->score = $properties->score[0]; - } - if (!empty($answer->id)) { - $DB->update_record("lesson_answers", $answer->properties()); - } else { - $DB->insert_record("lesson_answers", $answer); - } - return true; - } public function add_page_link($previd) { global $PAGE, $CFG; if ($previd != 0) { diff --git a/mod/lesson/pagetypes/endofcluster.php b/mod/lesson/pagetypes/endofcluster.php index fb8914d7a1b..f5543537053 100644 --- a/mod/lesson/pagetypes/endofcluster.php +++ b/mod/lesson/pagetypes/endofcluster.php @@ -67,44 +67,7 @@ class lesson_page_type_endofcluster extends lesson_page { public function get_grayout() { return 1; } - public function update($properties, $context = null, $maxbytes = null) { - global $DB, $PAGE; - $properties->id = $this->properties->id; - $properties->lessonid = $this->lesson->id; - if (empty($properties->qoption)) { - $properties->qoption = '0'; - } - $properties->timemodified = time(); - $properties = file_postupdate_standard_editor($properties, 'contents', array('noclean'=>true, 'maxfiles'=>EDITOR_UNLIMITED_FILES, 'maxbytes'=>$PAGE->course->maxbytes), context_module::instance($PAGE->cm->id), 'mod_lesson', 'page_contents', $properties->id); - $DB->update_record("lesson_pages", $properties); - - $answers = $this->get_answers(); - if (count($answers)>1) { - $answer = array_shift($answers); - foreach ($answers as $a) { - $DB->delete_record('lesson_answers', array('id'=>$a->id)); - } - } else if (count($answers)==1) { - $answer = array_shift($answers); - } else { - $answer = new stdClass; - } - - $answer->timemodified = time(); - if (isset($properties->jumpto[0])) { - $answer->jumpto = $properties->jumpto[0]; - } - if (isset($properties->score[0])) { - $answer->score = $properties->score[0]; - } - if (!empty($answer->id)) { - $DB->update_record("lesson_answers", $answer->properties()); - } else { - $DB->insert_record("lesson_answers", $answer); - } - return true; - } public function override_next_page() { global $DB; $jump = $DB->get_field("lesson_answers", "jumpto", array("pageid" => $this->properties->id, "lessonid" => $this->lesson->id)); diff --git a/mod/lesson/tests/behat/lesson_edit_cluster.feature b/mod/lesson/tests/behat/lesson_edit_cluster.feature new file mode 100644 index 00000000000..83633e25475 --- /dev/null +++ b/mod/lesson/tests/behat/lesson_edit_cluster.feature @@ -0,0 +1,113 @@ +@mod @mod_lesson +Feature: In a lesson activity, teacher can edit a cluster page + In order to modify an existing lesson and change navigation + As a teacher + I need to edit cluster pages in the lesson + + Background: + Given the following "users" exist: + | username | firstname | lastname | email | + | teacher1 | Teacher | 1 | teacher1@asd.com | + | student1 | Student | 1 | student1@asd.com | + And the following "courses" exist: + | fullname | shortname | category | + | Course 1 | C1 | 0 | + And the following "course enrolments" exist: + | user | course | role | + | teacher1 | C1 | editingteacher | + | student1 | C1 | student | + And I log in as "teacher1" + And I follow "Course 1" + And I turn editing mode on + And I add a "Lesson" to section "1" and I fill the form with: + | Name | Lesson with cluster | + | Description | Test lesson description | + And I follow "Lesson with cluster" + And I follow "Add a content page" + And I set the following fields to these values: + | Page title | First page name | + | Page contents | First page contents | + | id_answer_editor_0 | Next page | + | id_jumpto_0 | Next page | + And I press "Save page" + And I follow "Expanded" + And I click on "Add a cluster" "link" in the "//div[contains(concat(' ', normalize-space(@class), ' '), ' addlinks ')][2]" "xpath_element" + And I click on "Add a question page here" "link" in the "//div[contains(concat(' ', normalize-space(@class), ' '), ' addlinks ')][3]" "xpath_element" + And I set the field "Select a question type" to "Multichoice" + And I press "Add a question page" + And I set the following fields to these values: + | Page title | question 1 | + | Page contents | Question from cluster | + | id_answer_editor_0 | Correct answer | + | id_response_editor_0 | Good | + | id_jumpto_0 | Cluster | + | id_score_0 | 1 | + | id_answer_editor_1 | Incorrect answer | + | id_response_editor_1 | Bad | + | id_jumpto_1 | This page | + | id_score_1 | 0 | + And I press "Save page" + And I click on "Add a question page here" "link" in the "//div[contains(concat(' ', normalize-space(@class), ' '), ' addlinks ')][4]" "xpath_element" + And I set the field "Select a question type" to "Multichoice" + And I press "Add a question page" + And I set the following fields to these values: + | Page title | question 2 | + | Page contents | Question from cluster | + | id_answer_editor_0 | Correct answer | + | id_response_editor_0 | Good | + | id_jumpto_0 | Cluster | + | id_score_0 | 1 | + | id_answer_editor_1 | Incorrect answer | + | id_response_editor_1 | Bad | + | id_jumpto_1 | This page | + | id_score_1 | 0 | + And I press "Save page" + And I click on "Add an end of cluster" "link" in the "//div[contains(concat(' ', normalize-space(@class), ' '), ' addlinks ')][5]" "xpath_element" + And I click on "Add a content page" "link" in the "//div[contains(concat(' ', normalize-space(@class), ' '), ' addlinks ')][6]" "xpath_element" + And I set the following fields to these values: + | Page title | Second page name | + | Page contents | Content page after cluster | + | id_answer_editor_0 | Next page | + | id_jumpto_0 | Next page | + And I press "Save page" + + @javascript + Scenario: Edit lesson cluster page + Given I click on "//th[normalize-space(.)='Cluster']/descendant::a[2]" "xpath_element" + When I set the following fields to these values: + | Page title | Modified name | + | Page contents | Modified contents | + And I press "Save page" + Then I should see "Modified name" + And I click on "//th[normalize-space(.)='Modified name']/descendant::a[2]" "xpath_element" + And I should see "Unseen question within a cluster" + And I press "Cancel" + And I click on "//th[normalize-space(.)='End of cluster']/descendant::a[2]" "xpath_element" + And I set the following fields to these values: + | Page title | Modified end | + | Page contents | Modified end contents | + | id_jumpto_0 | Second page name | + And I press "Save page" + And I should see "Modified end" + And I log out + And I log in as "student1" + And I follow "Course 1" + And I follow "Lesson with cluster" + And I should see "First page contents" + And I press "Next page" + And I should see "Question from cluster" + And I set the following fields to these values: + | Correct answer | 1 | + And I press "Submit" + And I should see "Good" + And I press "Continue" + And I should see "Question from cluster" + And I set the following fields to these values: + | Correct answer | 1 | + And I press "Submit" + And I should see "Good" + And I press "Continue" + And I should see "Content page after cluster" + And I press "Next page" + And I should see "Congratulations - end of lesson reached" + And I should see "Your score is 2 (out of 2)." diff --git a/mod/lesson/tests/behat/lesson_edit_pages.feature b/mod/lesson/tests/behat/lesson_edit_pages.feature new file mode 100644 index 00000000000..bd9be96d3d5 --- /dev/null +++ b/mod/lesson/tests/behat/lesson_edit_pages.feature @@ -0,0 +1,129 @@ +@mod @mod_lesson +Feature: In a lesson activity, teacher can edit lesson's pages + In order to modify an existing lesson + As a teacher + I need to edit pages in the lesson + + Background: + Given the following "users" exist: + | username | firstname | lastname | email | + | teacher1 | Teacher | 1 | teacher1@asd.com | + | student1 | Student | 1 | student1@asd.com | + And the following "courses" exist: + | fullname | shortname | category | + | Course 1 | C1 | 0 | + And the following "course enrolments" exist: + | user | course | role | + | teacher1 | C1 | editingteacher | + | student1 | C1 | student | + And I log in as "teacher1" + And I follow "Course 1" + And I turn editing mode on + And I add a "Lesson" to section "1" and I fill the form with: + | Name | Test lesson name | + | Description | Test lesson description | + And I follow "Test lesson name" + And I follow "Add a content page" + And I set the following fields to these values: + | Page title | First page name | + | Page contents | First page contents | + | id_answer_editor_0 | Next page | + | id_jumpto_0 | Next page | + And I press "Save page" + And I set the field "qtype" to "Add a content page" + And I set the following fields to these values: + | Page title | Second page name | + | Page contents | Second page contents | + | id_answer_editor_0 | Previous page | + | id_jumpto_0 | Previous page | + | id_answer_editor_1 | Next page | + | id_jumpto_1 | Next page | + And I press "Save page" + And I follow "Expanded" + And I click on "Add a question page here" "link" in the "//div[contains(concat(' ', normalize-space(@class), ' '), ' addlinks ')][3]" "xpath_element" + And I set the field "Select a question type" to "Numerical" + And I press "Add a question page" + And I set the following fields to these values: + | Page title | Hardest question ever | + | Page contents | 1 + 1? | + | id_answer_editor_0 | 2 | + | id_response_editor_0 | Correct answer | + | id_jumpto_0 | End of lesson | + | id_score_0 | 1 | + | id_answer_editor_1 | 1 | + | id_response_editor_1 | Incorrect answer | + | id_jumpto_1 | Second page name | + | id_score_1 | 0 | + And I press "Save page" + + @javascript + Scenario: Edit lesson content page + Given I click on "//th[normalize-space(.)='Second page name']/descendant::a[2]" "xpath_element" + When I set the following fields to these values: + | Page title | Modified second page | + | Page contents | Modified contents | + | id_answer_editor_0 | Forward | + | id_jumpto_0 |Next page | + | id_answer_editor_1 | Backward | + | id_jumpto_1 | Previous page | + And I press "Save page" + Then I should see "Modified second page" + And I should not see "Second page name" + And I log out + And I log in as "student1" + And I follow "Course 1" + And I follow "Test lesson name" + And I should see "First page contents" + And I press "Next page" + And I should see "Modified contents" + And I should not see "Second page contents" + And I press "Backward" + And I should see "First page contents" + And I press "Next page" + And I should see "Modified contents" + And I press "Forward" + And I should see "1 + 1?" + And I set the following fields to these values: + | Your answer | 2 | + And I press "Submit" + And I should see "Correct answer" + And I should not see "Incorrect answer" + And I press "Continue" + And I should see "Congratulations - end of lesson reached" + And I should see "Your score is 1 (out of 1)." + + @javascript + Scenario: Edit lesson question page + Given I click on "//th[normalize-space(.)='Hardest question ever']/descendant::a[2]" "xpath_element" + When I set the following fields to these values: + | Page title | New hardest question | + | Page contents | 1 + 2? | + | id_answer_editor_0 | 2 | + | id_response_editor_0 | Your answer is incorrect | + | id_jumpto_0 | End of lesson | + | id_score_0 | 0 | + | id_answer_editor_1 | 3 | + | id_response_editor_1 | Your answer is correct | + | id_jumpto_1 | End of lesson | + | id_score_1 | 1 | + And I press "Save page" + Then I should see "New hardest question" + And I should not see "Hardest question ever" + And I log out + And I log in as "student1" + And I follow "Course 1" + And I follow "Test lesson name" + And I should see "First page contents" + And I press "Next page" + And I should see "Second page contents" + And I press "Next page" + And I should see "1 + 2?" + And I should not see "1 + 1?" + And I set the following fields to these values: + | Your answer | 3 | + And I press "Submit" + And I should see "Your answer is correct" + And I should not see "Incorrect answer" + And I press "Continue" + And I should see "Congratulations - end of lesson reached" + And I should see "Your score is 1 (out of 1)." \ No newline at end of file