Render content elements

If news is configured to use relations to content elements, those are shown by default in the detail view.

There are two options how to render those elements

Using TypoScript

This is the default way in EXT:news. A basic TypoScript configuration is used to render those. This look like this:

lib.tx_news.contentElementRendering = RECORDS
lib.tx_news.contentElementRendering {
    tables = tt_content
    source.current = 1
    dontCheckPid = 1
}
Copied!

If you need to extend this, the best way is to introduce your own TypoScript which can be saved anywhere. This needs then to be referenced in the template.

<f:if condition="{newsItem.contentElements}">
    <f:cObject typoscriptObjectPath="lib.yourownTypoScript">{newsItem.contentElements}</f:cObject>
</f:if>
Copied!

Using TypoScript with nested content from b13/container

If nested content should be rendered as news content elements with b13/container the lib.tx_news.contentElementRendering should be adapted.

With the default lib.tx_news.contentElementRendering using the RECORDS CObject (see Using TypoScript) all content elements are fetched from the database and nested child content in containers is rendered twice. One time as standalone element and a second time in the container column.

To fix this the following lib can be used to fetch the content which will exclude all child content in containers:

lib.tx_news.contentElementRendering = CONTENT
lib.tx_news.contentElementRendering {
    table = tt_content
    select {
        pidInList = 0
        uidInList.current = 1
        where = {#tx_container_parent}<1
        orderBy = sorting
        languageField = sys_language_uid
    }
}
Copied!

Changing lib.tx_news.contentElementRendering = RECORDS to lib.tx_news.contentElementRendering = CONTENT can have some side effects for the sorting of translated content elements. You can also fix this by using Fluid only:

<f:if condition="{newsItem.contentElements}">
    <!-- content elements -->
    <f:cObject typoscriptObjectPath="lib.tx_news.contentElementRendering">{newsItem.nonNestedContentElementIdList}</f:cObject>
</f:if>
Copied!

Using Fluid

You can also use Fluid render the content elements. As an example:

<f:if condition="{newsItem.contentElements}">
    <f:for each="{newsItem.contentElements}" as="element">
        <h3>{element.title}</h3>
        <f:if condition="{element.CType} == 'text'">
        {element.bodytext -> f:format.html()}
        </f:if>
    </f:for>
</f:if>
Copied!