Feature: #104974 - Content area related information in the frontend
See forge#104974
Description
With Feature: #103504 - New ContentObject PAGEVIEW the new
PAGEVIEW cObject
has been introduced for the Frontend Rendering. It's a powerful alternative
to the
FLUIDTEMPLATE cObjct and allows to render a full page
with less configuration.
The
PAGEVIEW has now been further extended and does also
provide all content elements, related to the page, grouped by their
corresponding columns as defined in the page layout. The elements
are provided as fully resolved
Record objects (see Feature: #103783 - RecordTransformation Data Processor
and Feature: #103581 - Automatically transform TCA field values for record objects).
The elements are attached to the new
Content object, which beside
the elements itself also contains all the column related information and
configuration. This is quite useful for the frontend rendering, because it
might be important for an element to know in which context it should be
rendered. With this information, an element can e.g. decide to not render
the
Header partial if it is included in the sidebar content area.
The
Content objects are added to the view using either the variable
name defined via
content or falls back to
content. The
content elements can then be accessed via the
records property.
The
Content's' contain all the backend layout related configuration,
such as the content restrictions, which
allows further validation, e.g. if the given content types are actually valid.
{content. can therefore be used to get all content elements
from the
main content area.
main is the identifier, as
defined in the page layout and
content is the default variable name.
Important
The
Content objects are attached in the
Content
which implements the PSR-11
Container to allow access to
the areas via
get. To optimize performance, the
Content
objects itself are instantiated only when accessed (lazy loading).
By accessing the
Content with
{content. the following
information is available (as defined in the page layout):
identifier- The column identifiercol- The definedPos colPos name- The (speaking)name, which might be a locallang keyallowed- The definedContent Types allowedContent Types disallowed- The definedContent Types disallowedContent Types slide- The definedMode Content, defaults toSlide Mode ContentSlide Mode:: None configuration- The whole content area related configurationrecords- The content elements asRecordobjects
The following example is enough to render content elements of a page with a single column:
mod.web_layout.BackendLayouts {
default {
title = Default
config {
backend_layout {
colCount = 1
rowCount = 1
rows {
1 {
columns {
1 {
name = Main Content Area
colPos = 0
identifier = main
}
}
}
}
}
}
}
}
page = PAGE
page.10 = PAGEVIEW
page.10.paths.10 = EXT:my_site_package/Resources/Private/Templates/
<f:for each="{content.main.records}" as="record">
<f:render partial="ContentElement" arguments="{record: record, area: content.main}">
</f:for>
Introducing
Content also improves the
After - used to manipulate the resolved
content elements of each area - by having additional context at hand.
Impact
It's now possible to access all content elements of a page, grouped by their corresponding column, while having the column related information and configuration at hand. Next to less configuration effort, different renderings for the same element, depending on the context, are easily possible.
Example
A content element template using the
Default layout and rendering
the
Header partial only in case it has not been added to the
sidebar column.
<f:layout name="Default" />
<f:section name="Main">
<f:if condition="{area.identifier} != 'sidebar'">
<f:render partial="Header" arguments="{_all} />
</f:if>
<p>{record.text}</p>
<f:image image="{record.image}" width="{area.configuration.imageWidth}" />
</f:section>