TYPO3 v15 dev-main snapshot ()

This commit is contained in:
2026-08-10 22:31:00 +02:00
commit f9941541b7
1178 changed files with 135377 additions and 0 deletions
@@ -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>