How to Embed Asynchronous Content with hinclude.js
Warning: You are browsing the documentation for Symfony 4.x, which is no longer maintained.
Read the updated version of this page for Symfony 7.2 (the current stable version).
Embedding controllers in templates is one of the ways to reuse contents across multiple templates. To further improve performance you can use the hinclude.js JavaScript library to embed controllers asynchronously.
First, include the hinclude.js library in your page linking to it from the template or adding it to your application JavaScript using Webpack Encore.
As the embedded content comes from another page (or controller for that matter),
Symfony uses a version of the standard render()
function to configure
hinclude
tags in templates:
1 2
{{ render_hinclude(controller('...')) }}
{{ render_hinclude(url('...')) }}
Note
When using the controller()
function, you must also configure the
fragments path option.
When JavaScript is disabled or it takes a long time to load you can display a default content rendering some template:
1 2 3 4 5
# config/packages/framework.yaml
framework:
# ...
fragments:
hinclude_default_template: hinclude.html.twig
4.3
The framework.fragments.hinclude_default_template
option was introduced
in Symfony 4.3. In previous Symfony versions it was called
framework.templating.hinclude_default_template
.
You can define default templates per render()
function (which will override
any global default template that is defined):
1 2 3
{{ render_hinclude(controller('...'), {
default: 'default/content.html.twig'
}) }}
Or you can also specify a string to display as the default content:
1
{{ render_hinclude(controller('...'), {default: 'Loading...'}) }}
Use the attributes
option to define the value of hinclude.js options:
1 2 3 4 5 6 7
{# by default, cross-site requests don't use credentials such as cookies, authorization
headers or TLS client certificates; set this option to 'true' to use them #}
{{ render_hinclude(controller('...'), {attributes: {'data-with-credentials': 'true'}}) }}
{# by default, the JavaScript code included in the loaded contents is not run;
set this option to 'true' to run that JavaScript code #}
{{ render_hinclude(controller('...'), {attributes: {evaljs: 'true'}}) }}