eZ Documentation Center

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

Versions Compared


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

Table of Contents

The configured ViewProvider allows to configure template selection when using the ViewController, either directly form a URL or via a sub-request.

titleeZ Publish 4.x terminology

In eZ Publish 4.x, it was known as template override system by configuration (override.ini).
However this only reflects old overrides for node/view/*.tpl and content/view/*.tpl.


The configured ViewProvider takes its configuration from your siteaccess in the location_view/content_view section (most of the time you want to match a location, so we'll focus on location_view configuration). This configuration is a hash built in the following way:

Code Block
# ezpublish/config/ezpublish.yml
        # Can be a valid siteaccess, siteaccess group or even "global"
            # Configuring the LocationViewProvider
                # The view type (full/line are standard, but you can use custom ones)
                    # A simple unique key for your matching ruleset
                        # The template identifier to load, following the Symfony bundle notation for templates
                        # See
                        template: eZDemoBundle:full:small_folder.html.twig
                        # Hash of matchers to use, with their corresponding values to match against
                            # Key is the matcher "identifier" (class name or service identifier)
                            # Value will be passed to the matcher's setMatchingConfig() method.
                            Identifier\ContentType: [small_folder, folder]
titleImportant note about template matching

Template matching will NOT work if your content contains a field type that is not supported by the repository. It can be the case when you are in the process of a migration from eZ Publish 4.x, where custom datatypes have been developed.
In this case the repository will throw an exception which is caught in the ViewController, causing the fallback to the legacy kernel.

The list of field types supported out of the box is available here.


You can define your template selection rules in a different configuration file. Read the cookbook recipe to learn more about it.

You can also use your own custom controller to render a content/location.



To be able to select the right templates against conditions, the view provider uses matcher objects, all implementing eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher interface.

Matcher identifier

The matcher identifier can comply to 3 different formats:

  1. Relative qualified class name (e.g. Identifier\ContentType). This is the most common case and used for native matchers. It will then be relative to eZ\Publish\Core\MVC\Symfony\View\ContentViewProvider\Configured\Matcher.
  2. Full qualified class name (e.g. \Foo\Bar\MyMatcher). This is a way to specify a custom matcher that doesn't need specific dependency injection. Please note that it must start with a \.
  3. Service identifier, as defined in Symfony service container. This is the way to specify a more complex custom matcher that has dependencies.
titleInjecting the Repository

If your matcher needs the repository, simply make it implement eZ\Publish\Core\MVC\RepositoryAwareInterface or simply extend eZ\Publish\Core\MVC\RepositoryAware abstract class. The repository will then be correctly injected before matching.

Matcher value

The value associated to the matcher is being passed to its setMatchingConfig() method and can be anything supported by the matcher.

In the case of native matchers, they support both scalar values or arrays of scalar values.
Passing an array amounts to applying a logical OR.

Combining matchers

It is possible to combine matchers to add additional constraints for matching a template:

Code Block
# ...
    Identifier\ContentType: [small_folder, folder]
    Identifier\ParentContentType: frontpage

The example above results to say "Match any content which ContentType identifier is small_folder OR folder, AND having frontpage as ParentContentType identifier".

Available matchers

The following table presents all native matchers.

Id\ContentMatches the ID number of the content
Id\ContentTypeMatches the ID number of the content type whose content is an instance of
Id\ContentTypeGroupMatches the ID number of the group of the content type whose content is an instance of belongs to
Id\LocationMatches the ID number of a location.
In the case of a Content, matched against the main location.
Id\ParentContentTypeMatches the ID number of the parent content type.
In the case of a Content, matched against the main location.

Matches the ID number of the parent location.
In the case of a Content, matched against the main location.

Id\RemoteMatches the remoteId of either content or location, depending on the object matched.
Id\SectionMatches the ID number of the section whose content belongs to
Id\StateNot supported yet.
Identifier\ContentTypeMatches the identifier of the content type whose content is an instance of

Matches the identifier of the parent content type.
In the case of a Content, matched against the main location. 

Identifier\SectionMatches the identifier of the section whose content belongs to
Identifier\StateNot supported yet.
DepthMatches the depth of the location. The depth of a top level location is 1.

Matches the virtual URL of the location (i.e. /My/Content-Uri).

Important: Matches when the UrlAlias of the location starts with the value passed.
Not supported for Content (aka content_view).