Proyectos de Subversion Moodle

Rev

| Ultima modificación | Ver Log |

Rev Autor Línea Nro. Línea
1 efrain 1
<?php
2
// This file is part of Moodle - http://moodle.org/
3
//
4
// Moodle is free software: you can redistribute it and/or modify
5
// it under the terms of the GNU General Public License as published by
6
// the Free Software Foundation, either version 3 of the License, or
7
// (at your option) any later version.
8
//
9
// Moodle is distributed in the hope that it will be useful,
10
// but WITHOUT ANY WARRANTY; without even the implied warranty of
11
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
// GNU General Public License for more details.
13
//
14
// You should have received a copy of the GNU General Public License
15
// along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
16
 
17
declare(strict_types=1);
18
 
19
namespace core_reportbuilder\external;
20
 
21
use renderer_base;
22
use core\persistent;
23
use core\external\persistent_exporter;
24
use core_reportbuilder\manager;
25
use core_reportbuilder\datasource;
26
use core_reportbuilder\form\filter as form_filter;
27
use core_reportbuilder\local\models\report;
28
use core_reportbuilder\table\custom_report_table;
29
use core_reportbuilder\table\custom_report_table_filterset;
30
use core_reportbuilder\table\custom_report_table_view;
31
use core_reportbuilder\table\custom_report_table_view_filterset;
32
use core_table\local\filter\integer_filter;
33
 
34
/**
35
 * Custom report exporter class
36
 *
37
 * @package     core_reportbuilder
38
 * @copyright   2021 David Matamoros <davidmc@moodle.com>
39
 * @license     http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
40
 */
41
class custom_report_exporter extends persistent_exporter {
42
 
43
    /** @var report The persistent object we will export. */
44
    protected $persistent = null;
45
 
46
    /** @var bool */
47
    protected $editmode;
48
 
49
    /** @var string */
50
    protected $download;
51
 
52
    /**
53
     * report_exporter constructor.
54
     *
55
     * @param persistent $persistent
56
     * @param array $related
57
     * @param bool $editmode
58
     * @param string $download
59
     */
60
    public function __construct(persistent $persistent, array $related = [], bool $editmode = true, string $download = '') {
61
        parent::__construct($persistent, $related);
62
        $this->editmode = $editmode;
63
        $this->download = $download;
64
    }
65
    /**
66
     * Return the name of the class we are exporting
67
     *
68
     * @return string
69
     */
70
    protected static function define_class(): string {
71
        return report::class;
72
    }
73
 
74
    /**
75
     * Return a list of objects that are related to the persistent
76
     *
77
     * @return array
78
     */
79
    protected static function define_related(): array {
80
        return [
81
            'pagesize' => 'int?',
82
        ];
83
    }
84
 
85
    /**
86
     * Return a list of additional properties used only for display
87
     *
88
     * @return array
89
     */
90
    protected static function define_other_properties(): array {
91
        return [
92
            'table' => ['type' => PARAM_RAW],
93
            'filtersapplied' => ['type' => PARAM_INT],
94
            'filterspresent' => ['type' => PARAM_BOOL],
95
            'filtersform' => ['type' => PARAM_RAW],
96
            'attributes' => [
97
                'type' => [
98
                    'name' => ['type' => PARAM_TEXT],
99
                    'value' => ['type' => PARAM_TEXT]
100
                ],
101
                'multiple' => true,
102
            ],
103
            'classes' => ['type' => PARAM_TEXT],
104
            'editmode' => ['type' => PARAM_BOOL],
105
            'sidebarmenucards' => [
106
                'type' => custom_report_column_cards_exporter::read_properties_definition(),
107
                'optional' => true,
108
            ],
109
            'conditions' => [
110
                'type' => custom_report_conditions_exporter::read_properties_definition(),
111
                'optional' => true,
112
            ],
113
            'filters' => [
114
                'type' => custom_report_filters_exporter::read_properties_definition(),
115
                'optional' => true,
116
            ],
117
            'sorting' => [
118
                'type' => custom_report_columns_sorting_exporter::read_properties_definition(),
119
                'optional' => true,
120
            ],
121
            'cardview' => [
122
                'type' => custom_report_card_view_exporter::read_properties_definition(),
123
                'optional' => true,
124
            ],
125
            'javascript' => ['type' => PARAM_RAW],
126
        ];
127
    }
128
 
129
    /**
130
     * Get additional values to inject while exporting
131
     *
132
     * @param renderer_base $output
133
     * @return array
134
     */
135
    protected function get_other_values(renderer_base $output): array {
136
        /** @var datasource $report */
137
        $report = manager::get_report_from_persistent($this->persistent);
138
 
139
        $filterspresent = false;
140
        $filtersform = '';
141
        $attributes = [];
142
 
143
        if ($this->editmode) {
144
            $table = custom_report_table::create($this->persistent->get('id'));
145
            $table->set_filterset(new custom_report_table_filterset());
146
        } else {
147
            // We store the pagesize within the table filterset so that it's available between AJAX requests.
148
            $filterset = new custom_report_table_view_filterset();
149
            $filterset->add_filter(new integer_filter('pagesize', null, [$this->related['pagesize']]));
150
 
151
            $table = custom_report_table_view::create($this->persistent->get('id'), $this->download);
152
            $table->set_filterset($filterset);
153
 
154
            // Generate filters form if report contains any filters.
155
            $filterspresent = !empty($report->get_active_filters());
156
            if ($filterspresent && empty($this->download)) {
157
                $filtersform = $this->generate_filters_form()->render();
158
            }
159
 
160
            // Get the report classes and attributes.
161
            $reportattributes = $report->get_attributes();
162
            if (isset($reportattributes['class'])) {
163
                $classes = $reportattributes['class'];
164
                unset($reportattributes['class']);
165
            }
166
            $attributes = array_map(static function($key, $value): array {
167
                return ['name' => $key, 'value' => $value];
168
            }, array_keys($reportattributes), $reportattributes);
169
        }
170
 
171
        // If we are editing we need all this information for the template.
172
        $editordata = [];
173
        if ($this->editmode) {
174
            $menucardsexporter = new custom_report_column_cards_exporter(null, ['report' => $report]);
175
            $editordata['sidebarmenucards'] = (array) $menucardsexporter->export($output);
176
 
177
            $conditionsexporter = new custom_report_conditions_exporter(null, ['report' => $report]);
178
            $editordata['conditions'] = (array) $conditionsexporter->export($output);
179
 
180
            $filtersexporter = new custom_report_filters_exporter(null, ['report' => $report]);
181
            $editordata['filters'] = (array) $filtersexporter->export($output);
182
 
183
            $sortingexporter = new custom_report_columns_sorting_exporter(null, ['report' => $report]);
184
            $editordata['sorting'] = (array) $sortingexporter->export($output);
185
 
186
            $cardviewexporter = new custom_report_card_view_exporter(null, ['report' => $report]);
187
            $editordata['cardview'] = (array) $cardviewexporter->export($output);
188
        }
189
 
190
        return [
191
            'table' => $output->render($table),
192
            'filtersapplied' => $report->get_applied_filter_count(),
193
            'filterspresent' => $filterspresent,
194
            'filtersform' => $filtersform,
195
            'attributes' => $attributes,
196
            'classes' => $classes ?? '',
197
            'editmode' => $this->editmode,
198
            'javascript' => '',
199
        ] + $editordata;
200
    }
201
 
202
    /**
203
     * Generate filters form for the report
204
     *
205
     * @return form_filter
206
     */
207
    private function generate_filters_form(): form_filter {
208
        $filtersform = new form_filter(null, null, 'post', '', [], true, [
209
            'reportid' => $this->persistent->get('id'),
210
            'parameters' => json_encode([]),
211
        ]);
212
        $filtersform->set_data_for_dynamic_submission();
213
 
214
        return $filtersform;
215
    }
216
}