Message-ID: <1659100191.3186.1485852320569.JavaMail.confluence@ip-10-127-227-164> Subject: Exported From Confluence MIME-Version: 1.0 Content-Type: multipart/related; boundary="----=_Part_3185_1914995951.1485852320569" ------=_Part_3185_1914995951.1485852320569 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Content-Location: file:///C:/exported.html Content view

Content view

REWRI= TE

=20 =20

The ViewController

eZ Platform comes with a native controller to display your content, know= n as the ViewController. It is called each ti= me you try to reach a Content item from its Url Alias (hum= an readable, translatable URI generated for any content based on = URL patterns defined per Content Type) and is able to render any content pr= eviously edited in the admin interface or via the PHP API Tutorials.

It can also be called straight by its direct URI : /content/view/&= lt;contentId>/<languageCode>

A Content item can also have different view types (full= page, abstract in a list, block in a landing page, etc.). By default the v= iew type is full (for full page), but it can be anything (= line, block, etc.).

Important note regarding visibility

The Location visibility flag, which you can change by hiding/revealing i= n the Platform UI, is not permission-based and thus acts as a simple potent= ial filter. It is not meant to restrict access to content.=

If you need to restrict access to a given Content item, use Sect= ions or Object states, which are permission-based= .

 

View selection

To display a Content item, the ViewController uses a view manager which = selects the appropriate template depending on matching rules.

For more information about the=20 view provider configuration, please=20 refer to the dedic= ated page.

Content view templates

A content view template is like any other template, with several specifi= c aspects.

Available variables

Variable name Type Description
location eZ\Publish\Core\Repository\Values\Conte= nt\Location The Location object. Contains meta information o= n the content (ContentInfo)
(only when accessing a Locati= on) 
content eZ\Publish\Core\Repository\= Values\Content\Content The Content item, containing all F= ields and version information (VersionInfo)
noLayout Boolean If true, indicates if the Content = item/Location is to be displayed without any pagelayout (i.e. AJAX, sub-req= uests, etc.).
It's generally false when displaying a Conten= t item in view type full.
viewBaseLayout String The base layout template to use wh= en the view is requested to be generated outside of the pagelayout (when noLayout is true).

Template inherita= nce and sub-requests

Like any template, a content view template can use template inheritance. Ho= wever keep in mind that your content may be also requested via sub= -requests (see below how to render embedded content objects), in which = case you probably don't want the global layout to be used.

If you use different templates for embedded content views, this should n= ot be a problem. If you'd rather use the same template, you can use an extr= a noLayout view parameter for the sub-request, and condit= ionally extend an empty pagelayout:

=20
{% extends noLayout ? viewbaseLayout : "AcmeDemoBundle::pagelayout.=
html.twig" %}

{% block content %}
...
{% endblock %}
=20

Rendering Content item's Fields

As stated above, a view template receives the requested Content item, ho= lding all Fields.

In order to display the Fields' value the way you want, you can either m= anipulate the Field Value object itself, or use a custom template.

Getting raw Field value

Having access to the Content item in the template, you can use its public methods to access all the information you need. You = can also use the ez_field_= value helper to get the F= ield value. It will return the correct language if there are several, b= ased on language priorities.

=20
{# With the following, myFieldValue will be in the content's main l=
anguage, regardless of the current language #}
{% set myFieldValue =3D content.getFieldValue( 'some_field_identifier' ) %}
 
{# Here myTranslatedFieldValue will be in the current language if a transla=
tion is available. If not, the content's main language will be used #}
{% set myTranslatedFieldValue =3D ez_field_value( content, 'some_field_iden=
tifier' ) %}
=20

Using the Field Typ= e's template block

All built-in Field Types come with their= own Twig template. You can render any Field using this default te= mplate using the ez_render_field() helper.

=20
{{ ez_render_field( content, 'some_field_identifier' ) }}
=20

Refer to ez_render_fi= eld() reference page for further information.

As this makes use of reusable templates, using ez_render_f= ield() is the recommended way and is to be considered the best pract= ice.

Rendering Content name

The name of a Content item is its generic "title", gene= rated by the repository based on the Content Type's naming pattern. It ofte= n takes the form of a normalized value of the first field, but might be a c= oncatenation of several fields. There are 2 different ways to access t= o this special property:

Translated name

The translated name is held in a VersionI= nfo object, in the names property which consists of hash indexe= d by locale. You can easily retrieve it in the right language via the = TranslationHelper service.

=20
<h2>Translated content name: {{ ez_content_name( content=
 ) }}</h2>
<h3>Also works from ContentInfo : {{ ez_content_name( content.content=
Info ) }}</h3>
=20

The helper will by default follow the prioritized languages order. = If there is no translation for your prioritized languages, the helper will = always return the name in the main language.

You can also force a locale in a second argum= ent:

=20
{# Force fre-FR locale. #}
<h2>{{ ez_content_name( content, 'fre-FR' ) }}</h2>
=20

You can refer to ez_co= ntent_name() reference page for further information.

Name property in ContentIn= fo

This property is the actual content name, but in main language o= nly (so it is not translated).

=20
<h2>Content name: {{ content.contentInfo.name }}</h2&=
gt;
=20
=20
$contentName =3D $content->contentInfo->name;
=20

Exposing additional variables

It is possible to expose additional variables in a content view template= . See parameters injection in content views or using your own custom controller to render a content item/location.

Making links to other lo= cations

Linking to other locations is fairly easy and is done with a native path() Twig helper= (or url() if you want to generate absolute URLs). You jus= t have to pass it the Location object and path() will generate= the URLAlias for you.

=20
{# Assuming "location" variable is a valid eZ\Publish\API\Repositor=
y\Values\Content\Location object #}
<a href=3D"{{ path( location ) }}">Some link to a location</a><=
/pre>=20

If you don't have the Location object, but only its ID, you can generate= the URLAlias the following way:

=20
<a href=3D"{{ path( "ez_urlalias", {"locationId": 123} ) }}">=
Some link to a location, with its Id only</a>
=20

You can also use the Content ID. In that case the generated link will po= int to the Content item's main Location.

=20
<a href=3D"{{ path( "ez_urlalias", {"contentId": 456} ) }}">S=
ome link from a contentId</a>
=20

Under the hood

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

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

See also: Cross-site= access links

Render embedded content= objects

Rendering an embedded content from a Twig template is pretty straight fo= rward as you just need to do a subrequest with ez_content controller.

Using ez_conten= t controller

This controller is exactly the same as the ViewController presented above. It has one main = ;viewAction, that renders a Content item.

You can use this controller from templates with the following syntax:

=20
{{ render( controller( "ez_content:viewAction", {"contentId": 123, =
"viewType": "line"} ) ) }}
=20

 

The example above renders the Content whose ID is 123, = with the view type line.

Reference of ez_content controller follows the syntax of controllers as a service, = as explained in Symfony documentation.

Available arguments

As with any controller, you can pass arguments to ez_content:viewL= ocation or ez_content:viewContent to fit your needs.

Name Description Type Default value
contentId

ID of the Content item you want to render.Only for ez_content:viewContent 

integer N/A
locationId ID of the Location you want to render.
Only for ez_content:viewLocation 
integer Content item's main location, if d= efined
viewType

The view type you want to rende= r your Content item/Location in.
Will be used by the ViewManager to sele= ct a corresponding template, according to defined rules. 

Exampl= e: full, line, my_custom_view, etc.

string full
layout

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

 

boolean false
params

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

=20
{{ render(
      controller( 
          "ez_content:viewAction", 
          {
              "contentId": 123,
              "viewType": "line",
              "params": { "some_variable": "some_value" }
          }
      )
) }}
=20
hash empty hash

Render block

You can specify which controller will be called for a specific block vie= w match, much like defining custom controllers for location view or content= view match.

Also, since there are two possible actions with which one can view a blo= ck: ez_page:viewBlock and ez_page:viewBlockById, = it is possible to specify a controller action with a signature matching eit= her one of the original actions.

Example of configuration in app/config/ezplatform.yml:

=20
ezpublish:
    system:
        eng_frontend_group:
            block_view:
                ContentGrid:
                    template: NetgenSiteBundle:block:content_grid.html.twig
                    controller: NetgenSiteBundle:Block:viewContentGridBlock
                    match:
                        Type: ContentGrid
=20

ESI

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

Using ESI
=20
{{ render_esi( controller( "ez_content:viewAction", {"contentId": 1=
23, "viewType": "line"} ) ) }}
=20

Only scalable variables can be sent via render_esi (not object)

 

Asynchronous rendering

Symfony also supports asynchronous content rendering with the help of&nb= sp;hinclude.js library.

Asynchronous rendering
=20
{{ render_hinclude( controller( "ez_content:viewAction", {"contentI=
d": 123, "viewType": "line"} ) ) }}
=20

Only scalable variables can be sent via render_hinclude (not object)

Display a default text

If you want to display a default text while a controller is loaded async= hronously, you have to pass a second parameter to your render_hinclude twig= function.

Display a default text during asynchronous loading of a controller
=20
{{ render_hinclude( controller( 'EzCorporateDesignBundle:Header:use=
rLinks' ), { 'default': "<div style=3D'color:red'>loading</div>=
" }) }}
=20

See also: How to use a custom controller to displ= ay a content item or location

 

hinclude.js needs to be properly included in your layout = to work.

Please refer to Symfony documentation for all available options.

 

Related topics:
------=_Part_3185_1914995951.1485852320569--