eZ Publish comes with a native controller to display your content, known as the ViewController
. It is called each time you try to reach a content from its Url Alias (good looking URI generated for any content) and is able to render any content previously edited in the admin interface or via the eZ Publish Public API.
It can also be called directly by its direct URI : /content/location/<locationId>
A content can also have different view types (full page, abstract in a list, block in a landing page...). By default the view type is full (for full page), but it can be anything (line, block...).
Location visibility flag, which you can change with hide/unhide in admin, is not permission based and thus acts as a simple potential filter. It is not meant to restrict access to content. If you need to restrict access to a given content, use Sections or Object states, which are permission based. |
To display a content, the ViewController uses a view manager which selects the appropriate template depending on matching rules.
For more information about the view provider configuration, please refer to the dedicated page. |
A content view template is like any other template, with several specific aspects.
Variable name | Type | Description |
---|---|---|
location | eZ\Publish\Core\Repository\Values\Content\Location | The location object. Contains meta information on the content (ContentInfo) (only when accessing a location) |
content | eZ\Publish\Core\Repository\Values\Content\Content | The content object, containing all fields and version information (VersionInfo) |
noLayout | Boolean | If true, indicates if the content/location is to be displayed without any pagelayout (i.e. AJAX, sub-requests...). It's generally false when displaying a content in view type full. |
viewBaseLayout | String | The base layout template to use when the view is requested to be generated outside of the pagelayout (when noLayout is true). |
Template inheritance
Like any template, a content view template can use template inheritance. However keep in mind that your content can be also requested via sub-requests (see below how to render embedded content objects). In this case your template should probably not extend your main layout.
In this regard, it is recommended to use inheritance this way:
{% extends noLayout ? viewbaseLayout : "AcmeDemoBundle::pagelayout.html.twig" %} {% block content %} ... {% endblock %} |
Exposing additional variables
It is possible to expose additional variables in a content view template. See parameters injection in content views.
Linking to other locations is fairly easy and is done with native path()
Twig helper (or url()
if you want to generate absolute URLs). You just have to pass it the Location object and path()
will generate the URLAlias for you.
{# Assuming "location" variable is a valid eZ\Publish\API\Repository\Values\Content\Location object #} <a href="{{ path( location ) }}">Some link to a location</a> |
If you don't have the Location object, but only its ID, you can generate the URLAlias the following way:
<a href="{{ path( "ez_urlalias", {"locationId": 123} ) }}">Some link to a location, with its Id only</a> |
In the backend, This makes also easy to generate links from PHP, via the |
Rendering an embedded content from a Twig template is pretty straight forward as you just need to do a subrequest with ez_content
controller.
ez_content
controllerThis controller is exactly the same as the ViewController presented above and has 2 main actions:
viewLocation
to render a location (same as when accessing a content through an URLAlias)viewContent
to render a contentYou can use this controller from templates with the following syntax:
{{ render( controller( "ez_content:viewLocation", {"locationId": 123, "viewType": "line"} ) ) }} |
The example above allows you to render a Location which ID is 123, with the view type line.
Reference of |
As any controller, you can pass arguments to ez_content:viewLocation
or ez_content:viewContent
to fit your needs.
Name | Description | Type | Default value | ||
---|---|---|---|---|---|
locationId | Id of the location you want to render. Only for ez_content:viewLocation | integer | N/A | ||
contentId | Id of the content you want to render. | integer | N/A | ||
viewType | The view type you want to render your content/location in. Example: full, line, my_custom_view, ... | string | full | ||
layout | Indicates if the sub-view needs to use the main layout (see available variables in a view template)
| boolean | false | ||
params | Hash of variables you want to inject to sub-template, key being the exposed variable name.
| hash | empty hash |
ESI
Just as for regular Symfony controllers, you can take advantage of ESI and use different cache levels:
{{ render_esi( controller( "ez_content:viewLocation", {"locationId": 123, "viewMode": "line"} ) ) }} |
Asynchronous rendering
Symfony also supports asynchronous content rendering with the help of hinclude.js library.
{{ render_hinclude( controller( "ez_content:viewLocation", {"locationId": 123, "viewMode": "line"} ) ) }} |
hinclude.js needs to be properly included in your layout to work. Please refer to Symfony documentation for all available options. |