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/>.
/**
* Insights report renderable.
*
* @package tool_analytics
* @copyright 2019 David Monllao {@link http://www.davidmonllao.com}
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
namespace tool_analytics\output;
defined('MOODLE_INTERNAL') || die;
/**
* Insights report renderable.
*
* @package tool_analytics
* @copyright 2019 David Monllao {@link http://www.davidmonllao.com}
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class insights_report implements \renderable, \templatable {
/**
* @var \core_analytics\model
*/
private $model = null;
/**
* @var \context
*/
private $context = null;
/**
* Inits the insights report renderable.
*
* @param \core_analytics\model $model
* @param int|null $contextid
* @return null
*/
public function __construct(\core_analytics\model $model, ?int $contextid = null) {
$this->model = $model;
if ($contextid) {
$this->context = \context::instance_by_id($contextid);
}
}
/**
* Export the data.
*
* @param \renderer_base $output
* @return \stdClass
*/
public function export_for_template(\renderer_base $output): \stdClass {
// Prepare the context object.
$data = new \stdClass();
$data->modelname = $this->model->get_name();
$data->charts = [];
$predictionactionrecords = $this->model->get_prediction_actions($this->context);
// Context selector.
$predictioncontexts = $this->model->get_predictions_contexts(false);
if ($predictioncontexts && count($predictioncontexts) > 1) {
$url = new \moodle_url('/admin/tool/analytics/model.php', ['id' => $this->model->get_id(),
'action' => 'insightsreport']);
if ($this->context) {
$selected = $this->context->id;
} else {
// This is the 'all' option.
$selected = 0;
}
$data->contextselect = \tool_analytics\output\helper::prediction_context_selector($predictioncontexts,
$url, $output, $selected, true, false);
}
if ($predictionactionrecords->valid()) {
foreach ($predictionactionrecords as $record) {
// Using this unusual execution flow to init the chart data because $predictionactionrecords
// is a \moodle_recordset.
if (empty($actionlabels)) {
list($actionlabels, $actionvalues, $actiontypes) = $this->init_action_labels($record);
}
// One value for each action.
$actionvalues['separated'][$record->actionname]++;
// Grouped value.
$actiontype = $actiontypes[$record->actionname];
$actionvalues['grouped'][$actiontype]++;
}
$predictionactionrecords->close();
// Actions doughtnut.
$chart = new \core\chart_pie();
$chart->set_doughnut(true);
$chart->set_title(get_string('actionsexecutedbyusers', 'tool_analytics'));
$series = new \core\chart_series(get_string('actions', 'tool_analytics'),
array_values($actionvalues['separated']));
$chart->add_series($series);
$chart->set_labels(array_values($actionlabels['separated']));
$data->separatedchart = $output->render($chart);
// Positive/negative/neutral bar chart.
$chart = new \core\chart_bar();
$chart->set_title(get_string('actionexecutedgroupedusefulness', 'tool_analytics'));
$series = new \core\chart_series(get_string('actions', 'tool_analytics'),
array_values($actionvalues['grouped']));
$chart->add_series($series);
$chart->set_labels(array_values($actionlabels['grouped']));
$data->groupedchart = $output->render($chart);
} else {
$predictionactionrecords->close();
$data->noactions = [
'message' => get_string('noactionsfound', 'tool_analytics'),
'announce' => true,
];
}
return $data;
}
/**
* Initialises the action labels and values in this model.
*
* @param \stdClass $predictionactionrecord
* @return array Two-dimensional array with the labels and values initialised to zero.
*/
private function init_action_labels(\stdClass $predictionactionrecord): array {
$predictioncontext = \context::instance_by_id($predictionactionrecord->contextid);
// Just 1 result, we just want to retrieve the prediction action names.
list ($unused, $predictions) = $this->model->get_predictions($predictioncontext, false, 0, 1);
// We pass 'true' for $isinsightuser so all the prediction actions available for this target are returning.
$predictionactions = $this->model->get_target()->prediction_actions(reset($predictions), true, true);
$actionlabels = [];
$actionvalues = ['separated' => [], 'grouped' => []];
$actiontypes = [];
foreach ($predictionactions as $action) {
$actionlabels['separated'][$action->get_action_name()] = $action->get_text();
$actionvalues['separated'][$action->get_action_name()] = 0;
$actiontypes[$action->get_action_name()] = $action->get_type();
}
$bulkactions = $this->model->get_target()->bulk_actions($predictions);
foreach ($bulkactions as $action) {
$actionlabels['separated'][$action->get_action_name()] = $action->get_text();
$actionvalues['separated'][$action->get_action_name()] = 0;
$actiontypes[$action->get_action_name()] = $action->get_type();
}
$actionlabels['grouped'][\core_analytics\action::TYPE_POSITIVE] = get_string('useful', 'analytics');
$actionlabels['grouped'][\core_analytics\action::TYPE_NEUTRAL] = get_string('neutral', 'analytics');
$actionlabels['grouped'][\core_analytics\action::TYPE_NEGATIVE] = get_string('notuseful', 'analytics');
$actionvalues['grouped'][\core_analytics\action::TYPE_POSITIVE] = 0;
$actionvalues['grouped'][\core_analytics\action::TYPE_NEUTRAL] = 0;
$actionvalues['grouped'][\core_analytics\action::TYPE_NEGATIVE] = 0;
return [$actionlabels, $actionvalues, $actiontypes];
}
}