Search moodle.org's
Developer Documentation

See Release Notes
Long Term Support Release

  • Bug fixes for general core bugs in 4.1.x will end 13 November 2023 (12 months).
  • Bug fixes for security issues in 4.1.x will end 10 November 2025 (36 months).
  • PHP version: minimum PHP 7.4.0 Note: minimum PHP version has increased since Moodle 4.0. PHP 8.0.x is supported too.
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
namespace mod_bigbluebuttonbn\output;

use html_table;
use html_writer;
use mod_bigbluebuttonbn\instance;
use mod_bigbluebuttonbn\meeting;
use mod_bigbluebuttonbn\plugin;
use renderable;
use renderer_base;
use stdClass;

/**
 * Renderer for the Index page.
 *
 * @package   mod_bigbluebuttonbn
 * @copyright 2010 onwards, Blindside Networks Inc
 * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */
class index implements renderable {

    /** @var stdClass */
    protected $course;

    /** @var stdClass[] */
    protected $instances;

    /**
     * Constructor for the index renderable.
     *
     * @param stdClass $course
     * @param instance[] List of bbbbn instances
     */
    public function __construct(stdClass $course, array $instances) {
        $this->course = $course;
        $this->instances = $instances;
    }

    /**
     * Get the table for the index page.
     *
     * @param renderer_base $output
     * @return html_table
     */
    public function get_table(renderer_base $output): html_table {
        // Print the list of instances.
        $table = new html_table();

        if (course_format_uses_sections($this->course->format)) {
            $sectionheading = get_string('sectionname', "format_{$this->course->format}");
        } else {
            $sectionheading = '';
        }

        $table->head = [
            $sectionheading,
            get_string('index_heading_name', plugin::COMPONENT),
            get_string('index_heading_group', plugin::COMPONENT),
            get_string('index_heading_users', plugin::COMPONENT),
            get_string('index_heading_viewer', plugin::COMPONENT),
            get_string('index_heading_moderator', plugin::COMPONENT),
            get_string('index_heading_recording', plugin::COMPONENT),
            get_string('index_heading_actions', plugin::COMPONENT),
        ];
        $table->align = ['center', 'left', 'center', 'center', 'center', 'center', 'center'];

        foreach ($this->instances as $instance) {
            $this->add_instance_to_table($output, $table, $instance);
        }

        return $table;
    }

    /**
     * Add details of the bigbluebuttonbn instance to the table.
     *
     * @param renderer_base $output
     * @param html_table $table
     * @param instance $instance
     */
    protected function add_instance_to_table(renderer_base $output, html_table $table, instance $instance): void {
        $cm = $instance->get_cm();
        if (!$cm->uservisible) {
            return;
        }
        if (groups_get_activity_groupmode($cm) == 0) {
            $table->data[] = $this->add_room_row_to_table($output, $instance);
        } else {
            // Add 'All participants' room information.
            $table->data[] = $this->add_room_row_to_table($output, $instance, 0);

            // Add data for the groups belonging to the bbb instance, if any.
            $groups = groups_get_activity_allowed_groups($cm);
            foreach ($groups as $group) {
                $table->data[] = $this->add_room_row_to_table($output, $instance, $group->id);
            }
        }
    }

    /**
     * Displays the general view.
     *
     * @param renderer_base $output
     * @param instance $instance
     * @param int|null $group
     * @return array
     */
    protected function add_room_row_to_table(renderer_base $output, instance $instance, ?int $group = null): array {
        if ($group) {
            $instance = instance::get_group_instance_from_instance($instance, $group);
        }
        $meeting = new meeting($instance);

        if (course_format_uses_sections($this->course->format)) {
            $sectionname = get_section_name($this->course, $instance->get_cm()->sectionnum);
        } else {
            $sectionname = '';
        }

        $viewurl = $instance->get_view_url();
        if ($groupid = $instance->get_group_id()) {
            $viewurl->param('group', $groupid);
        }

        $joinurl = html_writer::link($viewurl, format_string($instance->get_meeting_name()));

        // The meeting info was returned.
        if ($meeting->is_running()) {
            return [
                $sectionname,
                $joinurl,
                $instance->get_group_name(),
                $this->get_room_usercount($meeting),
                $this->get_room_attendee_list($meeting, 'VIEWER'),
                $this->get_room_attendee_list($meeting, 'MODERATOR'),
                $this->get_room_record_info($output, $instance),
                $this->get_room_actions($output, $instance, $meeting),
            ];
        }

        return [$sectionname, $joinurl, $instance->get_group_name(), '', '', '', '', ''];
    }

    /**
     * Count the number of users in the meeting.
     *
     * @param meeting $meeting
     * @return int
     */
    protected function get_room_usercount(meeting $meeting): int {
        return count($meeting->get_attendees());
    }

    /**
     * Returns attendee list.
     *
     * @param meeting $meeting
     * @param string $role
     * @return string
     */
    protected function get_room_attendee_list(meeting $meeting, string $role): string {
        $attendees = [];

> // Iterate attendees, matching by their "role" property.
foreach ($meeting->get_attendees() as $attendee) {
< if ((string) $attendee->role == $role) { < $attendees[] = $attendee->fullName;
> if (strcmp((string) $attendee['role'], $role) === 0) { > $attendees[] = $attendee['fullName'];
} } return implode(', ', $attendees); } /** * Returns indication of recording enabled. * * @param renderer_base $output * @param instance $instance * @return string */ protected function get_room_record_info(renderer_base $output, instance $instance): string { if ($instance->is_recorded()) { // If it has been set when meeting created, set the variable on/off. return get_string('index_enabled', 'bigbluebuttonbn'); } return ''; } /** * Returns room actions. * * @param renderer_base $output * @param instance $instance * @param meeting $meeting * @return string */ protected function get_room_actions(renderer_base $output, instance $instance, meeting $meeting): string { if ($instance->is_moderator()) { return $output->render_from_template('mod_bigbluebuttonbn/end_session_button', (object) [ 'bigbluebuttonbnid' => $instance->get_instance_id(), 'groupid' => $instance->get_group_id(), 'statusrunning' => $meeting->is_running(), ]); } return ''; } }