Navigation
eZ Documentation Center
 

This is outdated documentation made for eZ Publish Platform 5.1. It is being moved into the eZ Publish 5.x documentation, so please go there for most up-to-date documentation.

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 5.3

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
titleImportant note regarding visibility

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 nameTypeDescription
locationeZ\Publish\Core\Repository\Values\Content\LocationThe location object. Contains meta information on the content (ContentInfo)
(only when accessing a location) 
contenteZ\Publish\Core\Repository\Values\Content\ContentThe content object, containing all fields and version information (VersionInfo)
noLayoutBooleanIf 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
viewBaseLayoutStringThe 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
languagexml
{# 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
languagexml
<a href="{{ path( "ez_urlalias", {"locationId": 123} ) }}">Some link to a location, with its Id only</a>
Info
titleUnder the hood

In the backend, path() uses the Router to generate links.

This makes also easy to generate links from PHP, via the router service.

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
titleeZ Publish 5.1+ / Symfony 2.2+
{{ 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 ez_content controller follow the syntax of controllers as a service, as explained in Symfony documentation.

Available arguments

As any controller, you can pass arguments to ez_content:viewLocation or ez_content:viewContent to fit your needs.

NameDescriptionTypeDefault value
locationIdId of the location you want to render.
Only for ez_content:viewLocation 
integerN/A
contentId

Id of the content you want to render.
Only for ez_content:viewContent 

integerN/A
viewType

The view type you want to render your content/location in.
Will be used by the ViewManager to select corresponding template, according to defined rules. 

Example: full, line, my_custom_view, ...

stringfull
layout

Indicates if the sub-view needs to use the main layout (see available variables in a view template)

 

booleanfalse
params

Hash of variables you want to inject to sub-template, key being the exposed variable name.

Info

Available as of eZ Publish 5.1

Code Block
{{ render(
      controller( 
          "ez_content:viewLocation", 
          {
              "locationId": 123,
              "viewType": "line",
              "params": { "some_variable": "some_value" }
          }
      )
) }}
hashempty hash

 

ESI

Just as for regular Symfony controllers, you can take advantage of ESI and use different cache levels:

Code Block
titleUsing ESI (eZ Publish 5.1+ / Symfony 2.2+)
{{ 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
titleAsynchronous rendering (eZ Publish 5.1+ / Symfony 2.2+)
{{ 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.