Table of Contents |
---|
The ViewController
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...).
Warning | ||
---|---|---|
| ||
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. |
View selection
To display a content, the ViewController uses a view manager which selects the appropriate template depending on matching rules.
Info |
---|
For more information about the view provider configuration, please refer to the dedicated page. |
Content view template
A content view template is like any other template, with several specific aspects.
Available variables
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:
Code Block |
---|
{% 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.
Making links to other locations
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.
Code Block | ||
---|---|---|
| ||
{# 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:
Code Block | ||
---|---|---|
| ||
<a href="{{ path( "ez_urlalias", {"locationId": 123} ) }}">Some link to a location, with its Id only</a> |
Info | ||
---|---|---|
| ||
In the backend, This makes also easy to generate links from PHP, via the |
Render embedded content objects
Rendering an embedded content from a Twig template is pretty straight forward as you just need to do a subrequest with ez_content
controller.
Using ez_content
controller
This 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 content
You can use this controller from templates with the following syntax:
Code Block | ||
---|---|---|
| ||
{{ 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.
Info |
---|
Reference of |
Available arguments
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:
Code Block | ||
---|---|---|
| ||
{{ 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.
Code Block | ||
---|---|---|
| ||
{{ render_hinclude( controller( "ez_content:viewLocation", {"locationId": 123, "viewMode": "line"} ) ) }} |
Info |
---|
hinclude.js needs to be properly included in your layout to work. Please refer to Symfony documentation for all available options. |