From c0b234324531beba4b575071b9ea25b8a55be20a Mon Sep 17 00:00:00 2001 From: Marina Glancy Date: Thu, 10 Oct 2024 13:22:15 +0100 Subject: [PATCH] MDL-83430 customfield_number: call display method from provider earlier --- .../field/number/classes/field_controller.php | 17 ++++++------ .../local/numberproviders/nofactivities.php | 11 ++++++-- .../field/number/classes/provider_base.php | 26 ++++++++++++++++--- 3 files changed, 40 insertions(+), 14 deletions(-) diff --git a/customfield/field/number/classes/field_controller.php b/customfield/field/number/classes/field_controller.php index d1e6a5bab78..523449664d3 100644 --- a/customfield/field/number/classes/field_controller.php +++ b/customfield/field/number/classes/field_controller.php @@ -173,6 +173,10 @@ class field_controller extends \core_customfield\field_controller { * @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; } @@ -185,16 +189,11 @@ class field_controller extends \core_customfield\field_controller { } } else { // Let's format the value. - $provider = provider_base::instance($this); - if ($provider) { - $value = $provider->prepare_export_value($value, $context); - } else { - $value = format_float((float)$value, $decimalplaces); + $value = format_float((float)$value, $decimalplaces); - // Apply the display format. - $format = $this->get_configdata_property('display') ?? '{value}'; - $value = str_replace('{value}', $value, $format); - } + // 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()]); diff --git a/customfield/field/number/classes/local/numberproviders/nofactivities.php b/customfield/field/number/classes/local/numberproviders/nofactivities.php index b3b8771a514..da64f83c074 100644 --- a/customfield/field/number/classes/local/numberproviders/nofactivities.php +++ b/customfield/field/number/classes/local/numberproviders/nofactivities.php @@ -157,13 +157,20 @@ class nofactivities extends provider_base { /** * Preparation for export for number of activities provider. * - * @param mixed $value String or float + * @param mixed $value String or float or null if the value is not present in the database for this instance * @param \context|null $context Context * @return ?string */ public function prepare_export_value(mixed $value, ?\context $context = null): ?string { - if (trim((string)$value) === '') { + if ($value === null) { return null; + } else if (round((float)$value) == 0) { + $whenzero = $this->field->get_configdata_property('displaywhenzero'); + if ((string) $whenzero === '') { + return null; + } else { + return format_string($whenzero, true, ['context' => $context ?? \core\context\system::instance()]); + } } else { return format_float((float)$value, 0); } diff --git a/customfield/field/number/classes/provider_base.php b/customfield/field/number/classes/provider_base.php index 59660b61987..66957744de3 100644 --- a/customfield/field/number/classes/provider_base.php +++ b/customfield/field/number/classes/provider_base.php @@ -80,14 +80,34 @@ abstract class provider_base { } /** - * Provider specific value preparation for export. + * How the field should be displayed + * + * Called from {@see field_controller::prepare_field_for_display()} + * The return value may contain safe HTML but all user input must be passed through + * format_string/format_text functions * * @param mixed $value String or float * @param context|null $context Context - * @return ?string + * @return ?string null if the field should not be displayed or string representation of the field */ public function prepare_export_value(mixed $value, ?\context $context = null): ?string { - return $value; + if ($value === null) { + return null; + } + + // By default assumes that configuration 'decimalplaces' and 'displaywhenzero' are + // present. If they are not used in this provider, override the method. + $decimalplaces = (int) $this->field->get_configdata_property('decimalplaces'); + if (round((float) $value, $decimalplaces) == 0) { + $result = $this->field->get_configdata_property('displaywhenzero'); + if ((string) $result === '') { + return null; + } else { + return format_string($result, true, ['context' => $context ?? \core\context\system::instance()]); + } + } else { + return format_float((float)$value, $decimalplaces); + } } /**