diff --git a/src/transformer/events/mod_book/chapter_viewed.php b/src/transformer/events/mod_book/chapter_viewed.php index 1f5fc30bd..83f605b3c 100644 --- a/src/transformer/events/mod_book/chapter_viewed.php +++ b/src/transformer/events/mod_book/chapter_viewed.php @@ -74,12 +74,40 @@ function chapter_viewed(array $config, \stdClass $event) { ] ]; - if ($chapter->subchapter != '0') { - $parentchapter = $repo->read_record_by_id('book_chapters', $chapter->subchapter); - $statement['context']['contextActivities']['parent'] = [ - utils\get_activity\book_chapter($config, $course, $parentchapter, $event->contextinstanceid) - ]; + // Is parent chapter? + if ($chapter->subchapter == '0') { + return [$statement]; } + $parentchapters = $repo->read_records('book_chapters', [ + 'bookid' => $chapter->bookid, + 'subchapter' => 0, + ]); + + // Could not find parent chapter? + if (empty($parentchapters)) { + return [$statement]; + } + + // Sort the parentchapters by pagenumber ids. + usort($parentchapters, function ($a, $b) { + return $a->pagenum - $b->pagenum; + }); + + // As a default, the first element in the array becomes parent chapter. + $parentchapter = reset($parentchapters); + + foreach ($parentchapters as $posparent) { + // Stop the loop when page number surpasses the subchapter. + if ($posparent->pagenum > $chapter->pagenum) { + break; + } + $parentchapter = $posparent; + } + + $statement['context']['contextActivities']['parent'] = [ + utils\get_activity\book_chapter($config, $course, $parentchapter, $event->contextinstanceid) + ]; + return [$statement]; } diff --git a/src/transformer/repos/TestRepository.php b/src/transformer/repos/TestRepository.php index 02e81b6bd..40e3a06a1 100644 --- a/src/transformer/repos/TestRepository.php +++ b/src/transformer/repos/TestRepository.php @@ -54,11 +54,20 @@ public function read_records(string $type, array $query) { $matchingrecords = []; foreach ($records as $record) { + $conditionfailed = false; + foreach ($query as $key => $value) { - if ($record->$key === $value) { - $matchingrecords[] = (object) $record; + if ($record->$key !== $value) { + $conditionfailed = true; + break; } } + + if ($conditionfailed) { + continue; + } + + $matchingrecords[] = (object) $record; } return $matchingrecords;