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
.+
[^.]+