diff --git a/blocks/classes/external.php b/blocks/classes/external.php index a22cab2d810..e9f09ac3837 100644 --- a/blocks/classes/external.php +++ b/blocks/classes/external.php @@ -71,7 +71,7 @@ class core_block_external extends external_api { new external_single_structure( array( 'name' => new external_value(PARAM_RAW, 'Name.'), - 'value' => new external_value(PARAM_RAW, 'Value.'), + 'value' => new external_value(PARAM_RAW, 'JSON encoded representation of the config value.'), 'type' => new external_value(PARAM_ALPHA, 'Type (instance or plugin).'), ) ), @@ -125,7 +125,7 @@ class core_block_external extends external_api { foreach ((array) $data as $name => $value) { $block['configs'][] = [ 'name' => $name, - 'value' => $value, + 'value' => json_encode($value), // Always JSON encode, we may receive non-scalar values. 'type' => $type, ]; } diff --git a/blocks/tests/externallib_test.php b/blocks/tests/externallib_test.php index 6b894b97cf7..bd815e657cb 100644 --- a/blocks/tests/externallib_test.php +++ b/blocks/tests/externallib_test.php @@ -177,6 +177,9 @@ class core_block_externallib_testcase extends externallib_advanced_testcase { $blocks = $page->blocks->get_blocks_for_region($page->blocks->get_default_region()); $block = end($blocks); $block = block_instance('html', $block->instance); + $nonscalar = [ + 'something' => true, + ]; $configdata = (object) [ 'title' => $title, 'text' => [ @@ -184,6 +187,7 @@ class core_block_externallib_testcase extends externallib_advanced_testcase { 'text' => $body, 'format' => $bodyformat, ], + 'nonscalar' => $nonscalar ]; $block->instance_config_save((object) $configdata); $filename = 'img.png'; @@ -215,17 +219,20 @@ class core_block_externallib_testcase extends externallib_advanced_testcase { $this->assertEquals($newblock, $result['blocks'][0]['name']); $configcounts = 0; foreach ($result['blocks'][0]['configs'] as $config) { - if ($config['type'] = 'plugin' && $config['name'] == 'allowcssclasses' && $config['value'] == 0) { + if ($config['type'] = 'plugin' && $config['name'] == 'allowcssclasses' && $config['value'] == json_encode('0')) { $configcounts++; - } else if ($config['type'] = 'instance' && $config['name'] == 'text' && $config['value'] == $body) { + } else if ($config['type'] = 'instance' && $config['name'] == 'text' && $config['value'] == json_encode($body)) { $configcounts++; - } else if ($config['type'] = 'instance' && $config['name'] == 'title' && $config['value'] == $title) { + } else if ($config['type'] = 'instance' && $config['name'] == 'title' && $config['value'] == json_encode($title)) { $configcounts++; - } else if ($config['type'] = 'instance' && $config['name'] == 'format' && $config['value'] == 0) { + } else if ($config['type'] = 'instance' && $config['name'] == 'format' && $config['value'] == json_encode('0')) { + $configcounts++; + } else if ($config['type'] = 'instance' && $config['name'] == 'nonscalar' && + $config['value'] == json_encode($nonscalar)) { $configcounts++; } } - $this->assertEquals(4, $configcounts); + $this->assertEquals(5, $configcounts); } /** @@ -261,7 +268,7 @@ class core_block_externallib_testcase extends externallib_advanced_testcase { // Check the configuration returned for this default block. if ($block['name'] == 'recentlyaccessedcourses') { $this->assertEquals('displaycategories', $block['configs'][0]['name']); - $this->assertEquals(0, $block['configs'][0]['value']); + $this->assertEquals(json_encode('0'), $block['configs'][0]['value']); $this->assertEquals('plugin', $block['configs'][0]['type']); } }