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 core\context\system;
use core\context;
use html_writer;
use MoodleQuickForm;
/**
* Field 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 field_controller extends \core_customfield\field_controller {
/**
* Add form elements for editing the custom field definition
*
* @param MoodleQuickForm $mform
*/
public function config_form_definition(MoodleQuickForm $mform): void {
$mform->addElement('header', 'specificsettings', get_string('specificsettings', 'customfield_number'));
$mform->setExpanded('specificsettings');
$providers = provider_base::get_all_providers($this);
if (count($providers) > 0) {
$this->add_field_type_select($mform, $providers);
// Add form config elements for each provider.
foreach ($providers as $provider) {
$provider->config_form_definition($mform);
}
}
// Default value.
$mform->addElement('float', 'configdata[defaultvalue]', get_string('defaultvalue', 'core_customfield'));
if ($this->get_configdata_property('defaultvalue') === null) {
$mform->setDefault('configdata[defaultvalue]', '');
}
// Minimum value.
$mform->addElement('float', 'configdata[minimumvalue]', get_string('minimumvalue', 'customfield_number'));
if ($this->get_configdata_property('minimumvalue') === null) {
$mform->setDefault('configdata[minimumvalue]', '');
}
// Maximum value.
$mform->addElement('float', 'configdata[maximumvalue]', get_string('maximumvalue', 'customfield_number'));
if ($this->get_configdata_property('maximumvalue') === null) {
$mform->setDefault('configdata[maximumvalue]', '');
}
// Decimal places.
$mform->addElement('text', 'configdata[decimalplaces]', get_string('decimalplaces', 'customfield_number'));
if ($this->get_configdata_property('decimalplaces') === null) {
$mform->setDefault('configdata[decimalplaces]', 0);
}
$mform->setType('configdata[decimalplaces]', PARAM_INT);
// Display format settings.
// TODO: Change this after MDL-82996 fixed.
$randelname = 'str_display_format';
$mform->addGroup([], $randelname, html_writer::tag('h4', get_string('headerdisplaysettings', 'customfield_number')));
// Display template.
$mform->addElement('text', 'configdata[display]', get_string('display', 'customfield_number'),
['size' => 50]);
$mform->setType('configdata[display]', PARAM_TEXT);
$mform->addHelpButton('configdata[display]', 'display', 'customfield_number');
if ($this->get_configdata_property('display') === null) {
$mform->setDefault('configdata[display]', '{value}');
}
// Display when zero.
$mform->addElement('text', 'configdata[displaywhenzero]', get_string('displaywhenzero', 'customfield_number'),
['size' => 50]);
$mform->setType('configdata[displaywhenzero]', PARAM_TEXT);
$mform->addHelpButton('configdata[displaywhenzero]', 'displaywhenzero', 'customfield_number');
if ($this->get_configdata_property('displaywhenzero') === null) {
$mform->setDefault('configdata[displaywhenzero]', 0);
}
}
/**
* Adds selector to provider for field population.
*
* @param MoodleQuickForm $mform
* @param provider_base[] $providers
*/
protected function add_field_type_select(MoodleQuickForm $mform, array $providers): void {
$autooptions = [];
foreach ($providers as $provider) {
$autooptions[get_class($provider)] = $provider->get_name();
}
$options = ['' => get_string('genericfield', 'customfield_number')];
$options = array_merge($options, $autooptions);
$mform->addElement('select', 'configdata[fieldtype]', get_string('fieldtype', 'customfield_number'), $options);
$mform->addHelpButton('configdata[fieldtype]', 'fieldtype', 'customfield_number');
}
/**
* Validate the data on the field configuration form
*
* @param array $data
* @param array $files
* @return array
*/
public function config_form_validation(array $data, $files = []): array {
$errors = parent::config_form_validation($data, $files);
$display = $data['configdata']['display'];
if (!preg_match('/\{value}/', $display)) {
$errors['configdata[display]'] = get_string('displayvalueconfigerror', 'customfield_number');
}
// Each of these configuration fields are optional.
$defaultvalue = $data['configdata']['defaultvalue'] ?? '';
$minimumvalue = $data['configdata']['minimumvalue'] ?? '';
$maximumvalue = $data['configdata']['maximumvalue'] ?? '';
foreach (provider_base::get_all_providers($this) as $provider) {
if (array_key_exists('fieldtype', $data["configdata"]) && $data["configdata"]["fieldtype"] == get_class($provider)) {
$errors = array_merge($errors, $provider->config_form_validation($data, $files));
}
}
// Early exit if neither maximum/minimum are specified.
if ($minimumvalue === '' && $maximumvalue === '') {
return $errors;
}
$minimumvaluefloat = (float) $minimumvalue;
$maximumvaluefloat = (float) $maximumvalue;
// If maximum is set, it must be greater than minimum.
if ($maximumvalue !== '' && $minimumvaluefloat >= $maximumvaluefloat) {
$errors['configdata[minimumvalue]'] = get_string('minimumvalueconfigerror', 'customfield_number');
}
// If default value is set, it must be in range of minimum and maximum.
if ($defaultvalue !== '') {
$defaultvaluefloat = (float) $defaultvalue;
if ($defaultvaluefloat < $minimumvaluefloat || ($maximumvalue !== '' && $defaultvaluefloat > $maximumvaluefloat)) {
$errors['configdata[defaultvalue]'] = get_string('defaultvalueconfigerror', 'customfield_number');
}
}
return $errors;
}
/**
* Prepares a value for export
*
* @param mixed $value
* @param context|null $context
* @return string|float|null
*/
public function prepare_field_for_display(mixed $value, ?context $context = null): string|null|float {
if ($provider = provider_base::instance($this)) {
return $provider->prepare_export_value($value, $context);
}
if ($value === null) {
return null;
}
$decimalplaces = (int) $this->get_configdata_property('decimalplaces');
if (round((float) $value, $decimalplaces) == 0) {
$value = $this->get_configdata_property('displaywhenzero');
if ((string) $value === '') {
return null;
}
} else {
// Let's format the value.
$value = format_float((float)$value, $decimalplaces);
// Apply the display format.
$format = $this->get_configdata_property('display') ?? '{value}';
$value = str_replace('{value}', $value, $format);
}
return format_string($value, true, ['context' => $context ?? system::instance()]);
}
/**
* Can the value of this field be manually editable in the edit forms
*
* @return bool
*/
public function is_editable(): bool {
return (string) $this->get_configdata_property('fieldtype') === '';
}
}