Proyectos de Subversion Moodle

Rev

Autoría | Ultima modificación | Ver Log |

<?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 tool_courserating\external;

use core\external\exporter;
use renderer_base;
use tool_courserating\constants;
use tool_courserating\helper;
use tool_courserating\local\models\summary;
use tool_courserating\permission;

/**
 * Exporter for rating summary (how many people gave 5 stars, etc)
 *
 * @package     tool_courserating
 * @copyright   2022 Marina Glancy <marina.glancy@gmail.com>
 * @license     https://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
 */
class summary_exporter extends exporter {

    /** @var summary */
    protected $summary;

    /**
     * Constructor.
     *
     * @param int $courseid
     * @param summary|null $summary
     * @param bool $overridedisplayempty
     */
    public function __construct(int $courseid, ?summary $summary = null, bool $overridedisplayempty = false) {
        if (!$summary) {
            $records = summary::get_records(['courseid' => $courseid]);
            if (count($records)) {
                $summary = reset($records);
            } else {
                $summary = new summary(0, (object)['courseid' => $courseid]);
            }
        }
        $this->summary = $summary;
        parent::__construct([], ['overridedisplayempty' => $overridedisplayempty]);
    }

    /**
     * Return the list of properties.
     *
     * @return array
     */
    protected static function define_related() {
        return [
            'overridedisplayempty' => 'bool',
        ];
    }

    /**
     * Return the list of additional properties used only for display.
     *
     * @return array - Keys with their types.
     */
    protected static function define_other_properties() {
        return [
            'avgrating' => ['type' => PARAM_RAW],
            'stars' => ['type' => stars_exporter::read_properties_definition()],
            'lines' => [
                'type' => [
                    'rating' => ['type' => PARAM_INT],
                    'star' => ['type' => stars_exporter::read_properties_definition()],
                    'percent' => ['type' => PARAM_RAW],
                ],
                'multiple' => true,
            ],
            'courseid' => ['type' => PARAM_INT],
            'cntall' => ['type' => PARAM_INT],
            'displayempty' => ['type' => PARAM_INT],
        ];
    }

    /**
     * Get the additional values to inject while exporting.
     *
     * @param renderer_base $output The renderer.
     * @return array Keys are the property names, values are their values.
     */
    protected function get_other_values(renderer_base $output) {
        $summary = $this->summary;
        $courseid = $summary->get('courseid');
        $avgrating = $summary->get('cntall') ? $summary->get('avgrating') : 0;
        $data = [
            'avgrating' => $summary->get('cntall') ? sprintf("%.1f", $summary->get('avgrating')) : '-',
            'cntall' => $summary->get('cntall'),
            'stars' => (new stars_exporter($avgrating))->export($output),
            'lines' => [],
            'courseid' => $courseid,
            'displayempty' => !empty($this->related['overridedisplayempty'])
                || helper::get_setting(constants::SETTING_DISPLAYEMPTY),
        ];
        foreach ([5, 4, 3, 2, 1] as $line) {
            $percent = $summary->get('cntall') ? round(100 * $summary->get('cnt0' . $line) / $summary->get('cntall')) : 0;
            $data['lines'][] = [
                'rating' => $line,
                'star' => (new stars_exporter($line))->export($output),
                'percent' => $percent . '%',
            ];
        }

        return $data;
    }
}