MDL-58490 block_myoverview: separate course and activity completion
[moodle.git] / blocks / myoverview / classes / output / courses_view.php
1 <?php
2 // This file is part of Moodle - http://moodle.org/
3 //
4 // Moodle is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // Moodle is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
17 /**
18  * Class containing data for courses view in the myoverview block.
19  *
20  * @package    block_myoverview
21  * @copyright  2017 Ryan Wyllie <ryan@moodle.com>
22  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
24 namespace block_myoverview\output;
25 defined('MOODLE_INTERNAL') || die();
27 use renderable;
28 use renderer_base;
29 use templatable;
30 use core_course\external\course_summary_exporter;
32 /**
33  * Class containing data for courses view in the myoverview block.
34  *
35  * @copyright  2017 Simey Lameze <simey@moodle.com>
36  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
37  */
38 class courses_view implements renderable, templatable {
39     /** Quantity of courses per page. */
40     const COURSES_PER_PAGE = 6;
42     /** @var array $courses List of courses the user is enrolled in. */
43     protected $courses = [];
45     /** @var array $coursesprogress List of progress percentage for each course. */
46     protected $coursesprogress = [];
48     /**
49      * The courses_view constructor.
50      *
51      * @param array $courses list of courses.
52      * @param array $coursesprogress list of courses progress.
53      */
54     public function __construct($courses, $coursesprogress) {
55         $this->courses = $courses;
56         $this->coursesprogress = $coursesprogress;
57     }
59     /**
60      * Export this data so it can be used as the context for a mustache template.
61      *
62      * @param \renderer_base $output
63      * @return array
64      */
65     public function export_for_template(renderer_base $output) {
66         $today = time();
68         // Build courses view data structure.
69         $coursesview = [
70             'hascourses' => !empty($this->courses)
71         ];
73         // How many courses we have per status?
74         $coursesbystatus = ['past' => 0, 'inprogress' => 0, 'future' => 0];
75         foreach ($this->courses as $course) {
76             $startdate = $course->startdate;
77             $enddate = $course->enddate;
78             $courseid = $course->id;
79             $context = \context_course::instance($courseid);
80             // Convert summary to plain text.
81             $course->summary = content_to_text($course->summary, false);
82             $exporter = new course_summary_exporter($course, [
83                 'context' => $context
84             ]);
85             $exportedcourse = $exporter->export($output);
87             if (isset($this->coursesprogress[$courseid])) {
88                 $coursecompleted = $this->coursesprogress[$courseid]['completed'];
89                 $courseprogress = $this->coursesprogress[$courseid]['progress'];
90                 $exportedcourse->hasprogress = !is_null($courseprogress);
91                 $exportedcourse->progress = $courseprogress;
92             }
94             if ((isset($coursecompleted) && $coursecompleted) || (!empty($enddate) && $enddate < $today)) {
95                 // Courses that have already ended.
96                 $pastpages = floor($coursesbystatus['past'] / $this::COURSES_PER_PAGE);
98                 $coursesview['past']['pages'][$pastpages]['courses'][] = $exportedcourse;
99                 $coursesview['past']['pages'][$pastpages]['active'] = ($pastpages == 0 ? true : false);
100                 $coursesview['past']['pages'][$pastpages]['page'] = $pastpages + 1;
101                 $coursesview['past']['haspages'] = true;
102                 $coursesbystatus['past']++;
103             } else if ($startdate > $today) {
104                 // Courses that have not started yet.
105                 $futurepages = floor($coursesbystatus['future'] / $this::COURSES_PER_PAGE);
107                 $coursesview['future']['pages'][$futurepages]['courses'][] = $exportedcourse;
108                 $coursesview['future']['pages'][$futurepages]['active'] = ($futurepages == 0 ? true : false);
109                 $coursesview['future']['pages'][$futurepages]['page'] = $futurepages + 1;
110                 $coursesview['future']['haspages'] = true;
111                 $coursesbystatus['future']++;
112             } else {
113                 // Courses still in progress. Either their end date is not set, or the end date is not yet past the current date.
114                 $inprogresspages = floor($coursesbystatus['inprogress'] / $this::COURSES_PER_PAGE);
116                 $coursesview['inprogress']['pages'][$inprogresspages]['courses'][] = $exportedcourse;
117                 $coursesview['inprogress']['pages'][$inprogresspages]['active'] = ($inprogresspages == 0 ? true : false);
118                 $coursesview['inprogress']['pages'][$inprogresspages]['page'] = $inprogresspages + 1;
119                 $coursesview['inprogress']['haspages'] = true;
120                 $coursesbystatus['inprogress']++;
121             }
122         }
124         // Build courses view paging bar structure.
125         foreach ($coursesbystatus as $status => $total) {
126             $quantpages = ceil($total / $this::COURSES_PER_PAGE);
128             if ($quantpages) {
129                 $coursesview[$status]['pagingbar']['disabled'] = ($quantpages <= 1);
130                 $coursesview[$status]['pagingbar']['pagecount'] = $quantpages;
131                 $coursesview[$status]['pagingbar']['first'] = ['page' => '&laquo;', 'url' => '#'];
132                 $coursesview[$status]['pagingbar']['last'] = ['page' => '&raquo;', 'url' => '#'];
133                 for ($page = 0; $page < $quantpages; $page++) {
134                     $coursesview[$status]['pagingbar']['pages'][$page] = [
135                         'number' => $page + 1,
136                         'page' => $page + 1,
137                         'url' => '#',
138                         'active' => ($page == 0 ? true : false)
139                     ];
140                 }
141             }
142         }
144         return $coursesview;
145     }