diff --git a/DependencyInjection/Configuration.php b/DependencyInjection/Configuration.php index c079a5e..b9a2bab 100644 --- a/DependencyInjection/Configuration.php +++ b/DependencyInjection/Configuration.php @@ -28,17 +28,20 @@ class Configuration implements ConfigurationInterface ->children() ->scalarNode('enabled')->defaultTrue()->end() ->scalarNode('endpoint')->defaultValue('/app_dev.php')->end() - ->enumNode('json_declaration_method') + ->enumNode('request_format_method') ->values(array('format_param', 'accept_header')) ->defaultValue('format_param') ->end() ->arrayNode('authentication') ->children() ->scalarNode('name')->isRequired()->end() - ->enumNode('delivery') - // header|query|request, but only query is implemented for now - ->values(array('query')) + ->scalarNode('delivery') ->isRequired() + ->validate() + // header|query|request, but only query is implemented for now + ->ifNotInArray(array('query')) + ->thenInvalid("Unknown authentication delivery type '%s'.") + ->end() ->end() ->end() ->end() diff --git a/DependencyInjection/NelmioApiDocExtension.php b/DependencyInjection/NelmioApiDocExtension.php index 1852fcf..501a00e 100644 --- a/DependencyInjection/NelmioApiDocExtension.php +++ b/DependencyInjection/NelmioApiDocExtension.php @@ -31,7 +31,7 @@ class NelmioApiDocExtension extends Extension $container->setParameter('nelmio_api_doc.api_name', $config['name']); $container->setParameter('nelmio_api_doc.sandbox.enabled', $config['sandbox']['enabled']); $container->setParameter('nelmio_api_doc.sandbox.endpoint', $config['sandbox']['endpoint']); - $container->setParameter('nelmio_api_doc.sandbox.json_declaration_method', $config['sandbox']['json_declaration_method']); + $container->setParameter('nelmio_api_doc.sandbox.request_format_method', $config['sandbox']['request_format_method']); $loader = new XmlFileLoader($container, new FileLocator(__DIR__.'/../Resources/config')); $loader->load('formatters.xml'); diff --git a/Formatter/HtmlFormatter.php b/Formatter/HtmlFormatter.php index 5c1dd30..06dde5a 100644 --- a/Formatter/HtmlFormatter.php +++ b/Formatter/HtmlFormatter.php @@ -43,7 +43,7 @@ class HtmlFormatter extends AbstractFormatter /** * @var string */ - private $jsonDeclarationMethod; + private $requestFormatMethod; /** * @param array $authentication @@ -88,9 +88,9 @@ class HtmlFormatter extends AbstractFormatter /** * @param string $method */ - public function setJsonDeclarationMethod($method) + public function setRequestFormatMethod($method) { - $this->jsonDeclarationMethod = $method; + $this->requestFormatMethod = $method; } /** @@ -146,14 +146,14 @@ class HtmlFormatter extends AbstractFormatter private function getGlobalVars() { return array( - 'apiName' => $this->apiName, - 'authentication' => $this->authentication, - 'endpoint' => $this->endpoint, - 'enableSandbox' => $this->enableSandbox, - 'jsonDeclarationMethod' => $this->jsonDeclarationMethod, - 'date' => date(DATE_RFC822), - 'css' => file_get_contents(__DIR__ . '/../Resources/public/css/screen.css'), - 'js' => file_get_contents(__DIR__ . '/../Resources/public/js/all.js'), + 'apiName' => $this->apiName, + 'authentication' => $this->authentication, + 'endpoint' => $this->endpoint, + 'enableSandbox' => $this->enableSandbox, + 'requestFormatMethod' => $this->requestFormatMethod, + 'date' => date(DATE_RFC822), + 'css' => file_get_contents(__DIR__ . '/../Resources/public/css/screen.css'), + 'js' => file_get_contents(__DIR__ . '/../Resources/public/js/all.js'), ); } diff --git a/Resources/config/formatters.xml b/Resources/config/formatters.xml index 60373b5..888268b 100644 --- a/Resources/config/formatters.xml +++ b/Resources/config/formatters.xml @@ -37,8 +37,8 @@ <call method="setEndpoint"> <argument>%nelmio_api_doc.sandbox.endpoint%</argument> </call> - <call method="setJsonDeclarationMethod"> - <argument>%nelmio_api_doc.sandbox.json_declaration_method%</argument> + <call method="setRequestFormatMethod"> + <argument>%nelmio_api_doc.sandbox.request_format_method%</argument> </call> <call method="setAuthentication"> <argument>%nelmio_api_doc.sandbox.authentication%</argument> diff --git a/Resources/public/css/screen.css b/Resources/public/css/screen.css index 4b73b61..d0960bc 100644 --- a/Resources/public/css/screen.css +++ b/Resources/public/css/screen.css @@ -148,9 +148,9 @@ table tbody tr:last-child td { text-decoration: none; } -#api_key_wrapper { - float: right; - padding: 10px 0 10px 0; +#sandbox_configuration { + float: right; + padding: 10px 0 10px 0; } #colophon { diff --git a/Resources/views/layout.html.twig b/Resources/views/layout.html.twig index 95cd134..ff773fa 100644 --- a/Resources/views/layout.html.twig +++ b/Resources/views/layout.html.twig @@ -15,11 +15,16 @@ <body> <div id="header"> <a href=""><h1>{{ apiName }}</h1></a> - {% if authentication %} - <div id="api_key_wrapper"> - api key: <input type="text" id="api_key"/> + <div id="sandbox_configuration"> + request format: + <select id="request_format"> + <option value="json">JSON</option> + <option value="xml">XML</option> + </select> + {% if authentication %} + api key: <input type="text" id="api_key"/> + {% endif %} </div> - {% endif %} <br style="clear: both;" /> </div> <div class="container" id="resources_container"> @@ -37,42 +42,42 @@ {% if enableSandbox %} var toggleButtonText = function ($btn) { - if ($btn.text() === 'Default') { - $btn.text('Raw'); - } else { - $btn.text('Default'); - } + if ($btn.text() === 'Default') { + $btn.text('Raw'); + } else { + $btn.text('Default'); + } }; var renderRawBody = function ($container) { - var rawData, $btn; + var rawData, $btn; - rawData = $container.data('raw-response'); - $btn = $container.parents('.pane').find('.to-raw'); + rawData = $container.data('raw-response'); + $btn = $container.parents('.pane').find('.to-raw'); - $container.addClass('prettyprinted'); - $container.html(rawData); + $container.addClass('prettyprinted'); + $container.html($('<div/>').text(rawData).html()); - $btn.removeClass('to-raw'); - $btn.addClass('to-prettify'); + $btn.removeClass('to-raw'); + $btn.addClass('to-prettify'); - toggleButtonText($btn); + toggleButtonText($btn); }; var renderPrettifiedBody = function ($container) { - var rawData, $btn; + var rawData, $btn; - rawData = $container.data('raw-response'); - $btn = $container.parents('.pane').find('.to-prettify'); + rawData = $container.data('raw-response'); + $btn = $container.parents('.pane').find('.to-prettify'); - $container.removeClass('prettyprinted'); - $container.html(prettifyResponse(rawData)); - prettyPrint && prettyPrint(); + $container.removeClass('prettyprinted'); + $container.html(prettifyResponse(rawData)); + prettyPrint && prettyPrint(); - $btn.removeClass('to-prettify'); - $btn.addClass('to-raw'); + $btn.removeClass('to-prettify'); + $btn.addClass('to-raw'); - toggleButtonText($btn); + toggleButtonText($btn); }; $('.tabs li').click(function() { @@ -88,7 +93,7 @@ var prettifyResponse = function(text) { try { var data = typeof text === 'string' ? JSON.parse(text) : text; - text = JSON.stringify(data, undefined, ' '); + text = JSON.stringify(data, undefined, ' '); } catch (err) { } @@ -105,11 +110,7 @@ container.data('raw-response', data); - if ('<' === data[0]) { - renderRawBody(container); - } else { - renderPrettifiedBody(container); - } + renderPrettifiedBody(container); container.parents('.pane').find('.to-prettify').text('Raw'); container.parents('.pane').find('.to-raw').text('Raw'); @@ -136,45 +137,46 @@ self = this, params = {}, headers = {}, - content = $(this).find('textarea.content').val(); + content = $(this).find('textarea.content').val(), result_container = $('.result', $(this).parent()); - var jsonDeclarationMethod = '{{ jsonDeclarationMethod }}'; - if (jsonDeclarationMethod == 'format_param') { - params['_format'] = 'json'; - } else if (jsonDeclarationMethod == 'accept_header') { - headers['Accept'] = 'application/json'; + var requestFormat = $('#request_format').val(); + var requestFormatMethod = '{{ requestFormatMethod }}'; + if (requestFormatMethod == 'format_param') { + params['_format'] = requestFormat; + } else if (requestFormatMethod == 'accept_header') { + headers['Accept'] = 'application/' + requestFormat; } // retrieve all the parameters to send $('.parameters .tuple', $(this)).each(function() { - var key, value; + var key, value; - key = $('.key', $(this)).val(); - value = $('.value', $(this)).val(); + key = $('.key', $(this)).val(); + value = $('.value', $(this)).val(); - if (value) { - params[key] = value; - } + if (value) { + params[key] = value; + } }); // retrieve the additional headers to send $('.headers .tuple', $(this)).each(function() { - var key, value; + var key, value; - key = $('.key', $(this)).val(); - value = $('.value', $(this)).val(); + key = $('.key', $(this)).val(); + value = $('.value', $(this)).val(); - if (value) { - headers[key] = value; - } + if (value) { + headers[key] = value; + } }); // fix parameters in URL for (var key in $.extend({}, params)) { if (url.indexOf('{' + key + '}') !== -1) { - url = url.replace('{' + key + '}', params[key]); - delete params[key]; + url = url.replace('{' + key + '}', params[key]); + delete params[key]; } }; @@ -189,16 +191,16 @@ // and trigger the API call $.ajax({ - url: '{{ endpoint }}' + url, - type: method, - data: content.length ? content : params, - headers: headers, - complete: function(xhr) { - displayResponse(xhr, method, url, result_container); + url: '{{ endpoint }}' + url, + type: method, + data: content.length ? content : params, + headers: headers, + complete: function(xhr) { + displayResponse(xhr, method, url, result_container); - // and enable them back - $('input:not(.content-type), button', $(self)).removeAttr('disabled'); - } + // and enable them back + $('input:not(.content-type), button', $(self)).removeAttr('disabled'); + } }); return false;