Moodle – how get total course completed and login chart in current year into dashboard page

Moodle – how get total course completed and login chart in current year into dashboard page

To add the total course completed and login chart in the current year to the dashboard, you need to get a query from course complete and login from the database.

We created 2 series in the same chart, one is a bar chart (stand by total login) and another is a series type line (stand by total course completed), and both data are displayed by month.

$cyear = date(“Y”); is getting current year.

$userId = $USER->id; is getting user ID or student ID.

 // Set labels for months
          $chart->set_labels([
                        'Jan',
                        'Feb',
                        'Mar',
                        'Apr',
                        'May',
                        'Jun',
                        'Jul',
                        'Aug',
                        'Sep',
                        'Oct',
                        'Nov',
                        'Dec'
                    ]);

open your code and go to Moodle->My-> index.php

Follow and add code as below:

<?php

global $PAGE, $USER, $DB, $cyear;
$cyear = date("Y");
$userId = $USER->id;
<h4 class="card-title">Own Summary course completed and login in <?php echo $cyear ?></h4>
                <div style="overflow-x:auto;">
                    <?php
                    global $DB;
                    // Query for course completions
                    $completions_sql = "SELECT
                    MONTH(FROM_UNIXTIME(cp.timecompleted)) AS month,
                    COUNT(c.id) AS total_completions
                FROM
                    {course_completions} cp
                    JOIN {course} c ON
                     cp.course = c.id
                    JOIN {user} u ON
                     cp.userid = u.id
                WHERE
                    u.id = $userId and
                    YEAR(FROM_UNIXTIME(cp.timecompleted)) = $cyear
                GROUP BY
                    month";
                    $completions_data = $DB->get_records_sql($completions_sql);
                    // Query for logins
                    $logins_sql = "SELECT
                    MONTH(FROM_UNIXTIME(l.timecreated)) AS month,
                    COUNT(l.userid) AS total_logins
                FROM
                    {logstore_standard_log} l
                WHERE
                    l.action = 'loggedin' AND l.userid = $userId AND YEAR(FROM_UNIXTIME(l.timecreated)) = $cyear
                GROUP BY month";
                    $logins_data = $DB->get_records_sql($logins_sql);
                    // Prepare months and series data for the chart
                    $months = range(1, 12); // 12 months
                    $completions_series = [];
                    $logins_series = [];


                    // Loop through months to populate data
                    foreach ($months as $month) {
                        $completions_series[] = isset($completions_data[$month]) ? $completions_data[$month]->total_completions : 0;
                        $logins_series[] = isset($logins_data[$month]) ? $logins_data[$month]->total_logins : 0;
                    }


                    // Add series to the chart
                    $chart = new \core\chart_bar();
                    $s1 = new \core\chart_series('Total Completions', $completions_series);
                    $s1->set_type(\core\chart_series::TYPE_LINE);
                    $chart->add_series($s1);
                    $s2 = new \core\chart_series('Total Logins', $logins_series);
                    $chart->add_series($s2);


                    // Set labels for months
                    $chart->set_labels([
                        'Jan',
                        'Feb',
                        'Mar',
                        'Apr',
                        'May',
                        'Jun',
                        'Jul',
                        'Aug',
                        'Sep',
                        'Oct',
                        'Nov',
                        'Dec'
                    ]);


                    // Render the chart
                    echo $OUTPUT->render($chart);
                    ?>
                </div>

Check the result with the chart below:

Share this Article !

You may like this