checkCourse($id); $user = $this->getCurrentUser(); $this->setCourseUser($course, $user); return $this->getChapters($course, $user); } protected function getChapters(CourseModel $course, UserModel $user) { $cache = new CourseChapterListCache(); $chapters = $cache->get($course->id); if (count($chapters) == 0) return []; if ($user->id > 0 && $this->courseUser) { $mapping = $this->getLearningMapping($course->id, $user->id, $this->courseUser->plan_id); foreach ($chapters as &$chapter) { foreach ($chapter['children'] as &$lesson) { /** * @todo v1.4.1之前缓存中无published字段,临时给默认值 */ $lesson['published'] = $lesson['published'] ?? 1; $owned = ($this->ownedCourse || $lesson['free'] == 1) && $lesson['published'] == 1; $lesson['me'] = [ 'owned' => $owned ? 1 : 0, 'progress' => $mapping[$lesson['id']]['progress'] ?? 0, 'duration' => $mapping[$lesson['id']]['duration'] ?? 0, ]; } } } else { foreach ($chapters as &$chapter) { foreach ($chapter['children'] as &$lesson) { /** * @todo v1.4.1之前缓存中无published字段,临时给默认值 */ $lesson['published'] = $lesson['published'] ?? 1; $owned = ($this->ownedCourse || $lesson['free'] == 1) && $lesson['published'] == 1; $lesson['me'] = [ 'owned' => $owned ? 1 : 0, 'progress' => 0, 'duration' => 0, ]; } } } return $chapters; } protected function getLearningMapping($courseId, $userId, $planId) { $courseRepo = new CourseRepo(); $userLearnings = $courseRepo->findUserLearnings($courseId, $userId, $planId); if ($userLearnings->count() == 0) return []; $mapping = []; foreach ($userLearnings as $learning) { $mapping[$learning->chapter_id] = [ 'progress' => $learning->progress, 'duration' => $learning->duration, 'consumed' => $learning->consumed, ]; } return $mapping; } }