Proyectos de Subversion Moodle

Rev

Rev 1 | | Comparar con el anterior | 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
 
1441 ariadna 17
namespace core_badges\form;
1 efrain 18
 
1441 ariadna 19
use core_badges\backpack_api;
20
 
1 efrain 21
defined('MOODLE_INTERNAL') || die();
22
 
23
require_once($CFG->libdir.'/formslib.php');
24
 
25
/**
26
 * Backpack form class.
27
 *
28
 * @package    core_badges
29
 * @copyright  2019 Damyon Wiese
30
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
31
 */
32
class external_backpack extends \moodleform {
33
 
34
    /**
35
     * Create the form.
36
     *
37
     */
38
    public function definition() {
39
        global $CFG;
40
 
41
        $mform = $this->_form;
1441 ariadna 42
        $backpack = $this->_customdata['externalbackpack'] ?? null;
1 efrain 43
 
44
        $mform->addElement('hidden', 'action', 'edit');
45
        $mform->setType('action', PARAM_ALPHA);
46
 
47
        $apiversions = badges_get_badge_api_versions();
48
        $mform->addElement('select', 'apiversion', get_string('apiversion', 'core_badges'), $apiversions);
49
        $mform->setType('apiversion', PARAM_RAW);
50
        $mform->setDefault('apiversion', OPEN_BADGES_V2P1);
51
        $mform->addRule('apiversion', null, 'required', null, 'client');
52
 
1441 ariadna 53
        $this->add_provider_fields();
54
 
1 efrain 55
        $mform->addElement('text', 'backpackweburl', get_string('backpackweburl', 'core_badges'));
56
        $mform->setType('backpackweburl', PARAM_URL);
57
        $mform->addRule('backpackweburl', get_string('maximumchars', '', 255), 'maxlength', 255, 'client');
1441 ariadna 58
        $mform->hideIf('backpackweburl', 'apiversion', 'ne', OPEN_BADGES_V2);
1 efrain 59
 
60
        $mform->addElement('text', 'backpackapiurl',  get_string('backpackapiurl', 'core_badges'));
61
        $mform->setType('backpackapiurl', PARAM_URL);
62
        $mform->addRule('backpackapiurl', get_string('maximumchars', '', 255), 'maxlength', 255, 'client');
1441 ariadna 63
        $mform->hideIf('backpackapiurl', 'apiversion', 'ne', OPEN_BADGES_V2);
1 efrain 64
 
1441 ariadna 65
        $mform->addElement('text', 'backpackweburlv2p1', get_string('backpackweburl', 'core_badges'));
66
        $mform->setType('backpackweburlv2p1', PARAM_URL);
67
        $mform->addRule('backpackweburlv2p1', get_string('maximumchars', '', 255), 'maxlength', 255, 'client');
68
        $mform->hideIf('backpackweburlv2p1', 'apiversion', 'ne', (string) OPEN_BADGES_V2P1);
69
 
1 efrain 70
        $mform->addElement('hidden', 'id', ($backpack->id ?? null));
71
        $mform->setType('id', PARAM_INT);
72
        $mform->addElement('hidden', 'badgebackpack', 0);
73
        $mform->setType('badgebackpack', PARAM_INT);
74
        $mform->addElement('hidden', 'userid', 0);
75
        $mform->setType('userid', PARAM_INT);
76
        $mform->addElement('hidden', 'backpackuid', 0);
77
        $mform->setType('backpackuid', PARAM_INT);
78
 
1441 ariadna 79
        // Add rules for backpack URL fields.
80
        if (backpack_api::display_canvas_credentials_fields()) {
81
            $mform->hideIf('backpackweburl', 'provider', 'ne', backpack_api::PROVIDER_OTHER);
82
            $mform->hideIf('backpackapiurl', 'provider', 'ne', backpack_api::PROVIDER_OTHER);
1 efrain 83
        }
84
 
1441 ariadna 85
        $issueremail = $CFG->badges_defaultissuercontact;
86
        // Connect to a Canvas Credentials provider.
87
        $this->add_connect_issuer_canvas_fields($issueremail);
1 efrain 88
 
1441 ariadna 89
        // Connect to another provider.
90
        $this->add_connect_issuer_fields($backpack, $issueremail);
91
 
1 efrain 92
        if ($backpack) {
93
            $this->set_data($backpack);
94
        }
95
 
96
        // Disable short forms.
97
        $mform->setDisableShortforms();
98
 
99
        $this->add_action_buttons();
100
    }
101
 
1441 ariadna 102
    #[\Override]
103
    public function definition_after_data(): void {
104
        parent::definition_after_data();
105
        $mform = $this->_form;
106
 
107
        if ($this->is_submitted()) {
108
            if (!$mform->elementExists('apiversion')) {
109
                return;
110
            }
111
            $apiversion = $mform->getElement('apiversion')->getValue();
112
            $apiversion = $apiversion ? array_pop($apiversion) : null;
113
            $provider = $mform->elementExists('provider') ? $mform->getElement('provider')->getValue() : null;
114
            $provider = $provider ? array_pop($provider) : null;
115
            $region = $mform->elementExists('region') ? $mform->getElement('region')->getValue() : null;
116
            $region = $region ? array_pop($region) : null;
117
            if ($apiversion == OPEN_BADGES_V2) {
118
                if (
119
                    $provider == backpack_api::PROVIDER_CANVAS_CREDENTIALS
120
                    && isset($region) && $region != backpack_api::REGION_EMPTY
121
                ) {
122
                    $mform->getElement('backpackweburl')->setValue(
123
                        backpack_api::get_region_url($region),
124
                    );
125
                    $mform->getElement('backpackapiurl')->setValue(
126
                        backpack_api::get_region_api_url($region),
127
                    );
128
 
129
                    if ($mform->getElement('includeauthdetailscanvas')->getValue()) {
130
                        $mform->getElement('backpackemail')->setValue(
131
                            $mform->getElement('backpackemailcanvas')->getValue(),
132
                        );
133
                        $mform->getElement('password')->setValue(
134
                            $mform->getElement('backpackpasswordcanvas')->getValue(),
135
                        );
136
                    }
137
                } else if (is_null($provider) || $provider == backpack_api::PROVIDER_OTHER) {
138
                    if ($mform->getElement('includeauthdetails')->getValue() == 0) {
139
                        // Clear backpack issuer fields when authentication details checkbox is not checked.
140
                        $mform->getElement('backpackemail')->setValue('');
141
                        $mform->getElement('password')->setValue('');
142
                    }
143
                }
144
            } else if ($apiversion == OPEN_BADGES_V2P1) {
145
                if (!empty($mform->getElement('backpackweburlv2p1')->getValue())) {
146
                    $mform->getElement('backpackweburl')->setValue(
147
                        $mform->getElement('backpackweburlv2p1')->getValue(),
148
                    );
149
                }
150
                // Clear backpack issuer fields when OBv2.1 is selected.
151
                $mform->getElement('includeauthdetails')->setValue(0);
152
                $mform->getElement('backpackemail')->setValue('');
153
                $mform->getElement('password')->setValue('');
154
            }
155
        }
156
    }
157
 
158
    #[\Override]
159
    public function set_data($backpack) {
160
        if ($backpack->apiversion == OPEN_BADGES_V2) {
161
            if (backpack_api::is_canvas_credentials_region($backpack->backpackweburl)) {
162
                // Calculate provider and region fields based on backpack URLs.
163
                $backpack->provider = backpack_api::PROVIDER_CANVAS_CREDENTIALS;
164
                $backpack->region = backpack_api::get_regionid_from_url($backpack->backpackweburl);
165
                $backpack->backpackweburl = '';
166
                $backpack->backpackapiurl = '';
167
                if (isset($backpack->backpackemail) && !empty($backpack->backpackemail)) {
168
                    // Update Canvas Credentials fields.
169
                    $backpack->includeauthdetailscanvas = 1;
170
                    $backpack->backpackemailcanvas = $backpack->backpackemail;
171
                    $backpack->backpackpasswordcanvas = $backpack->password;
172
                    // Clear email and password fields for another providers.
173
                    $backpack->includeauthdetails = 0;
174
                    $backpack->backpackemail = '';
175
                    $backpack->password = '';
176
                }
177
            } else {
178
                $backpack->provider = backpack_api::PROVIDER_OTHER;
179
            }
180
        } else if ($backpack->apiversion == OPEN_BADGES_V2P1) {
181
            $backpack->backpackweburlv2p1 = $backpack->backpackweburl;
182
            $backpack->backpackweburl = '';
183
            $backpack->backpackapiurl = '';
184
        }
185
 
186
        parent::set_data($backpack);
187
    }
188
 
1 efrain 189
    /**
190
     * Validate the data from the form.
191
     *
192
     * @param  array $data form data
193
     * @param  array $files form files
194
     * @return array An array of error messages.
195
     */
196
    public function validation($data, $files) {
197
        $errors = parent::validation($data, $files);
198
 
199
        // Ensure backpackapiurl and backpackweburl are valid URLs.
1441 ariadna 200
        $isobv20 = isset($data['apiversion']) && $data['apiversion'] == OPEN_BADGES_V2;
201
        $isobv2p1 = isset($data['apiversion']) && $data['apiversion'] == OPEN_BADGES_V2P1;
202
        if ($isobv20) {
203
            $errors = array_merge($errors, $this->validate_obv20($data));
204
        } else if ($isobv2p1) {
205
            $errors = array_merge($errors, $this->validate_obv2p1($data));
206
        }
207
 
208
        // Check email and password are not empty when including auth details.
209
        if (!empty($data['includeauthdetails']) && empty($data['backpackemail'])) {
210
            $errors['backpackemail'] = get_string('err_required', 'form');
211
        }
212
        if (!empty($data['includeauthdetails']) && empty($data['password'])) {
213
            $errors['password'] = get_string('err_required', 'form');
214
        }
215
 
216
        return $errors;
217
    }
218
 
219
    /**
220
     * Validate the data for Open Badges v2.0.
221
     *
222
     * @param array $data Form data.
223
     * @return string[] An array of error messages.
224
     */
225
    private function validate_obv20(array $data): array {
226
        $errors = [];
227
 
228
        $displaycanvasfields = backpack_api::display_canvas_credentials_fields();
229
        if (
230
            $displaycanvasfields
231
            && (!array_key_exists('provider', $data) || $data['provider'] == backpack_api::PROVIDER_EMPTY)
232
        ) {
233
            // Check provider is set.
234
            $errors['provider'] = get_string('err_required', 'form');
235
        } else if (
236
            $displaycanvasfields
237
            && ($data['provider'] == backpack_api::PROVIDER_CANVAS_CREDENTIALS)
238
        ) {
239
            // Check region is set.
240
            if (!array_key_exists('region', $data) || $data['region'] == backpack_api::REGION_EMPTY) {
241
                $errors['region'] = get_string('err_required', 'form');
242
            }
243
        } else {
244
            if (empty($data['backpackweburl'])) {
245
                $errors['backpackweburl'] = get_string('err_required', 'form');
246
            } else if (!preg_match('@^https?://.+@', $data['backpackweburl'])) {
247
                $errors['backpackweburl'] = get_string('invalidurl', 'badges');
248
            }
1 efrain 249
            if (empty($data['backpackapiurl'])) {
250
                $errors['backpackapiurl'] = get_string('err_required', 'form');
251
            } else if (!preg_match('@^https?://.+@', $data['backpackapiurl'])) {
252
                $errors['backpackapiurl'] = get_string('invalidurl', 'badges');
253
            }
254
        }
1441 ariadna 255
 
256
        if ($displaycanvasfields) {
257
            if (!empty($data['includeauthdetailscanvas']) && empty($data['backpackemailcanvas'])) {
258
                $errors['backpackemailcanvas'] = get_string('err_required', 'form');
259
            }
260
            if (!empty($data['includeauthdetailscanvas']) && empty($data['backpackpasswordcanvas'])) {
261
                $errors['backpackpasswordcanvas'] = get_string('err_required', 'form');
262
            }
1 efrain 263
        }
264
 
265
        return $errors;
266
    }
267
 
268
    /**
1441 ariadna 269
     * Validate the data for Open Badges v2.1.
1 efrain 270
     *
1441 ariadna 271
     * @param array $data Form data.
272
     * @return string[] An array of error messages.
1 efrain 273
     */
1441 ariadna 274
    private function validate_obv2p1(array $data): array {
275
        $errors = [];
1 efrain 276
 
1441 ariadna 277
        if (empty($data['backpackweburlv2p1'])) {
278
            $errors['backpackweburlv2p1'] = get_string('err_required', 'form');
279
        } else if (!preg_match('@^https?://.+@', $data['backpackweburlv2p1'])) {
280
            $errors['backpackweburlv2p1'] = get_string('invalidurl', 'badges');
1 efrain 281
        }
282
 
1441 ariadna 283
        return $errors;
1 efrain 284
    }
285
 
286
    /**
1441 ariadna 287
     * Add provider fields to the form.
288
     */
289
    protected function add_provider_fields(): void {
290
        $mform = $this->_form;
291
 
292
        if (!backpack_api::display_canvas_credentials_fields()) {
293
            // If canvas credentials fields are not to be displayed, return early.
294
            return;
295
        }
296
 
297
        // Add an empty option at the start.
298
        $providers = backpack_api::get_providers();
299
        $providers = [backpack_api::PROVIDER_EMPTY => ''] + $providers;
300
        $mform->addElement('select', 'provider', get_string('provider', 'core_badges'), $providers);
301
        $mform->setType('provider', PARAM_RAW);
302
        $mform->hideIf('provider', 'apiversion', 'ne', OPEN_BADGES_V2);
303
 
304
        // Add an empty option at the start.
305
        $regions = backpack_api::get_regions();
306
        $regions = [backpack_api::REGION_EMPTY => ''] + array_column($regions, 'name');
307
        $mform->addElement('select', 'region', get_string('region', 'core_badges'), $regions);
308
        $mform->setType('region', PARAM_RAW);
309
        $mform->hideIf('region', 'provider', 'ne', backpack_api::PROVIDER_CANVAS_CREDENTIALS);
310
        $mform->hideIf('region', 'apiversion', 'ne', OPEN_BADGES_V2);
311
    }
312
 
313
    /**
314
     * Add Canvas backpack specific issuer auth details.
315
     *
316
     * @param string|null $email The email addressed provided or null if it's new.
317
     */
318
    protected function add_connect_issuer_canvas_fields(?string $email): void {
319
        $mform = $this->_form;
320
 
321
        if (!backpack_api::display_canvas_credentials_fields()) {
322
            // If canvas credentials fields are not to be displayed, return early.
323
            return;
324
        }
325
 
326
        $providers = backpack_api::get_providers();
327
        $regions = backpack_api::get_regions();
328
        if (empty($providers) || empty($regions)) {
329
            // If no providers or regions are available, return early.
330
            return;
331
        }
332
 
333
        // Checkbox and information to enable/disable issuer account.
334
        $mform->addElement('static', '', null, '');
335
        $mform->addElement(
336
            'advcheckbox',
337
            'includeauthdetailscanvas',
338
            null,
339
            '<strong>' . get_string('includeauthdetailscanvas', 'core_badges') . '</strong> '
340
            . get_string('includeauthdetailscanvas_subtitle', 'core_badges'),
341
        );
342
        if (!empty($backpack->backpackemail) || !empty($backpack->password)) {
343
            $mform->setDefault('includeauthdetailscanvas', 1);
344
        }
345
        $mform->addHelpButton('includeauthdetailscanvas', 'includeauthdetailscanvas', 'core_badges');
346
        $mform->hideIf('includeauthdetailscanvas', 'apiversion', 'ne', OPEN_BADGES_V2);
347
        $mform->hideIf('includeauthdetailscanvas', 'region', 'eq', backpack_api::REGION_EMPTY);
348
        $mform->hideIf('includeauthdetailscanvas', 'provider', 'ne', backpack_api::PROVIDER_CANVAS_CREDENTIALS);
349
 
350
        $mform->addElement(
351
            'static',
352
            'includeauthdetailscanvasdesc',
353
            null,
354
            get_string('includeauthdetailscanvas_desc', 'core_badges'),
355
        );
356
        $mform->hideIf('includeauthdetailscanvasdesc', 'includeauthdetailscanvas');
357
        $mform->hideIf('includeauthdetailscanvasdesc', 'region', 'eq', backpack_api::REGION_EMPTY);
358
        $mform->hideIf('includeauthdetailscanvasdesc', 'provider', 'ne', backpack_api::PROVIDER_CANVAS_CREDENTIALS);
359
        $mform->hideIf('includeauthdetailscanvasdesc', 'apiversion', 'ne', OPEN_BADGES_V2);
360
 
361
        // Email.
362
        $mform->addElement('text', 'backpackemailcanvas', get_string('issueremail', 'core_badges'));
363
        $mform->setType('backpackemailcanvas', PARAM_EMAIL);
364
        $mform->setDefault('backpackemailcanvas', $email);
365
        $mform->hideIf('backpackemailcanvas', 'includeauthdetailscanvas');
366
        $mform->hideIf('backpackemailcanvas', 'apiversion', 'ne', OPEN_BADGES_V2);
367
        $mform->hideIf('backpackemailcanvas', 'provider', 'ne', backpack_api::PROVIDER_CANVAS_CREDENTIALS);
368
 
369
        // Password.
370
        $mform->addElement('passwordunmask', 'backpackpasswordcanvas', get_string('password'));
371
        $mform->setType('backpackpasswordcanvas', PARAM_RAW);
372
        $mform->hideIf('backpackpasswordcanvas', 'includeauthdetailscanvas');
373
        $mform->hideIf('backpackpasswordcanvas', 'apiversion', 'ne', OPEN_BADGES_V2);
374
        $mform->hideIf('backpackpasswordcanvas', 'provider', 'ne', backpack_api::PROVIDER_CANVAS_CREDENTIALS);
375
    }
376
 
377
    /**
378
     * Add generic backpack issuer auth details.
379
     *
380
     * @param \stdClass|null $backpack The backpack instance.
381
     * @param string|null $email The issuer email or null if it's new.
382
     */
383
    protected function add_connect_issuer_fields(?\stdClass $backpack, ?string $email): void {
384
        $mform = $this->_form;
385
 
386
        // Checkbox and information to enable/disable issuer account.
387
        $mform->addElement(
388
            'advcheckbox',
389
            'includeauthdetails',
390
            null,
391
            '<strong>' . get_string('includeauthdetails', 'core_badges') . '</strong>',
392
        );
393
        if ($backpack && (!empty($backpack->backpackemail) || !empty($backpack->password))) {
394
            $mform->setDefault('includeauthdetails', 1);
395
        }
396
        $mform->addHelpButton('includeauthdetails', 'includeauthdetails', 'core_badges');
397
        $mform->hideIf('includeauthdetails', 'provider', 'eq', backpack_api::PROVIDER_CANVAS_CREDENTIALS);
398
        $mform->hideIf('includeauthdetails', 'apiversion', 'ne', OPEN_BADGES_V2);
399
 
400
        $mform->addElement('static', 'includeauthdetailsdesc', null, get_string('includeauthdetails_desc', 'core_badges'));
401
        $mform->hideIf('includeauthdetailsdesc', 'includeauthdetails');
402
        $mform->hideIf('includeauthdetailsdesc', 'provider', 'eq', backpack_api::PROVIDER_CANVAS_CREDENTIALS);
403
 
404
        // Email and password fields.
405
        $this->add_auth_fields($email);
406
    }
407
 
408
    /**
1 efrain 409
     * Add backpack specific auth details.
410
     *
411
     * @param string|null $email The email addressed provided or null if it's new.
412
     * @param bool $includepassword Include the password field. Defaults to true
413
     * @throws \coding_exception
414
     */
415
    protected function add_auth_fields(?string $email, bool $includepassword = true) {
416
        $mform = $this->_form;
417
 
1441 ariadna 418
        // Email.
419
        $mform->addElement('text', 'backpackemail', get_string('issueremail', 'core_badges'));
1 efrain 420
        $mform->setType('backpackemail', PARAM_EMAIL);
421
        $mform->setDefault('backpackemail', $email);
1441 ariadna 422
        $mform->hideIf('backpackemail', 'includeauthdetails');
423
        $mform->hideIf('backpackemail', 'apiversion', 'ne', OPEN_BADGES_V2);
424
        $mform->hideIf('backpackemail', 'provider', 'eq', backpack_api::PROVIDER_CANVAS_CREDENTIALS);
1 efrain 425
 
1441 ariadna 426
        // Password.
1 efrain 427
        if ($includepassword) {
1441 ariadna 428
            $mform->addElement('passwordunmask', 'password', get_string('password'));
1 efrain 429
            $mform->setType('password', PARAM_RAW);
430
        }
1441 ariadna 431
        $mform->hideIf('password', 'includeauthdetails');
432
        $mform->hideIf('password', 'apiversion', 'ne', OPEN_BADGES_V2);
433
        $mform->hideIf('password', 'provider', 'eq', backpack_api::PROVIDER_CANVAS_CREDENTIALS);
1 efrain 434
    }
435
}