Merge branch 'MDL-67786-master' of git://github.com/aanabit/moodle
[moodle.git] / lib / table / classes / external / dynamic / fetch.php
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/>.
17 /**
18  * Table external API.
19  *
20  * @package    core_table
21  * @category   external
22  * @copyright  2020 Simey Lameze <simey@moodle.com>
23  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
24  */
26 namespace core_table\external\dynamic;
28 use external_api;
29 use external_function_parameters;
30 use external_multiple_structure;
31 use external_single_structure;
32 use external_value;
33 use external_warnings;
34 use moodle_url;
36 /**
37  * Core table external functions.
38  *
39  * @package    core_table
40  * @category   external
41  * @copyright  2020 Simey Lameze <simey@moodle.com>
42  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
43  */
44 class fetch extends external_api {
46     /**
47      * Describes the parameters for fetching the table html.
48      *
49      * @return external_function_parameters
50      * @since Moodle 3.9
51      */
52     public static function execute_parameters(): external_function_parameters {
53         return new external_function_parameters ([
54             'handler' => new external_value(
55                 // Note: We do not have a PARAM_CLASSNAME which would have been ideal.
56                 PARAM_RAW,
57                 'Handler',
58                 VALUE_REQUIRED
59             ),
60             'uniqueid' => new external_value(
61                 PARAM_ALPHANUMEXT,
62                 'Unique ID for the container',
63                 VALUE_REQUIRED
64             ),
65             'sortby' => new external_value(
66                 PARAM_ALPHANUMEXT,
67                 'The name of a sortable column',
68                 VALUE_REQUIRED
69             ),
70             'sortorder' => new external_value(
71                 PARAM_ALPHANUMEXT,
72                 'The sort order',
73                 VALUE_REQUIRED
74             ),
75             'filters' => new external_multiple_structure(
76                 new external_single_structure([
77                     'name' => new external_value(PARAM_ALPHANUM, 'Name of the filter', VALUE_REQUIRED),
78                     'jointype' => new external_value(PARAM_INT, 'Type of join for filter values', VALUE_REQUIRED),
79                     'values' => new external_multiple_structure(
80                         new external_value(PARAM_RAW, 'Filter value'),
81                         'The value to filter on',
82                         VALUE_REQUIRED
83                     )
84                 ]),
85                 'The filters that will be applied in the request',
86                 VALUE_OPTIONAL
87             ),
88             'jointype' => new external_value(PARAM_INT, 'Type of join to join all filters together', VALUE_REQUIRED),
89             'firstinitial' => new external_value(
90                 PARAM_ALPHANUMEXT,
91                 'The first initial to sort filter on',
92                 VALUE_REQUIRED,
93                 null
94             ),
95             'lastinitial' => new external_value(
96                 PARAM_ALPHANUMEXT,
97                 'The last initial to sort filter on',
98                 VALUE_REQUIRED,
99                 null
100             ),
101             'pagenumber' => new external_value(
102                 PARAM_INT,
103                 'The page number',
104                 VALUE_REQUIRED,
105                 null
106             ),
107             'pagesize' => new external_value(
108                 PARAM_INT,
109                 'The number of records per page',
110                 VALUE_REQUIRED,
111                 null
112             ),
113         ]);
114     }
116     /**
117      * External function to fetch a table view.
118      *
119      * @param string $handler Dynamic table class name.
120      * @param string $uniqueid Unique ID for the container.
121      * @param string $sortby The name of a sortable column.
122      * @param string $sortorder The sort order.
123      * @param array $filters The filters that will be applied in the request.
124      * @param string $jointype The join type.
125      * @param string $firstinitial The first name initial to filter on
126      * @param string $lastinitial The last name initial to filter on
127      * @param int $pagenumber The page number.
128      * @param int $pagesize The number of records.
129      * @param string $jointype The join type.
130      *
131      * @return array
132      */
133     public static function execute(
134         string $handler,
135         string $uniqueid,
136         string $sortby,
137         string $sortorder,
138         ?array $filters = null,
139         ?string $jointype = null,
140         ?string $firstinitial = null,
141         ?string $lastinitial = null,
142         ?int $pagenumber = null,
143         ?int $pagesize = null
144     ) {
146         global $PAGE;
148         if (!class_exists($handler) || !is_subclass_of($handler, \core_table\dynamic::class)) {
149             throw new \UnexpectedValueException('Unknown table handler, or table handler does not support dynamic updating.');
150         }
152         [
153             'handler' => $handler,
154             'uniqueid' => $uniqueid,
155             'sortby' => $sortby,
156             'sortorder' => $sortorder,
157             'filters' => $filters,
158             'jointype' => $jointype,
159             'firstinitial' => $firstinitial,
160             'lastinitial' => $lastinitial,
161             'pagenumber' => $pagenumber,
162             'pagesize' => $pagesize,
163         ] = self::validate_parameters(self::execute_parameters(), [
164             'handler' => $handler,
165             'uniqueid' => $uniqueid,
166             'sortby' => $sortby,
167             'sortorder' => $sortorder,
168             'filters' => $filters,
169             'jointype' => $jointype,
170             'firstinitial' => $firstinitial,
171             'lastinitial' => $lastinitial,
172             'pagenumber' => $pagenumber,
173             'pagesize' => $pagesize,
174         ]);
176         $filterset = new \core_user\table\participants_filterset();
177         foreach ($filters as $rawfilter) {
178             $filterset->add_filter_from_params(
179                 $rawfilter['name'],
180                 $rawfilter['jointype'],
181                 $rawfilter['values']
182             );
183         }
185         $instance = new $handler($uniqueid);
186         $instance->set_filterset($filterset);
187         $instance->set_sorting($sortby, $sortorder);
189         if ($firstinitial !== null) {
190             $instance->set_first_initial($firstinitial);
191         }
193         if ($lastinitial !== null) {
194             $instance->set_last_initial($lastinitial);
195         }
197         if ($pagenumber !== null) {
198             $instance->set_page_number($pagenumber);
199         }
201         if ($pagesize === null) {
202             $pagesize = 20;
203         }
205         $context = $instance->get_context();
206         self::validate_context($context);
207         $PAGE->set_url($instance->get_base_url());
209         ob_start();
210         $instance->out($pagesize, true);
211         $participanttablehtml = ob_get_contents();
212         ob_end_clean();
214         return [
215             'html' => $participanttablehtml,
216             'warnings' => []
217         ];
218     }
220     /**
221      * Describes the data returned from the external function.
222      *
223      * @return external_single_structure
224      * @since Moodle 3.9
225      */
226     public static function execute_returns(): external_single_structure {
227         return new external_single_structure([
228             'html' => new external_value(PARAM_RAW, 'The raw html of the requested table.'),
229             'warnings' => new external_warnings()
230         ]);
231     }