. /** * Float type form element * * Contains HTML class for a float type element * * @package core_form * @category form * @copyright 2019 Shamim Rezaie * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ defined('MOODLE_INTERNAL') || die(); global $CFG; require_once($CFG->libdir . '/form/text.php'); /** * Float type form element. * * This is preferred over the text element when working with float numbers, and takes care of the fact that different languages * may use different symbols as the decimal separator. * Using this element, submitted float numbers will be automatically translated from the localised format into the computer format, * and vice versa when they are being displayed. * * @copyright 2019 Shamim Rezaie * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class MoodleQuickForm_float extends MoodleQuickForm_text { /** * MoodleQuickForm_float constructor. * * @param string $elementName (optional) name of the float field * @param string $elementLabel (optional) float field label * @param string $attributes (optional) Either a typical HTML attribute string or an associative array */ public function __construct($elementName = null, $elementLabel = null, $attributes = null) { parent::__construct($elementName, $elementLabel, $attributes); $this->_type = 'float'; } /** * Called by HTML_QuickForm whenever form event is made on this element. * * @param string $event Name of event * @param mixed $arg event arguments * @param object $caller calling object * @return bool */ public function onQuickFormEvent($event, $arg, &$caller) { switch ($event) { case 'updateValue': if ($value = $this->_findValue($caller->_constantValues)) { $value = $this->format_float($value); } if (null === $value) { $value = $this->_findValue($caller->_submitValues); if (null === $value) { if ($value = $this->_findValue($caller->_defaultValues)) { $value = $this->format_float($value); } } } if (null !== $value) { parent::setValue($value); } return true; case 'createElement': $caller->setType($arg[0], PARAM_RAW_TRIMMED); default: return parent::onQuickFormEvent($event, $arg, $caller); } } /** * Checks that the submitted value is a valid float number. * * @param string $value The localised float number that is submitted. * @return string|null Validation error message or null. */ public function validateSubmitValue($value) { if (false === unformat_float($value, true)) { return get_string('err_numeric', 'core_form'); } } /** * Sets the value of the form element. * * @param string $value Default value of the form element */ public function setValue($value) { $value = $this->format_float($value); parent::setValue($value); } /** * Returns the value of the form element. * * @return false|float */ public function getValue() { $value = parent::getValue(); if ($value) { $value = unformat_float($value, true); } return $value; } /** * Returns a 'safe' element's value. * * @param array $submitValues array of submitted values to search * @param bool $assoc whether to return the value as associative array * @return mixed */ public function exportValue(&$submitValues, $assoc = false) { $value = $this->_findValue($submitValues); if (null === $value) { $value = $this->getValue(); } else if ($value) { $value = unformat_float($value, true); } return $this->_prepareValue($value, $assoc); } /** * Used by getFrozenHtml() to pass the element's value if _persistantFreeze is on. * * @return string */ public function _getPersistantData() { if (!$this->_persistantFreeze) { return ''; } else { $id = $this->getAttribute('id'); if (isset($id)) { // Id of persistant input is different then the actual input. $id = array('id' => $id . '_persistant'); } else { $id = array(); } return '_getAttrString(array( 'type' => 'hidden', 'name' => $this->getAttribute('name'), 'value' => $this->getAttribute('value') ) + $id) . ' />'; } } /** * Given a float, prints it nicely. * This function reserves the number of decimal places. * * @param float|null $value The float number to format * @return string Localised float */ private function format_float($value) { if (is_numeric($value)) { if ($value > 0) { $decimals = strlen($value) - strlen(floor($value)) - 1; } else { $decimals = strlen($value) - strlen(ceil($value)) - 1; } $value = format_float($value, $decimals); } return $value; } }