TYPO3 v15 dev-main snapshot ()
This commit is contained in:
@@ -0,0 +1,6 @@
|
||||
<div class="t3-page-ce-actions t3js-page-new-ce">
|
||||
<typo3-backend-new-content-element-wizard-button class="btn btn-default btn-sm" url="{url}" subject="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_layout.xlf:newContentElement')}">
|
||||
<core:icon identifier="actions-plus" />
|
||||
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_layout.xlf:createNewContent" />
|
||||
</typo3-backend-new-content-element-wizard-button>
|
||||
</div>
|
||||
@@ -0,0 +1,20 @@
|
||||
<div class="t3-grid-container{f:if(condition: grid.context.backendLayout.identifierCleaned, then: ' t3-grid-container-{grid.context.backendLayout.identifierCleaned}')}">
|
||||
<div class="t3-grid-container-inner">
|
||||
<table class="t3-page-columns t3-grid-table t3js-page-columns">
|
||||
<f:if condition="{gridColumns}">
|
||||
<colgroup>
|
||||
<f:for each="{gridColumns}" as="tmpColumn">
|
||||
<col span="1" style="width: calc(100% / {gridColumns -> f:count()})">
|
||||
</f:for>
|
||||
</colgroup>
|
||||
</f:if>
|
||||
<f:for each="{grid.rows}" as="row">
|
||||
<tr>
|
||||
<f:for each="{row.columns}" as="column">
|
||||
<f:render partial="PageLayout/Grid/Column" arguments="{_all}" />
|
||||
</f:for>
|
||||
</tr>
|
||||
</f:for>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,50 @@
|
||||
<f:comment>
|
||||
Styling requires the colpos to be set to the string 'unused'. To preserve type safety in the
|
||||
controller, the string is only used in the template by setting the below "colpos" variable.
|
||||
</f:comment>
|
||||
<f:variable name="colpos" value="{f:if(condition: column.unused, then: 'unused', else: column.columnNumber)}"/>
|
||||
|
||||
<f:if condition="{languageColumns}">
|
||||
<f:then>
|
||||
<f:comment><!-- Language comparison view --></f:comment>
|
||||
<f:variable name="columnIdentifier" value="columnIdentifier_language-{column.context.siteLanguage.languageId}_column-{colpos}" />
|
||||
</f:then>
|
||||
<f:else>
|
||||
<f:comment><!-- Grid / Column view --></f:comment>
|
||||
<f:variable name="columnIdentifier" value="columnIdentifier_column-{colpos}" />
|
||||
</f:else>
|
||||
</f:if>
|
||||
<f:variable name="columnClasses">
|
||||
t3js-page-column t3-grid-cell t3-page-column
|
||||
{f:if(condition: column.identifierCleaned, then: 't3-grid-cell-{column.identifierCleaned}')}
|
||||
{f:if(condition: column.unassigned, then: 't3-grid-cell-unassigned')}
|
||||
{f:if(condition: '!{column.active} && !{column.unused}', then: 't3-grid-cell-restricted')}
|
||||
{f:if(condition: '!{column.active} && {hideRestrictedColumns} && !{column.unused}', then: 't3-grid-cell-hidden')}
|
||||
</f:variable>
|
||||
<td
|
||||
valign="top"
|
||||
colspan="{column.colSpan}"
|
||||
rowspan="{column.rowSpan}"
|
||||
data-colpos="{colpos}"
|
||||
data-language-uid="{column.context.siteLanguage.languageId}"
|
||||
class="{columnClasses -> f:spaceless()}"
|
||||
role="group" aria-labelledby="{columnIdentifier}"
|
||||
>
|
||||
<f:alias map="{columnHeaderLevel: 2}">
|
||||
<f:render partial="PageLayout/Grid/ColumnHeader" arguments="{_all}" />
|
||||
</f:alias>
|
||||
<f:if condition="{column.active} || {column.unused}">
|
||||
<div data-colpos="{colpos}" data-language-uid="{column.context.siteLanguage.languageId}" class="t3-page-ce-wrapper">
|
||||
<f:for each="{column.items}" as="item">
|
||||
<f:render partial="PageLayout/Record" arguments="{_all}" />
|
||||
</f:for>
|
||||
</div>
|
||||
</f:if>
|
||||
<f:if condition="{column.unassigned}">
|
||||
<f:be.infobox
|
||||
title="{f:translate(domain: 'backend.layout', key: 'emptyColPos')}"
|
||||
message="{f:translate(domain: 'backend.layout', key: 'emptyColPos.message')}"
|
||||
state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::WARNING')}"
|
||||
/>
|
||||
</f:if>
|
||||
</td>
|
||||
@@ -0,0 +1,49 @@
|
||||
{columnHeaderLevel -> f:or(alternative: 2) -> f:variable(name: 'columnHeaderLevel')}
|
||||
|
||||
<div class="t3-page-column-header">
|
||||
<f:if condition="{column.active}">
|
||||
<f:then>
|
||||
<div class="t3-page-column-header-icons">
|
||||
<f:if condition="{allowEditContent} && {column.editUrl}">
|
||||
<a
|
||||
class="btn btn-link"
|
||||
href="{column.editUrl}"
|
||||
title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_layout.xlf:editColumn')}"
|
||||
>
|
||||
<core:icon identifier="actions-document-open" />
|
||||
<span class="visually-hidden">{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_layout.xlf:editColumn')}</span>
|
||||
</a>
|
||||
</f:if>
|
||||
</div>
|
||||
<h{columnHeaderLevel} id="{columnIdentifier}" class="t3-page-column-title">
|
||||
{column.title}
|
||||
<f:if condition="{context.pageContext.pageRecord.pid} !== 0 && {column.slideMode.value} !== 'none'">
|
||||
<f:if condition="!({column.slideMode.value} === 'slide' && {column.items})">
|
||||
<span class="badge badge-info" title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_layout.xlf:slideModeInfo.{column.slideMode.value}')}">
|
||||
<f:switch expression="{column.slideMode.value}">
|
||||
<f:case value="slide">{core:icon(identifier: 'actions-search', size: 'small')}{core:icon(identifier: 'actions-sort-amount-up', size: 'small')}</f:case>
|
||||
<f:case value="collect">{core:icon(identifier: 'actions-cart', size: 'small')}{core:icon(identifier: 'actions-sort-amount-down', size: 'small')}</f:case>
|
||||
<f:case value="collectReverse">{core:icon(identifier: 'actions-cart', size: 'small')}{core:icon(identifier: 'actions-sort-amount-up', size: 'small')}</f:case>
|
||||
</f:switch>
|
||||
</span>
|
||||
</f:if>
|
||||
</f:if>
|
||||
</h{columnHeaderLevel}>
|
||||
</f:then>
|
||||
<f:else if="{column.unused}">
|
||||
<span id="{columnIdentifier}"><f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_layout.xlf:unusedColPos"/></span>
|
||||
</f:else>
|
||||
<f:else if="{column.unassigned}">
|
||||
<span id="{columnIdentifier}">{column.titleUnassigned}</span>
|
||||
</f:else>
|
||||
<f:else>
|
||||
<span id="{columnIdentifier}">{column.titleInaccessible}</span>
|
||||
</f:else>
|
||||
</f:if>
|
||||
</div>
|
||||
<f:if condition="{allowEditContent} && {column.contentEditable} && {column.context.allowNewContent} && {column.active}">
|
||||
<div class="t3-page-ce t3js-page-ce" data-page="{column.context.pageId}">
|
||||
<f:render partial="PageLayout/ActionControls" arguments="{column: column, allowEditContent: allowEditContent, url: column.newContentUrl}" />
|
||||
<div class="t3-page-ce-dropzone t3js-page-ce-dropzone-available" hidden></div>
|
||||
</div>
|
||||
</f:if>
|
||||
@@ -0,0 +1,149 @@
|
||||
<html
|
||||
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
|
||||
xmlns:be="http://typo3.org/ns/TYPO3/CMS/Backend/ViewHelpers"
|
||||
xmlns:core="http://typo3.org/ns/TYPO3/CMS/Core/ViewHelpers"
|
||||
data-namespace-typo3-fluid="true"
|
||||
>
|
||||
|
||||
<div class="t3-grid-container{f:if(condition: context.backendLayout.identifierCleaned, then: ' t3-grid-container-{context.backendLayout.identifierCleaned}')}" data-multi-languages="{f:if(condition: context.multiLanguages, then: '1', else: '0')}">
|
||||
<div class="t3-grid-container-inner">
|
||||
<table class="t3-page-columns t3-grid-table t3js-page-columns">
|
||||
<tr>
|
||||
<f:for each="{languageColumns}" as="languageColumn">
|
||||
<td valign="top"
|
||||
class="t3-page-column t3-page-column-lang-name"
|
||||
data-language-uid="{languageColumn.context.siteLanguage.languageId}"
|
||||
data-language-title="{languageColumn.context.siteLanguage.title}"
|
||||
data-flag-identifier="{languageColumn.context.siteLanguage.flagIdentifier}"
|
||||
>
|
||||
<typo3-backend-editable-page-title
|
||||
pageTitle="{languageColumn.context.localizedPageTitle}"
|
||||
pageId="{context.pageId}"
|
||||
localizedPageId="{languageColumn.pageRecordUid}"
|
||||
{languageColumn.allowEditPage ? 'editable' : ''}
|
||||
>
|
||||
{languageColumn.context.localizedPageTitle}
|
||||
</typo3-backend-editable-page-title>
|
||||
<div>
|
||||
<core:iconForRecord table="pages" row="{languageColumn.pageRecord}" />
|
||||
<core:icon identifier="{languageColumn.context.siteLanguage.flagIdentifier}" />
|
||||
{languageColumn.context.siteLanguage.title}
|
||||
<f:if condition="{languageColumn.context.languageMode}">
|
||||
<span class="badge badge-{languageColumn.context.languageModeLabelClass}">{languageColumn.context.languageMode}</span>
|
||||
</f:if>
|
||||
<f:if condition="{languageColumn.translationData.hasElementsWithWorkspaceDeletePlaceholders}">
|
||||
<span class="badge badge-warning"
|
||||
data-bs-content="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_layout.xlf:languageContainsWorkspaceDeletePlaceholderRecords')}"
|
||||
data-bs-toggle="popover"
|
||||
data-bs-placement="auto"
|
||||
data-bs-trigger="hover focus"
|
||||
>
|
||||
!
|
||||
</span>
|
||||
</f:if>
|
||||
</div>
|
||||
<div class="mt-2">
|
||||
<f:if condition="{languageColumn.allowViewPage}">
|
||||
<button class="btn btn-default btn-sm" {f:if(condition: languageColumn.previewUrlAttributes, then: '{languageColumn.previewUrlAttributes -> f:format.raw()}', else: 'disabled="true"')} title="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.showPage')}">
|
||||
<core:icon identifier="actions-view" />
|
||||
<f:translate key="LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.showPage" />
|
||||
</button>
|
||||
</f:if>
|
||||
<f:if condition="{languageColumn.allowEditPage}">
|
||||
<typo3-backend-contextual-record-edit-trigger
|
||||
url="{languageColumn.pageEditUrl}"
|
||||
edit-url="{languageColumn.fullPageEditUrl}"
|
||||
class="btn btn-default btn-sm"
|
||||
title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_layout.xlf:editPageProperties')}"
|
||||
>
|
||||
<core:icon identifier="actions-open" />
|
||||
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_layout.xlf:editPageProperties" />
|
||||
</typo3-backend-contextual-record-edit-trigger>
|
||||
</f:if>
|
||||
<f:if condition="{allowEditContent} && {languageColumn.context.siteLanguage.languageId} && {languageColumn.translationData.untranslatedRecordUids}">
|
||||
<typo3-backend-localization-button
|
||||
class="btn btn-default btn-sm"
|
||||
title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_layout.xlf:newPageContent_translate')}"
|
||||
record-type="pages"
|
||||
record-uid="{context.pageId}"
|
||||
target-language="{languageColumn.context.siteLanguage.languageId}"
|
||||
>
|
||||
<core:icon identifier="actions-localize" />
|
||||
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_layout.xlf:localize.wizard.button.translate" />
|
||||
</typo3-backend-localization-button>
|
||||
</f:if>
|
||||
</div>
|
||||
</td>
|
||||
</f:for>
|
||||
</tr>
|
||||
<f:if condition="{context.multiLanguages}">
|
||||
<f:then>
|
||||
<f:variable name="grid" value="{languageColumns.0.grid}" />
|
||||
<f:for each="{context.drawingConfiguration.activeColumns}" as="columnNumber">
|
||||
<tr>
|
||||
<f:for each="{languageColumns}" as="languageColumn">
|
||||
<f:variable name="column" value="{be:languageColumn(languageColumn: languageColumn, columnNumber: columnNumber)}" />
|
||||
<td valign="top"
|
||||
data-colpos="{column.columnNumber}" data-language-uid="{column.context.siteLanguage.languageId}"
|
||||
class="t3-grid-cell t3-page-column t3js-page-column {f:if(condition: column.identifierCleaned, then: 't3-grid-cell-{column.identifierCleaned}')}">
|
||||
<f:alias map="{columnHeaderLevel: 3}">
|
||||
<f:render partial="PageLayout/Grid/ColumnHeader" arguments="{_all}" />
|
||||
</f:alias>
|
||||
</td>
|
||||
</f:for>
|
||||
</tr>
|
||||
<f:variable name="column" value="{be:languageColumn(languageColumn: languageColumns.0, columnNumber: columnNumber)}" />
|
||||
<f:for each="{column.items}" as="gridItem" iteration="itemIterator">
|
||||
<tr>
|
||||
<td class="t3-grid-cell t3js-page-column {f:if(condition: column.identifierCleaned, then: 't3-grid-cell-{column.identifierCleaned}')}" valign="top" data-colpos="{column.columnNumber}">
|
||||
<f:variable name="column" value="{be:languageColumn(languageColumn: languageColumns.0, columnNumber: columnNumber)}" />
|
||||
<f:variable name="item" value="{gridItem}" />
|
||||
<f:render partial="PageLayout/Record" arguments="{_all}" />
|
||||
</td>
|
||||
<f:for each="{languageColumns}" as="languageColumn">
|
||||
<f:if condition="{languageColumn.context.siteLanguage.languageId} > 0">
|
||||
<f:variable name="column" value="{be:languageColumn(languageColumn: languageColumn, columnNumber: columnNumber)}" />
|
||||
<td class="t3-grid-cell t3js-page-column {f:if(condition: column.identifierCleaned, then: 't3-grid-cell-{column.identifierCleaned}')}" valign="top" data-colpos="{column.columnNumber}">
|
||||
<f:variable name="languageId" value="{languageColumn.context.siteLanguage.languageId}" />
|
||||
<f:if condition="{languageColumn.translationData.mode} == 'connected'">
|
||||
<f:then>
|
||||
<f:if condition="{gridItem.translations.{languageId}}">
|
||||
<f:variable name="item" value="{gridItem.translations.{languageId}}" />
|
||||
<f:render partial="PageLayout/Record" arguments="{_all}" />
|
||||
</f:if>
|
||||
</f:then>
|
||||
<f:else>
|
||||
<f:if condition="{itemIterator.isFirst}">
|
||||
<f:variable name="languageColumnNonConnected">{languageColumns.{languageId}}</f:variable>
|
||||
<f:variable name="column" value="{be:languageColumn(languageColumn: languageColumnNonConnected, columnNumber: columnNumber)}" />
|
||||
<f:for each="{column.items}" as="item">
|
||||
<f:render partial="PageLayout/Record" arguments="{_all}" />
|
||||
</f:for>
|
||||
</f:if>
|
||||
</f:else>
|
||||
</f:if>
|
||||
</td>
|
||||
</f:if>
|
||||
</f:for>
|
||||
</tr>
|
||||
</f:for>
|
||||
</f:for>
|
||||
</f:then>
|
||||
<f:else>
|
||||
<f:for each="{context.drawingConfiguration.activeColumns}" as="columnNumber">
|
||||
<tr>
|
||||
<f:for each="{languageColumns}" as="languageColumn">
|
||||
<f:if condition="{languageColumn.grid.columns}">
|
||||
<f:variable name="grid" value="{languageColumn.grid}" />
|
||||
<f:variable name="column" value="{be:languageColumn(languageColumn: languageColumn, columnNumber: columnNumber)}" />
|
||||
<f:render partial="PageLayout/Grid/Column" arguments="{_all}" />
|
||||
</f:if>
|
||||
</f:for>
|
||||
</tr>
|
||||
</f:for>
|
||||
</f:else>
|
||||
</f:if>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</html>
|
||||
@@ -0,0 +1,36 @@
|
||||
{f:if(condition: '{item.disabled} && {item.context.drawingConfiguration.showHidden} == 0', then: 'height: 0; display: none;') -> f:variable(name: 'style')}
|
||||
<div
|
||||
role="group"
|
||||
aria-labelledby="element-{item.table}-{item.record.uid}-label"
|
||||
class="t3-page-ce {item.wrapperClassName} t3js-page-ce t3js-page-ce-sortable"
|
||||
id="element-{item.table}-{item.record.uid}"
|
||||
data-table="{item.table}"
|
||||
data-uid="{item.record.uid}"
|
||||
data-language-uid="{item.record.languageId}"
|
||||
data-move-element-url="{f:be.uri(route: 'move_element', parameters: '{uid: item.record.uid, originalPid: item.record.pid, expandPage: item.record.pid, returnUrl: context.returnUrl}')}"
|
||||
style="{style}"
|
||||
>
|
||||
<span id="element-{item.table}-{item.record.uid}-label" class="visually-hidden">id={item.record.uid} - <f:if condition="{item.record.header}">{item.record.header} - </f:if>{item.contentTypeLabel}</span>
|
||||
<div class="t3-page-ce-element t3-page-ce-dragitem">
|
||||
<f:render partial="PageLayout/Record/{item.record.CType}/Header" arguments="{_all}" optional="1">
|
||||
<f:render partial="PageLayout/RecordDefault/Header" arguments="{_all}" />
|
||||
</f:render>
|
||||
<f:spaceless>
|
||||
<div class="t3-page-ce-body">
|
||||
<f:render partial="PageLayout/RecordDefault/Preview" arguments="{_all}" />
|
||||
</div>
|
||||
</f:spaceless>
|
||||
<f:render partial="PageLayout/Record/{item.record.CType}/Footer" arguments="{_all}" optional="1">
|
||||
<f:render partial="PageLayout/RecordDefault/Footer" arguments="{_all}" />
|
||||
</f:render>
|
||||
<f:if condition="{item.inconsistentLanguage}">
|
||||
<div class="t3-page-ce-footer">
|
||||
<span class="badge badge-warning">{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.inconsistentLanguageWarning')}</span>
|
||||
</div>
|
||||
</f:if>
|
||||
</div>
|
||||
<f:if condition="{allowEditContent} && {item.column.contentEditable} && {column.context.allowNewContent} && {column.active}">
|
||||
<f:render partial="PageLayout/ActionControls" arguments="{item: item, column: column, allowEditContent: allowEditContent, url: item.newContentAfterUrl}" />
|
||||
</f:if>
|
||||
<div class="t3-page-ce-dropzone t3js-page-ce-dropzone-available" hidden></div>
|
||||
</div>
|
||||
@@ -0,0 +1,7 @@
|
||||
<f:if condition="{item.footerInfo}">
|
||||
<div class="t3-page-ce-footer">
|
||||
<div class="t3-page-ce-info">
|
||||
{item.footerInfo -> f:format.raw()}
|
||||
</div>
|
||||
</div>
|
||||
</f:if>
|
||||
@@ -0,0 +1,60 @@
|
||||
<div class="t3-page-ce-header t3js-page-ce-header" {f:if(condition: '{allowEditContent} && {item.dragAndDropAllowed}', then: 'draggable="true"')}>
|
||||
<div class="t3-page-ce-header-left">
|
||||
{item.icons -> f:format.raw()}
|
||||
<f:if condition="{item.siteLanguage.flagIdentifier}">
|
||||
<span class="t3-page-ce-header-icon-flag t3js-flag">
|
||||
<span class="visually-hidden">{item.siteLanguage.title}</span>
|
||||
<core:icon identifier="{item.siteLanguage.flagIdentifier}" title="{item.siteLanguage.title}" />
|
||||
</span>
|
||||
</f:if>
|
||||
</div>
|
||||
<div class="t3-page-ce-header-title">
|
||||
{item.contentTypeLabel}
|
||||
</div>
|
||||
<div class="t3-page-ce-header-right">
|
||||
<f:if condition="{item.editable} && {allowEditContent}">
|
||||
<div class="btn-toolbar">
|
||||
<div class="btn-group btn-group-sm">
|
||||
<typo3-backend-contextual-record-edit-trigger
|
||||
url="{item.contextualEditUrl}"
|
||||
edit-url="{item.editUrl}"
|
||||
class="btn btn-sm btn-default btn-borderless"
|
||||
title="{f:translate(key:'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:edit')}"
|
||||
>
|
||||
<core:icon identifier="actions-open" />
|
||||
</typo3-backend-contextual-record-edit-trigger>
|
||||
<f:if condition="{item.visibilityToggling}">
|
||||
<button type="button"
|
||||
class="btn btn-sm btn-default btn-borderless"
|
||||
data-action="content-element-visibility-toggle"
|
||||
title="{item.visibilityToggleTitle}">
|
||||
<typo3-backend-icon identifier="actions-edit-{item.visibilityToggleIconName}" size="small"></typo3-backend-icon>
|
||||
</button>
|
||||
</f:if>
|
||||
<f:if condition="{item.delible}">
|
||||
<a class="btn btn-default btn-borderless t3js-modal-trigger"
|
||||
href="{item.deleteUrl}"
|
||||
data-severity="warning"
|
||||
data-title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_alt_doc.xlf:label.confirm.delete_record.title')}"
|
||||
data-content="{item.deleteMessage}"
|
||||
data-button-close-text="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_common.xlf:cancel')}"
|
||||
data-button-ok-text="{f:translate(key:'LLL:EXT:core/Resources/Private/Language/locallang_mod_web_list.xlf:delete')}"
|
||||
title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_layout.xlf:deleteItem')}">
|
||||
<core:icon identifier="actions-edit-delete" size="small" />
|
||||
</a>
|
||||
</f:if>
|
||||
<button type="button"
|
||||
aria-haspopup="true"
|
||||
aria-controls="contentMenu0"
|
||||
aria-label="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.contextMenu.open')}"
|
||||
class="btn btn-sm btn-default btn-borderless"
|
||||
data-contextmenu-trigger="click"
|
||||
data-contextmenu-table="{item.table}"
|
||||
data-contextmenu-uid="{item.record.uid}">
|
||||
<core:icon identifier="actions-menu-alternative" />
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</f:if>
|
||||
</div>
|
||||
</div>
|
||||
@@ -0,0 +1,3 @@
|
||||
<f:render partial="PageLayout/Record/{item.record.CType}/Preview" arguments="{_all}" optional="1">
|
||||
{item.preview -> f:format.raw()}
|
||||
</f:render>
|
||||
Reference in New Issue
Block a user