AutorÃa | Ultima modificación | Ver Log |
<?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 customfield_number;
use MoodleQuickForm;
/**
* Data controller class
*
* @package customfield_number
* @copyright 2024 Paul Holden <paulh@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class data_controller extends \core_customfield\data_controller {
/**
* Return the name of the field where the information is stored
*
* @return string
*/
public function datafield(): string {
return 'decvalue';
}
/**
* Add form elements for editing the custom field instance
*
* @param MoodleQuickForm $mform
*/
public function instance_form_definition(MoodleQuickForm $mform): void {
global $OUTPUT;
$elementname = $this->get_form_element_name();
// If the field isn't editable (based on type/provider config), then display static element.
$field = $this->get_field();
if (!$field->is_editable()) {
$instanceid = (int)$this->get('instanceid');
$data = ['value' => $this->export_value(), 'fieldid' => $field->get('id'), 'instanceid' => $instanceid];
$value = $OUTPUT->render_from_template('customfield_number/staticvalue', $data);
$mform->addElement('static', $elementname . '_static', $this->get_field()->get_formatted_name(),
$value);
return;
}
$mform->addElement('float', $elementname, $this->get_field()->get_formatted_name());
if (!$this->get('id')) {
$mform->setDefault($elementname, $this->get_default_value());
}
}
/**
* Validate the data on the field instance form
*
* @param array $data
* @param array $files
* @return array
*/
public function instance_form_validation(array $data, array $files): array {
$errors = parent::instance_form_validation($data, $files);
$elementname = $this->get_form_element_name();
$elementvalue = '';
// Providers calculate values automatically, so nothing to validate.
if (!provider_base::instance($this->get_field())) {
$elementvalue = $data[$elementname];
}
$minimumvalue = $this->get_field()->get_configdata_property('minimumvalue') ?? '';
$maximumvalue = $this->get_field()->get_configdata_property('maximumvalue') ?? '';
// Early exit if element value isn't specified, or neither maximum/minimum are specified.
if ($elementvalue === '' || ($minimumvalue === '' && $maximumvalue === '')) {
return $errors;
}
$elementvaluefloat = (float) $elementvalue;
$minimumvaluefloat = (float) $minimumvalue;
$maximumvaluefloat = (float) $maximumvalue;
$decimalplaces = (int) $this->get_field()->get_configdata_property('decimalplaces');
// Value must be greater than minimum. If maximum is set, value must not exceed it.
if ($minimumvalue !== '' && $elementvaluefloat < $minimumvaluefloat) {
$errors[$elementname] = get_string('minimumvalueerror', 'customfield_number',
format_float($minimumvaluefloat, $decimalplaces));
} else if ($maximumvalue !== '' && $elementvaluefloat > $maximumvaluefloat) {
$errors[$elementname] = get_string('maximumvalueerror', 'customfield_number',
format_float($maximumvaluefloat, $decimalplaces));
}
return $errors;
}
/**
* Checks if the value is empty
*
* @param mixed $value
* @return bool
*/
protected function is_empty($value): bool {
return (string) $value === '';
}
/**
* Returns the default value in non human-readable format
*
* @return float|null
*/
public function get_default_value(): ?float {
// If a provider is available, use its default value.
if ($provider = provider_base::instance($this->get_field())) {
return $provider->get_default_value();
}
$defaultvalue = $this->get_field()->get_configdata_property('defaultvalue');
if ($this->is_empty($defaultvalue)) {
return null;
}
return (float) $defaultvalue;
}
/**
* Returns value in a human-readable format
*
* @return string|float|null
*/
public function export_value(): string|float|null {
/** @var field_controller $field */
$field = $this->get_field();
return $field->prepare_field_for_display($this->get_value(), $this->get_context());
}
}