MDL-67786 core_contentbank: Unit and behat tests
[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         ]);
102     }
104     /**
105      * External function to fetch a table view.
106      *
107      * @param string $handler Dynamic table class name.
108      * @param string $uniqueid Unique ID for the container.
109      * @param string $sortby The name of a sortable column.
110      * @param string $sortorder The sort order.
111      * @param array $filters The filters that will be applied in the request.
112      * @param string $jointype The join type.
113      * @param string $firstinitial The first name initial to filter on
114      * @param string $lastinitial The last name initial to filter on
115      *
116      * @return array
117      */
118     public static function execute(
119         string $handler,
120         string $uniqueid,
121         string $sortby,
122         string $sortorder,
123         ?array $filters = null,
124         ?string $jointype = null,
125         ?string $firstinitial = null,
126         ?string $lastinitial = null
127     ) {
129         global $PAGE;
131         if (!class_exists($handler) || !is_subclass_of($handler, \core_table\dynamic::class)) {
132             throw new \UnexpectedValueException('Unknown table handler, or table handler does not support dynamic updating.');
133         }
135         [
136             'handler' => $handler,
137             'uniqueid' => $uniqueid,
138             'sortby' => $sortby,
139             'sortorder' => $sortorder,
140             'filters' => $filters,
141             'jointype' => $jointype,
142             'firstinitial' => $firstinitial,
143             'lastinitial' => $lastinitial,
144         ] = self::validate_parameters(self::execute_parameters(), [
145             'handler' => $handler,
146             'uniqueid' => $uniqueid,
147             'sortby' => $sortby,
148             'sortorder' => $sortorder,
149             'filters' => $filters,
150             'jointype' => $jointype,
151             'firstinitial' => $firstinitial,
152             'lastinitial' => $lastinitial,
153         ]);
155         $filterset = new \core_user\table\participants_filterset();
156         foreach ($filters as $rawfilter) {
157             $filterset->add_filter_from_params(
158                 $rawfilter['name'],
159                 $rawfilter['jointype'],
160                 $rawfilter['values']
161             );
162         }
164         $instance = new $handler($uniqueid);
165         $instance->set_filterset($filterset);
166         $instance->set_sorting($sortby, $sortorder);
168         if ($firstinitial !== null) {
169             $instance->set_first_initial($firstinitial);
170         }
172         if ($lastinitial !== null) {
173             $instance->set_last_initial($lastinitial);
174         }
176         $context = $instance->get_context();
178         self::validate_context($context);
179         $PAGE->set_url($instance->get_base_url());
181         ob_start();
182         $instance->out(20, true);
183         $participanttablehtml = ob_get_contents();
184         ob_end_clean();
186         return [
187             'html' => $participanttablehtml,
188             'warnings' => []
189         ];
190     }
192     /**
193      * Describes the data returned from the external function.
194      *
195      * @return external_single_structure
196      * @since Moodle 3.9
197      */
198     public static function execute_returns(): external_single_structure {
199         return new external_single_structure([
200             'html' => new external_value(PARAM_RAW, 'The raw html of the requested table.'),
201             'warnings' => new external_warnings()
202         ]);
203     }