CObject ViewHelper <f:cObject>
Changed in version 14.2
Instead of using the
<f: ViewHelper to render database records,
the new Render.record ViewHelper <f:render.record>
ViewHelper can be used to render database records and the new
Render.contentArea ViewHelper <f:render.contentArea>
can be used to render all content elements within a column from a backend
layout.
ViewHelper to render CObjects (objects containing rendering definitions for records/elements), using the global TypoScript configuration.
Note: You have to ensure proper escaping (htmlspecialchars/intval/etc.) on your own!
Go to the source code of this ViewHelper: CObjectViewHelper.php (GitHub).
Table of contents
Arguments
currentValueKey
-
- Type
- string
currentValueKey
data
-
- Type
- mixed
the data to be used for rendering the cObject. Can be an object, array or string. If this argument is not set, child nodes will be used
table
-
- Type
- string
- Default
- ''
the table name associated with "data" argument. Typically tt_content or one of your custom tables. This argument should be set if rendering a FILES cObject where file references are used, or if the data argument is a database record.
typoscriptObjectPath
-
- Type
- string
- Required
- 1
the TypoScript setup path of the TypoScript object to render
Examples for the CObject ViewHelper <f:cObject>
The cObject ViewHelper can be used to render any TypoScript content object, for example on stored in the lib top-level object:
<f:cObject typoscriptObjectPath="lib.someLibObject" />
The TypoScript could look like this:
lib.someLibObject = TEXT
lib.someLibObject.value = Hello World!
Use data from a plugin in TypoScript
By using the data property you can forward data provided by the controller
to the TypoScript object doing the actual rendering:
<f:cObject
typoscriptObjectPath="lib.customHeader"
data="{myplugin.article}"
currentValueKey="title"
/>
The same can also be done in the inline notation.
{article -> f:cObject(typoscriptObjectPath: 'lib.customHeader', currentValueKey: 'title')}
The TypoScript could for example look like this:
lib.customHeader = COA
lib.customHeader {
10 = TEXT
10.field = author
20 = TEXT
20.current = 1
}
When passing an object with {data}, the properties of the object are
accessible with
.field in TypoScript. If only a single value is
passed or the current is specified,
.current = 1
can be used in the TypoScript.
Use data from a TypoScript ContentObject
As an example of a more advanced use case, the cObject viewhelper can pass content data from a Fluid template to a content object defined in TypoScript. The following example demonstrates this with a user counter. The user counter is in a blog post (the blog post has a count of how many times it has been viewed.)
Add the Viewhelper to your Fluid template. This can be done in 3 different ways. The basic tag syntax:
<f:cObject typoscriptObjectPath="lib.myCounter">{post.viewCount}</f:cObject>
Or a self-closing tag. Data is passed in the
data attribute.
<f:cObject typoscriptObjectPath="lib.myCounter" data="{post.viewCount}" />
Or inline notation, which is easy to read and understand (from left to right):
{post.viewCount -> f:cObject(typoscriptObjectPath: 'lib.myCounter')}
Then, add TypoScript (to your TypoScript template) to process this data. In our
example below, the
std attribute
current
works like a switch: if set to 1, it contains the value that was passed to the
TypoScript object from the Fluid template:
lib.myCounter = TEXT
lib.myCounter {
current = 1
wrap = <strong>|</strong>
}
This TypoScript snippet outputs the current number of visits in bold.
We can easily modify this TypoScript to output the user counter as an image instead of text:
lib.myCounter = IMAGE
lib.myCounter {
file = GIFBUILDER
file {
10 = TEXT
10.text.current = 1
}
}
Passing objects to TypoScript
Up till now, we have only been passing a single value to the TypoScript object.
However, it is also possible to pass multiple values, useful for selecting which value to
use or concatenating values, or you can pass objects (here the post object):
{post -> f:cObject(typoscriptObjectPath: 'lib.myCounter')}
But how do we access the object's properties in our TypoScript? By setting the
field property of
std (in a
COA):
lib.myCounter = COA
lib.myCounter {
10 = TEXT
10.field = title
20 = TEXT
20.field = viewCount
wrap = (<strong>|</strong>)
}
This TypoScript snippet outputs the title of the blog and the number of page visits in parentheses.
Using current to pass values
It is also possible to use the
current switch here.
If you set the property
current
in the cObject ViewHelper, the value will be available in
the TypoScript template as
current. That is especially useful
when you want to emphasize that the value is very
important for the TypoScript template. For example, the
number of visits is significant in our view
counter:
{post -> f:cObject(typoscriptObjectPath: 'lib.myCounter', currentValueKey: 'viewCount')}
Then, in the TypoScript template, use
field aswell as
current to output the value of the view count. The following
TypoScript snippet outputs the same information as above:
lib.myCounter = COA
lib.myCounter {
10 = TEXT
10.field = title
20 = TEXT
20.current = 1
wrap = (<strong>|</strong>)
}
Using
current makes the TypoScript easier to read and the logic
easier to understand.
In summary, the cObject ViewHelper is a powerful option to embed TypoScript expressions in Fluid templates.
Migration from the f:cObject to dedicated ViewHelpers for special cases
Migration: Use the f:render.contentArea ViewHelper
Changed in version 14.2
Instead of using the
<f: ViewHelper, the new
Render.contentArea ViewHelper <f:render.contentArea>
can be used to render all content elements within a column from a backend
layout.
If you are using the page-content data processor to display the content elements of a PAGEVIEW, switch to the Render.contentArea ViewHelper <f:render.contentArea> on dropping TYPO3 v13 support:
- <f:for each="{myContent.left.records}" as="contentElement">
- <f:cObject
- typoscriptObjectPath="{contentElement.mainType}"
- table="{contentElement.mainType}"
- data="{contentElement}"
- />
- </f:for>
+ <f:render.contentArea contentArea="{myContent.left}" />
Variable {content already contains the correct TypoScript path
to the TypoScript top-level object tt_content.
The table storing the content elements is also called tt_, so we can use
the same variable here. Variable content will already contain the
Record object
containing the data needed to render the content element with the
CObject ViewHelper.