MDL-67084 core_form: duration element should export arrays
authorMarina Glancy <marina@moodle.com>
Mon, 4 Nov 2019 13:37:46 +0000 (14:37 +0100)
committerJun Pataleta <jun@moodle.com>
Thu, 7 Nov 2019 11:21:16 +0000 (19:21 +0800)
lib/form/duration.php
lib/form/tests/duration_test.php

index 7fecd86..d1c8eee 100644 (file)
@@ -241,10 +241,10 @@ class MoodleQuickForm_duration extends MoodleQuickForm_group {
      * Override of standard quickforms method.
      *
      * @param  array $submitValues
-     * @param  bool  $notused Not used.
+     * @param  bool  $assoc  whether to return the value as associative array
      * @return array field name => value. The value is the time interval in seconds.
      */
-    function exportValue(&$submitValues, $notused = false) {
+    function exportValue(&$submitValues, $assoc = false) {
         // Get the values from all the child elements.
         $valuearray = array();
         foreach ($this->_elements as $element) {
@@ -259,8 +259,8 @@ class MoodleQuickForm_duration extends MoodleQuickForm_group {
             return null;
         }
         if ($this->_options['optional'] && empty($valuearray['enabled'])) {
-            return array($this->getName() => 0);
+            return $this->_prepareValue(0, $assoc);
         }
-        return array($this->getName() => $valuearray['number'] * $valuearray['timeunit']);
+        return $this->_prepareValue($valuearray['number'] * $valuearray['timeunit'], $assoc);
     }
 }
index 35900d9..af5bba5 100644 (file)
@@ -108,25 +108,43 @@ class core_form_duration_testcase extends basic_testcase {
      * Testcase to check generated timestamp
      */
     public function test_exportValue() {
+        /** @var MoodleQuickForm_duration $el */
         $el = $this->mform->addElement('duration', 'testel');
         $values = array('testel' => array('number' => 10, 'timeunit' => 1));
-        $this->assertEquals(array('testel' => 10), $el->exportValue($values));
+        $this->assertEquals(array('testel' => 10), $el->exportValue($values, true));
+        $this->assertEquals(10, $el->exportValue($values));
         $values = array('testel' => array('number' => 3, 'timeunit' => 60));
-        $this->assertEquals(array('testel' => 180), $el->exportValue($values));
+        $this->assertEquals(array('testel' => 180), $el->exportValue($values, true));
+        $this->assertEquals(180, $el->exportValue($values));
         $values = array('testel' => array('number' => 1.5, 'timeunit' => 60));
-        $this->assertEquals(array('testel' => 90), $el->exportValue($values));
+        $this->assertEquals(array('testel' => 90), $el->exportValue($values, true));
+        $this->assertEquals(90, $el->exportValue($values));
         $values = array('testel' => array('number' => 2, 'timeunit' => 3600));
-        $this->assertEquals(array('testel' => 7200), $el->exportValue($values));
+        $this->assertEquals(array('testel' => 7200), $el->exportValue($values, true));
+        $this->assertEquals(7200, $el->exportValue($values));
         $values = array('testel' => array('number' => 1, 'timeunit' => 86400));
-        $this->assertEquals(array('testel' => 86400), $el->exportValue($values));
+        $this->assertEquals(array('testel' => 86400), $el->exportValue($values, true));
+        $this->assertEquals(86400, $el->exportValue($values));
         $values = array('testel' => array('number' => 0, 'timeunit' => 3600));
-        $this->assertEquals(array('testel' => 0), $el->exportValue($values));
+        $this->assertEquals(array('testel' => 0), $el->exportValue($values, true));
+        $this->assertEquals(0, $el->exportValue($values));
 
         $el = $this->mform->addElement('duration', 'testel', null, array('optional' => true));
         $values = array('testel' => array('number' => 10, 'timeunit' => 1));
-        $this->assertEquals(array('testel' => 0), $el->exportValue($values));
+        $this->assertEquals(array('testel' => 0), $el->exportValue($values, true));
+        $this->assertEquals(0, $el->exportValue($values));
         $values = array('testel' => array('number' => 20, 'timeunit' => 1, 'enabled' => 1));
-        $this->assertEquals(array('testel' => 20), $el->exportValue($values));
+        $this->assertEquals(array('testel' => 20), $el->exportValue($values, true));
+        $this->assertEquals(20, $el->exportValue($values));
+
+        // Optional element.
+        $el2 = $this->mform->addElement('duration', 'testel', '', ['optional' => true]);
+        $values = array('testel' => array('number' => 10, 'timeunit' => 1, 'enabled' => 1));
+        $this->assertEquals(array('testel' => 10), $el2->exportValue($values, true));
+        $this->assertEquals(10, $el2->exportValue($values));
+        $values = array('testel' => array('number' => 10, 'timeunit' => 1, 'enabled' => 0));
+        $this->assertEquals(array('testel' => 0), $el2->exportValue($values, true));
+        $this->assertEquals(null, $el2->exportValue($values));
     }
 }