diff --git a/lib/classes/external/exporter.php b/lib/classes/external/exporter.php index 38c195a5964..2eee814846d 100644 --- a/lib/classes/external/exporter.php +++ b/lib/classes/external/exporter.php @@ -261,16 +261,32 @@ abstract class exporter { final public static function read_properties_definition() { $properties = static::properties_definition(); $customprops = static::define_other_properties(); - foreach ($customprops as $property => $definition) { + $customprops = static::format_properties($customprops); + $properties += $customprops; + return $properties; + } + + /** + * Recursively formats a given property definition with the default fields required. + * + * @param array $properties List of properties to format + * @return array Formatted array + */ + final public static function format_properties($properties) { + foreach ($properties as $property => $definition) { // Ensures that null is set to its default. if (!isset($definition['null'])) { - $customprops[$property]['null'] = NULL_NOT_ALLOWED; + $properties[$property]['null'] = NULL_NOT_ALLOWED; } if (!isset($definition['description'])) { - $customprops[$property]['description'] = $property; + $properties[$property]['description'] = $property; + } + + // If an array is provided, it may be a nested array that is unformatted so rinse and repeat. + if (is_array($definition['type'])) { + $properties[$property]['type'] = static::format_properties($definition['type']); } } - $properties += $customprops; return $properties; } diff --git a/lib/tests/exporter_test.php b/lib/tests/exporter_test.php index f456628946a..57929ca6d8a 100644 --- a/lib/tests/exporter_test.php +++ b/lib/tests/exporter_test.php @@ -179,6 +179,8 @@ class core_exporter_testcase extends advanced_testcase { $this->assertEquals('otherstring description', $properties['otherstring']['description']); // Other properties default description. $this->assertEquals('otherstrings', $properties['otherstrings']['description']); + // Assert nested elements are formatted correctly. + $this->assertEquals('id', $properties['nestedarray']['type']['id']['description']); } } @@ -228,6 +230,13 @@ class core_testable_exporter extends \core\external\exporter { 'otherstrings' => array( 'type' => PARAM_TEXT, 'multiple' => true + ), + 'nestedarray' => array( + 'multiple' => true, + 'optional' => true, + 'type' => [ + 'id' => ['type' => PARAM_INT] + ] ) ); }