MDL-72588 reportbuilder: fix dynamic loading of report parameters.

This fixes an issue for system reports that are initialised with
parameters (such as the access report). Previously these parameters
were not preserved, when sorting/paging them via AJAX requests.

We now defer the initialisation of the report until the table
filterset has been set, ensuring all parameters are available.
This commit is contained in:
Paul Holden 2021-09-30 23:43:49 +01:00 committed by David Matamoros
parent 8a1e7d913f
commit 42481d5c43
4 changed files with 36 additions and 43 deletions

View file

@ -19,12 +19,13 @@ declare(strict_types=1);
namespace core_reportbuilder\external; namespace core_reportbuilder\external;
use core\external\persistent_exporter; use core\external\persistent_exporter;
use core_table\local\filter\integer_filter;
use core_table\local\filter\string_filter;
use core_reportbuilder\form\filter; use core_reportbuilder\form\filter;
use core_reportbuilder\local\models\report; use core_reportbuilder\local\models\report;
use core_reportbuilder\local\report\base; use core_reportbuilder\local\report\base;
use core_reportbuilder\table\system_report_table; use core_reportbuilder\table\system_report_table;
use core_reportbuilder\table\system_report_table_filterset; use core_reportbuilder\table\system_report_table_filterset;
use core_reportbuilder\table\system_report_table_parameters_filter;
use renderer_base; use renderer_base;
/** /**
@ -87,20 +88,25 @@ class system_report_exporter extends persistent_exporter {
/** @var base $source */ /** @var base $source */
$source = $this->related['source']; $source = $this->related['source'];
/** @var array $parameters */ /** @var string $parameters */
$parameters = $this->related['parameters']; $parameters = $this->related['parameters'];
$filterset = new system_report_table_filterset(); /** @var int $reportid */
$filterset->add_filter(new system_report_table_parameters_filter('parameters', null, [$parameters])); $reportid = $this->persistent->get('id');
$table = system_report_table::create($this->persistent->get('id'), (array) json_decode($parameters, true)); // We store the report ID and parameters within the table filterset so that they are available between AJAX requests.
$filterset = new system_report_table_filterset();
$filterset->add_filter(new integer_filter('reportid', null, [$reportid]));
$filterset->add_filter(new string_filter('parameters', null, [$parameters]));
$table = system_report_table::create($reportid, (array) json_decode($parameters, true));
$table->set_filterset($filterset); $table->set_filterset($filterset);
// Generate filters form if report contains any filters. // Generate filters form if report contains any filters.
$filterspresent = !empty($source->get_filters()); $filterspresent = !empty($source->get_filters());
if ($filterspresent) { if ($filterspresent) {
$filtersform = new filter(null, null, 'post', '', [], true, [ $filtersform = new filter(null, null, 'post', '', [], true, [
'reportid' => $this->persistent->get('id'), 'reportid' => $reportid,
'parameters' => $parameters, 'parameters' => $parameters,
]); ]);
$filtersform->set_data_for_dynamic_submission(); $filtersform->set_data_for_dynamic_submission();
@ -108,7 +114,7 @@ class system_report_exporter extends persistent_exporter {
return [ return [
'table' => $output->render($table), 'table' => $output->render($table),
'parameters' => $this->related['parameters'], 'parameters' => $parameters,
'filterspresent' => $filterspresent, 'filterspresent' => $filterspresent,
'filtersapplied' => $source->get_applied_filter_count(), 'filtersapplied' => $source->get_applied_filter_count(),
'filtersform' => $filterspresent ? $filtersform->render() : '', 'filtersform' => $filterspresent ? $filtersform->render() : '',

View file

@ -56,8 +56,22 @@ class system_report_table extends base_report_table {
parent::__construct($uniqueid); parent::__construct($uniqueid);
// Load the report persistent, and accompanying system report instance. // If we are loading via a dynamic table AJAX request, defer the report loading until the filterset is added to
$this->persistent = new report($matches['id']); // the table, as it is used to populate the report $parameters during construction.
$serviceinfo = optional_param('info', null, PARAM_RAW);
if ($serviceinfo !== 'core_table_get_dynamic_table_content') {
$this->load_report_instance((int) $matches['id'], $parameters);
}
}
/**
* Load the report persistent, and accompanying system report instance.
*
* @param int $reportid
* @param array $parameters
*/
private function load_report_instance(int $reportid, array $parameters): void {
$this->persistent = new report($reportid);
$this->report = manager::get_report_from_persistent($this->persistent, $parameters); $this->report = manager::get_report_from_persistent($this->persistent, $parameters);
$fields = $this->report->get_base_fields(); $fields = $this->report->get_base_fields();
@ -148,8 +162,10 @@ class system_report_table extends base_report_table {
* @param filterset $filterset * @param filterset $filterset
*/ */
public function set_filterset(filterset $filterset): void { public function set_filterset(filterset $filterset): void {
$reportid = $filterset->get_filter('reportid')->current();
$parameters = $filterset->get_filter('parameters')->current(); $parameters = $filterset->get_filter('parameters')->current();
$this->report->set_parameters((array) json_decode($parameters, true));
$this->load_report_instance($reportid, json_decode($parameters, true));
parent::set_filterset($filterset); parent::set_filterset($filterset);
} }

View file

@ -19,6 +19,8 @@ declare(strict_types=1);
namespace core_reportbuilder\table; namespace core_reportbuilder\table;
use core_table\local\filter\filterset; use core_table\local\filter\filterset;
use core_table\local\filter\integer_filter;
use core_table\local\filter\string_filter;
/** /**
* System report dynamic table filterset class * System report dynamic table filterset class
@ -36,7 +38,8 @@ class system_report_table_filterset extends filterset {
*/ */
public function get_required_filters(): array { public function get_required_filters(): array {
return [ return [
'parameters' => system_report_table_parameters_filter::class, 'reportid' => integer_filter::class,
'parameters' => string_filter::class,
]; ];
} }
} }

View file

@ -1,32 +0,0 @@
<?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/>.
declare(strict_types=1);
namespace core_reportbuilder\table;
use core_table\local\filter\string_filter;
/**
* Class for storing given system report parameters
*
* @package core_reportbuilder
* @copyright 2021 Paul Holden <paulh@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class system_report_table_parameters_filter extends string_filter {
}