diff --git a/CHANGELOG-2.1.md b/CHANGELOG-2.1.md index 48a8ced841..f070a66b96 100644 --- a/CHANGELOG-2.1.md +++ b/CHANGELOG-2.1.md @@ -41,6 +41,7 @@ To get the diff between two versions, go to https://github.com/symfony/symfony/c * changed the default profiler storage to use the filesystem instead of SQLite * added support for placeholders in route defaults and requirements (replaced by the value set in the service container) * added Filesystem component as a dependency + * added support for hinclude (use ``standalone: 'js'`` in render tag) ### MonologBundle diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php index 6738eb3e4a..bf3a414640 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/Configuration.php @@ -211,6 +211,7 @@ class Configuration implements ConfigurationInterface ->children() ->scalarNode('assets_version')->defaultValue(null)->end() ->scalarNode('assets_version_format')->defaultValue('%%s?%%s')->end() + ->scalarNode('hinclude_default_template')->defaultNull()->end() ->arrayNode('form') ->addDefaultsIfNotSet() ->fixXmlConfig('resource') diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php index 0d943bfe8a..f8c499b205 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php @@ -335,6 +335,7 @@ class FrameworkExtension extends Extension $container->setParameter('templating.helper.code.file_link_format', isset($links[$ide]) ? $links[$ide] : $ide); $container->setParameter('templating.helper.form.resources', $config['form']['resources']); + $container->setParameter('templating.hinclude.default_template', $config['hinclude_default_template']); if ($container->getParameter('kernel.debug')) { $loader->load('templating_debug.xml'); diff --git a/src/Symfony/Bundle/FrameworkBundle/HttpKernel.php b/src/Symfony/Bundle/FrameworkBundle/HttpKernel.php index 0ab5634e81..613203dce5 100644 --- a/src/Symfony/Bundle/FrameworkBundle/HttpKernel.php +++ b/src/Symfony/Bundle/FrameworkBundle/HttpKernel.php @@ -114,7 +114,7 @@ class HttpKernel extends BaseHttpKernel $this->esiSupport = $this->container->has('esi') && $this->container->get('esi')->hasSurrogateEsiCapability($this->container->get('request')); } - if ($this->esiSupport && $options['standalone']) { + if ($this->esiSupport && (true === $options['standalone'] || 'esi' === $options['standalone'])) { $uri = $this->generateInternalUri($controller, $options['attributes'], $options['query']); $alt = ''; @@ -125,6 +125,17 @@ class HttpKernel extends BaseHttpKernel return $this->container->get('esi')->renderIncludeTag($uri, $alt, $options['ignore_errors'], $options['comment']); } + if ('js' === $options['standalone']) { + $uri = $this->generateInternalUri($controller, $options['attributes'], $options['query'], false); + $defaultContent = null; + + if ($template = $this->container->getParameter('templating.hinclude.default_template')) { + $defaultContent = $this->container->get('templating')->render($template); + } + + return $this->renderHIncludeTag($uri, $defaultContent); + } + $request = $this->container->get('request'); // controller or URI? @@ -185,14 +196,14 @@ class HttpKernel extends BaseHttpKernel * * @return string An internal URI */ - public function generateInternalUri($controller, array $attributes = array(), array $query = array()) + public function generateInternalUri($controller, array $attributes = array(), array $query = array(), $secure = true) { if (0 === strpos($controller, '/')) { return $controller; } $path = http_build_query($attributes); - $uri = $this->container->get('router')->generate('_internal', array( + $uri = $this->container->get('router')->generate($secure ? '_internal' : '_internal_public', array( 'controller' => $controller, 'path' => $path ?: 'none', '_format' => $this->container->get('request')->getRequestFormat(), @@ -204,4 +215,14 @@ class HttpKernel extends BaseHttpKernel return $uri; } + + /** + * Renders an HInclude tag. + * + * @param string $uri A URI + */ + public function renderHIncludeTag($uri, $defaultContent = null) + { + return sprintf('%s', $uri, $defaultContent); + } } diff --git a/src/Symfony/Bundle/FrameworkBundle/Resources/config/routing/internal.xml b/src/Symfony/Bundle/FrameworkBundle/Resources/config/routing/internal.xml index 60c7c1c995..46df17f7fe 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Resources/config/routing/internal.xml +++ b/src/Symfony/Bundle/FrameworkBundle/Resources/config/routing/internal.xml @@ -4,7 +4,13 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/routing http://symfony.com/schema/routing/routing-1.0.xsd"> - + + FrameworkBundle:Internal:index + .+ + [^.]+ + + + FrameworkBundle:Internal:index .+ [^.]+