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,577 @@
<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"
>
<f:layout name="Module" />
<f:section name="Before">
<f:asset.module identifier="@typo3/backend/element/immediate-action-element.js"/>
<f:asset.module identifier="@typo3/backend/utility/collapse-state-persister.js"/>
<f:asset.module identifier="@typo3/backend/tree/tree-node-toggle.js"/>
<f:variable name="args" value="{0: 'site', 1: page.uid}" />
<typo3-immediate-action
action="TYPO3.Backend.Storage.ModuleStateStorage.update"
args="{args -> f:format.json() -> f:format.htmlspecialchars()}"
></typo3-immediate-action>
</f:section>
<f:section name="Content">
<f:if condition="{site.identifier}">
<h1>
<f:if condition="{page}">
<f:then>
<f:translate
key="detail.headline_with_page_title"
domain="backend.siteconfiguration"
arguments="{
0: '{page.title}'
}"
/>
</f:then>
<f:else>
<f:translate
key="detail.headline_with_site_identifier"
domain="backend.siteconfiguration"
arguments="{
0: '{site.identifier}'
}"
/>
</f:else>
</f:if>
</h1>
<f:if condition="{site.sets -> f:count()} && {site.invalidSets}">
<f:render partial="SiteManagement/InvalidSets" arguments="{site: site, renderMode: 'infobox'}" />
</f:if>
<h2>
<f:translate key="detail.site_configuration.headline" domain="backend.siteconfiguration" />
</h2>
<f:comment><!-- Languages --></f:comment>
<div class="panel panel-default">
<div class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target="#languages-collapse"
aria-controls="languages-collapse"
aria-expanded="false"
>
<div class="panel-title">
<f:translate key="detail.site_configuration.languages" domain="backend.siteconfiguration"/>
</div>
<span class="caret"></span>
</button>
</div>
</div>
<div id="languages-collapse" class="panel-collapse collapse" data-persist-collapse-state="true" role="tabpanel">
<div class="table-fit">
<table class="table table-hover table-vertical-top">
<thead>
<tr>
<th class="col-50" colspan="2">
<f:translate key="detail.site_configuration.languages.language" domain="backend.siteconfiguration" />
</th>
<th class="col-50 col-word-break">
<f:translate key="detail.site_configuration.languages.language_url" domain="backend.siteconfiguration" />
</th>
</tr>
</thead>
<tbody>
<f:for each="{site.languages}" as="language">
<tr>
<td class="col-icon">
<f:if condition="{language.enabled}">
<f:then>
<core:icon identifier="{language.flagIdentifier}" />
</f:then>
<f:else>
<core:icon identifier="{language.flagIdentifier}" overlay="overlay-hidden" />
</f:else>
</f:if>
</td>
<td>
<f:if condition="{language.enabled}">
<f:then>
{language.title} <code>[{language.languageId}]</code>
</f:then>
<f:else>
<span class="text-body-secondary">
{language.title} (<f:translate key="disabled" domain="core.common">disabled</f:translate>)
<code>[{language.languageId}]</code>
</span>
</f:else>
</f:if>
</td>
<td>
<a href="{language.base}" target="_blank">{language.base}</a>
</td>
</tr>
</f:for>
</tbody>
</table>
</div>
</div>
</div>
<f:comment><!-- Error handling --></f:comment>
<f:if condition="{site.configuration.errorHandling -> f:count()} > 0">
<f:then>
<div class="panel panel-default">
<div class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target="#error-handling-collapse"
aria-controls="error-handling-collapse"
aria-expanded="false"
>
<div class="panel-title">
<f:translate key="detail.site_configuration.error_handling" domain="backend.siteconfiguration" />
</div>
<span class="caret"></span>
</button>
</div>
</div>
<div id="error-handling-collapse" class="panel-collapse collapse" data-persist-collapse-state="true" role="tabpanel">
<div class="panel-body">
<ul class="treelist">
<f:for each="{site.configuration.errorHandling}" as="errorHandling">
<li>
<span class="treelist-group treelist-group-monospace">
<span class="treelist-label">
<f:translate key="LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_errorhandling.errorCode.{errorHandling.errorCode}" />
</span>
</span>
<ul class="treelist">
<f:switch expression="{errorHandling.errorHandler}">
<f:case value="Fluid">
<f:variable name="label" value="{f:translate(key:'site_errorhandling.errorFluidTemplate', domain:'backend.siteconfiguration_tca')}"/>
<f:render
section="TreeItem"
arguments="{
label: label,
value: '{errorHandling.errorFluidTemplate}'
}"
/>
</f:case>
<f:case value="Page">
<f:variable name="label" value="{f:translate(key:'site_errorhandling.errorContentSource', domain:'backend.siteconfiguration_tca')}" />
<f:render
section="TreeItem"
arguments="{
label: label,
value: '{errorHandling.errorContentSource}'
}"
/>
</f:case>
<f:case value="PHP">
<f:variable name="label" value="{f:translate(key:'site_errorhandling.errorPhpClassFQCN', domain:'backend.siteconfiguration_tca')}" />
<f:render
section="TreeItem"
arguments="{
label: label,
value: '{errorHandling.errorPhpClassFQCN}'
}"
/>
</f:case>
<f:case value="LoginRedirect">
<f:variable name="label" value="{f:translate(key:'site_errorhandling.loginRedirectTarget', domain:'backend.siteconfiguration_tca')}" />
<f:render
section="TreeItem"
arguments="{
label: label,
value: '{errorHandling.loginRedirectTarget}'
}"
/>
<f:variable name="label" value="{f:translate(key:'site_errorhandling.loginRedirectParameter', domain:'backend.siteconfiguration_tca')}" />
<f:variable name="value" value="{f:translate(key:'site_errorhandling.loginRedirectParameter.{errorHandling.loginRedirectParameter}', domain:'backend.siteconfiguration_tca')}" />
<f:render
section="TreeItem"
arguments="{
label: label,
value: value
}"
/>
</f:case>
</f:switch>
</ul>
</li>
</f:for>
</ul>
</div>
</div>
</div>
</f:then>
<f:else>
<div class="panel panel-default">
<div class="panel-heading">
<f:translate key="detail.site_configuration.error_handling" domain="backend.siteconfiguration" />
</div>
<div class="panel-body">
<f:translate key="detail.not_configured" domain="backend.siteconfiguration"/>
</div>
</div>
</f:else>
</f:if>
<f:comment><!-- Static routes --></f:comment>
<f:if condition="{site.configuration.routes -> f:count()} > 0">
<f:then>
<div class="panel panel-default">
<div class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target="#routes-handling-collapse"
aria-controls="routes-handling-collapse"
aria-expanded="false"
>
<div class="panel-title">
<f:translate key="detail.site_configuration.static_routes" domain="backend.siteconfiguration" />
</div>
<span class="caret"></span>
</button>
</div>
</div>
<div id="routes-handling-collapse" class="panel-collapse collapse" data-persist-collapse-state="true" role="tabpanel">
<div class="panel-body">
<ul class="treelist">
<f:for each="{site.configuration.routes}" as="route">
<li>
<span class="treelist-group treelist-group-monospace">
<span class="treelist-label">
{route.route}
</span>
</span>
<ul class="treelist">
<f:variable name="typeLabel" value="{f:translate(key:'site_route.type', domain:'backend.siteconfiguration_tca')}" />
<f:if condition="{route.type} == 'uri'">
<f:then>
<f:variable name="typeValue" value="{f:translate(key:'site_route.source', domain:'backend.siteconfiguration_tca')}" />
</f:then>
<f:else>
<f:variable name="typeValue" value="{f:translate(key:'site_route.{route.type}', domain:'backend.siteconfiguration_tca')}" />
</f:else>
</f:if>
<f:render
section="TreeItem"
arguments="{
label: typeLabel,
value: typeValue
}"
/>
<f:switch expression="{route.type}">
<f:case value="staticText">
<f:variable name="label" value="{f:translate(key:'site_route.staticText', domain:'backend.siteconfiguration_tca')}" />
<f:render
section="TreeItem"
arguments="{
label: label,
value: '{route.content}'
}"
/>
</f:case>
<f:case value="uri">
<f:variable name="label" value="{f:translate(key:'site_route.source', domain:'backend.siteconfiguration_tca')}" />
<f:render
section="TreeItem"
arguments="{
label: label,
value: '{route.source}'
}"
/>
</f:case>
<f:case value="asset">
<f:variable name="label" value="{f:translate(key:'site_route.asset', domain:'backend.siteconfiguration_tca')}" />
<f:render
section="TreeItem"
arguments="{
label: label,
value: '{route.asset}'
}"
/>
</f:case>
</f:switch>
</ul>
</li>
</f:for>
</ul>
</div>
</div>
</div>
</f:then>
<f:else>
<div class="panel panel-default">
<div class="panel-heading">
<f:translate key="detail.site_configuration.static_routes" domain="backend.siteconfiguration" />
</div>
<div class="panel-body">
<f:translate key="detail.not_configured" domain="backend.siteconfiguration" />
</div>
</div>
</f:else>
</f:if>
<f:comment><!-- Route enhancers --></f:comment>
<f:if condition="{site.configuration.routeEnhancers -> f:count()} > 0">
<div class="panel panel-default">
<div class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target="#route-enhancers-collapse"
aria-controls="route-enhancers-collapse"
aria-expanded="false"
>
<div class="panel-title">
<f:translate key="detail.site_configuration.route_enhancers" domain="backend.siteconfiguration" />
</div>
<span class="caret"></span>
</button>
</div>
</div>
<div id="route-enhancers-collapse" class="panel-collapse collapse" data-persist-collapse-state="true" role="tabpanel">
<div class="panel-body">
<ul class="treelist">
<f:for each="{site.configuration.routeEnhancers}" as="enhancer" key="enhancerName" iteration="enhancerIterator">
<li>
<typo3-backend-tree-node-toggle
class="treelist-control treelist-control-collapsed"
data-bs-toggle="collapse"
data-bs-target="#collapse-enhancer-{enhancerIterator.index}"
aria-expanded="false"
></typo3-backend-tree-node-toggle>
<span class="treelist-group treelist-group-monospace">
<span class="treelist-label">
{enhancerName}
</span>
</span>
<div class="treelist-collapse collapse" id="collapse-enhancer-{enhancerIterator.index}" data-persist-collapse-state="true" data-persist-collapse-state-suffix="site-route-enhancers" data-persist-collapse-state-if-state="shown">
<f:render section="RouteEnhancerConfig" arguments="{config: enhancer, enhancerIndex: enhancerIterator.index}" />
</div>
</li>
</f:for>
</ul>
</div>
</div>
</div>
</f:if>
<h2>
<f:translate key="detail.site_settings.headline" domain="backend.siteconfiguration" />
</h2>
<f:if condition="({site.sets -> f:count()} > 0) || ({localSettings.map -> f:count()} > 0) || ({categories -> f:count()} > 0)">
<f:then>
<f:comment><!-- Show dependencies --></f:comment>
<f:if condition="{site.sets -> f:count()} > 0">
<h3>
<f:translate key="detail.site_settings.dependencies.headline" domain="backend.siteconfiguration" />
</h3>
<p>
<f:sanitize.html><f:translate key="detail.site_settings.dependencies.text" domain="backend.siteconfiguration" /></f:sanitize.html>
</p>
<ul>
<f:for each="{site.sets}" as="set" iteration="setIterator">
<li><code>{set}</code></li>
</f:for>
</ul>
</f:if>
<h3>
<f:translate key="detail.site_settings.active_settings.headline" domain="backend.siteconfiguration" />
</h3>
<f:comment><!-- Settings from site configuration --></f:comment>
<f:if condition="{localSettings.map -> f:count()} > 0">
<div class="panel panel-default">
<div class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target="#custom-settings-collapse"
aria-controls="custom-settings-collapse"
aria-expanded="false"
>
<div class="panel-title">
<f:translate key="detail.site_settings.active_settings.custom_site_settings" domain="backend.siteconfiguration" />
</div>
<span class="caret"></span>
</button>
</div>
</div>
<div id="custom-settings-collapse" class="panel-collapse collapse" data-persist-collapse-state="true" role="tabpanel">
<div class="panel-body">
<ul class="treelist">
<f:for each="{localSettings.map}" as="setting" key="key">
<li>
<span class="treelist-group treelist-group-monospace">
<span class="treelist-label">
{key}
</span>
<span class="treelist-operator">=</span>
<span class="treelist-value">
{setting -> f:format.json()}
</span>
</span>
</li>
</f:for>
</ul>
</div>
</div>
</div>
</f:if>
<f:comment><!-- Settings from site sets --></f:comment>
<f:if condition="{categories -> f:count()} > 0">
<f:for each="{categories}" as="category">
<div class="panel panel-default">
<div class="panel-heading" role="tab">
<div class="panel-heading-row">
<button
class="panel-button collapsed"
type="button"
data-bs-toggle="collapse"
data-bs-target="#siteset-{category.key}-collapse"
aria-controls="siteset-{category.key}-collapse"
aria-expanded="false"
>
<div class="panel-title">
{category.label}
</div>
<span class="caret"></span>
</button>
</div>
</div>
<div id="siteset-{category.key}-collapse" class="panel-collapse collapse" data-persist-collapse-state="true" role="tabpanel">
<div class="panel-body">
<f:if condition="{category.categories -> f:count()} > 0">
<f:then>
<f:comment><!-- Grouped settings --></f:comment>
<ul class="treelist">
<f:for each="{category.categories}" as="section">
<li>
<span class="treelist-group treelist-group-monospace">
<span class="treelist-label">{section.label}</span>
</span>
<f:render section="Tree" arguments="{settings: '{section.settings}'}" />
</li>
</f:for>
</ul>
</f:then>
<f:else>
<f:comment><!-- Default --></f:comment>
<f:render section="Tree" arguments="{settings: '{category.settings}'}" />
</f:else>
</f:if>
</div>
</div>
</div>
</f:for>
</f:if>
</f:then>
<f:else>
<f:be.infobox
title="{f:translate(key:'detail.site_settings.no_settings_found.title', domain:'backend.siteconfiguration')}"
state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::INFO')}"
>
<f:sanitize.html><f:translate key="detail.site_settings.no_settings_found.message" domain="backend.siteconfiguration" /></f:sanitize.html>
</f:be.infobox>
</f:else>
</f:if>
</f:if>
</f:section>
<f:section name="Tree">
<ul class="treelist">
<f:for each="{settings}" as="setting">
<f:if condition="{setting.definition.label}">
<li class="loose">
<div class="treelist-comment">
<div>
# {setting.definition.label}
</div>
</div>
</li>
</f:if>
<li>
<span class="treelist-group treelist-group-monospace">
<span class="treelist-label">
{setting.definition.key}
</span>
<span class="treelist-operator">=</span>
<span class="treelist-value">
{setting.renderedValue}
</span>
</span>
</li>
</f:for>
</ul>
</f:section>
<f:section name="TreeItem">
<li>
<span class="treelist-group treelist-group-monospace">
<span class="treelist-label">
{label}
</span>
<span class="treelist-operator">=</span>
<span class="treelist-value">
{value}
</span>
</span>
</li>
</f:section>
<f:section name="RouteEnhancerConfig">
<ul class="treelist">
<f:for each="{config}" as="propertyValue" key="propertyKey" iteration="propertyIterator">
<f:render section="RouteEnhancerProperty" arguments="{label: propertyKey, value: propertyValue, idPrefix: 'enhancer-{enhancerIndex}-{propertyIterator.index}'}" />
</f:for>
</ul>
</f:section>
<f:section name="RouteEnhancerProperty">
<f:if condition="{be:type.isArray(value: value)}">
<f:then>
<li>
<typo3-backend-tree-node-toggle
class="treelist-control treelist-control-collapsed"
data-bs-toggle="collapse"
data-bs-target="#collapse-{idPrefix}"
aria-expanded="false"
></typo3-backend-tree-node-toggle>
<span class="treelist-group treelist-group-monospace">
<span class="treelist-label">{label}</span>
</span>
<div class="treelist-collapse collapse" id="collapse-{idPrefix}" data-persist-collapse-state="true" data-persist-collapse-state-suffix="site-route-enhancers" data-persist-collapse-state-if-state="shown">
<ul class="treelist">
<f:for each="{value}" as="subValue" key="subKey" iteration="subIterator">
<f:render section="RouteEnhancerProperty" arguments="{label: subKey, value: subValue, idPrefix: '{idPrefix}-{subIterator.index}'}" />
</f:for>
</ul>
</div>
</li>
</f:then>
<f:else>
<f:render section="TreeItem" arguments="{label: label, value: value}" />
</f:else>
</f:if>
</f:section>
@@ -0,0 +1,32 @@
<html
xmlns:f="http://typo3.org/ns/TYPO3/CMS/Fluid/ViewHelpers"
data-namespace-typo3-fluid="true"
>
<f:layout name="Module" />
<f:section name="Content">
<f:asset.module identifier="@typo3/backend/context-menu.js"/>
<f:asset.module identifier="@typo3/backend/modal.js"/>
<f:asset.module identifier="@typo3/backend/site-inline-actions.js"/>
<f:render partial="SiteManagement/InvalidSets" arguments="{site: site}"/>
<form
action="{f:be.uri(route:'site_configuration.save')}"
method="post"
enctype="multipart/form-data"
name="editform"
id="siteConfigurationController"
>
{formEngineHtml -> f:format.raw()}
<input type="hidden" name="returnUrl" value="{returnUrl}" />
<input type="hidden" name="closeDoc" value="0" />
<input type="hidden" name="rootPageId" value="{rootPageId}" />
</form>
</f:section>
</html>
@@ -0,0 +1,633 @@
<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"
>
<f:layout name="Module" />
<f:section name="Before">
<f:asset.module identifier="@typo3/backend/modal.js"/>
<f:asset.module identifier="@typo3/backend/context-menu.js"/>
</f:section>
<f:section name="Content">
<h1><f:translate key="overview.title" domain="backend.siteconfiguration" /></h1>
<f:if condition="{rootPagesWithSiteConfiguration -> f:count()} || {rootPagesWithoutSiteConfiguration -> f:count()} || {unassignedSites -> f:count()}">
<f:be.infobox
title="{f:translate(key:'overview.status.title', domain:'backend.siteconfiguration')}"
state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::NOTICE')}"
>
<ul>
<f:if condition="{rootPagesWithSiteConfiguration -> f:count()}">
<li>
<f:sanitize.html>
<f:translate
key="overview.info.all_sites.{f:if(condition: '{rootPagesWithSiteConfiguration -> f:count()} === 1', then: 'single', else: 'multiple')}"
domain="backend.siteconfiguration"
arguments="{
0: '{rootPagesWithSiteConfiguration -> f:count()}'
}"
/>
</f:sanitize.html>
</li>
</f:if>
<f:if condition="{rootPagesWithoutSiteConfiguration -> f:count()}">
<li>
<f:sanitize.html>
<f:translate
key="overview.info.root_pages_without_site_sonfiguration.{f:if(condition: '{rootPagesWithoutSiteConfiguration -> f:count()} === 1', then: 'single', else: 'multiple')}"
domain="backend.siteconfiguration"
arguments="{
0: '{rootPagesWithoutSiteConfiguration -> f:count()}'
}"
/>
</f:sanitize.html>
</li>
</f:if>
<f:if condition="{unassignedSites -> f:count()}">
<li>
<f:sanitize.html>
<f:translate
key="overview.info.unassigned_sites.{f:if(condition: '{unassignedSites -> f:count()} === 1', then: 'single', else: 'multiple')}"
domain="backend.siteconfiguration"
arguments="{
0: '{unassignedSites -> f:count()}'
}"
/>
</f:sanitize.html>
</li>
</f:if>
</ul>
</f:be.infobox>
</f:if>
<h2><f:translate key="overview.root_pages_without_site_configuration.title" domain="backend.siteconfiguration" /></h2>
<f:if condition="!{rootPagesWithSiteConfiguration} && !{rootPagesWithoutSiteConfiguration}">
<f:be.infobox
state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::INFO')}"
title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration.xlf:overview.noPages.title')}"
>
<p>
<f:translate key="overview.noPages.message" domain="backend.siteconfiguration" />
</p>
<p>
<be:link.documentation identifier="t3start:create-root-page" class="btn btn-default">
<f:translate key="overview.noPages.link.label" domain="backend.siteconfiguration" />
</be:link.documentation>
</p>
</f:be.infobox>
</f:if>
<f:if condition="{rootPagesWithSiteConfiguration}">
<f:then>
<f:if condition="{duplicatedRootPages}">
<f:be.infobox title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration.xlf:overview.duplicatedRootPage')}" state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::WARNING')}">
<ul>
<f:for each="{duplicatedRootPages}" key="rootPage" as="duplicateSites">
<li>
<strong>
<f:translate key="overview.duplicatedRootPage.message" domain="backend.siteconfiguration" arguments="{0: rootPage}" />
</strong>
<f:if condition="{duplicateSites}">
<ul>
<f:for each="{duplicateSites}" as="duplicateSite">
<li>{duplicateSite}</li>
</f:for>
</ul>
</f:if>
</li>
</f:for>
</ul>
</f:be.infobox>
</f:if>
<f:if condition="{duplicatedEntryPoints}">
<f:be.infobox title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration.xlf:overview.duplicatedEntryPoints')}" state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::WARNING')}">
<f:translate key="overview.duplicatedEntryPoints.listing" domain="backend.siteconfiguration" />
<ul>
<f:for each="{duplicatedEntryPoints}" key="item" as="schemes">
<li>
<strong>{item}</strong>
<f:if condition="{schemes}">
<ul>
<f:for each="{schemes}" key="schema" as="count">
<li>{schema} ({count})</li>
</f:for>
</ul>
</f:if>
</li>
</f:for>
</ul>
</f:be.infobox>
</f:if>
<f:render section="{viewMode.value}" arguments="{_all}" />
</f:then>
<f:else if="{rootPagesWithoutSiteConfiguration}">
<f:be.infobox
state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::INFO')}"
title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration.xlf:overview.no_sites_with_site_configuration.title')}"
>
<p>
<f:translate key="overview.no_sites_with_site_configuration.message" domain="backend.siteconfiguration" />
</p>
</f:be.infobox>
</f:else>
</f:if>
<f:if condition="{rootPagesWithoutSiteConfiguration}">
<h2>{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration.xlf:overview.rootPagesWithoutSiteConfiguration.title')}</h2>
<p>
<f:translate key="overview.rootPagesWithoutSiteConfiguration.description" domain="backend.siteconfiguration" />
</p>
<div class="table-fit">
<table class="table table-striped">
<thead>
<tr>
<th colspan="2" class="nowrap"><f:translate key="overview.site" domain="backend.siteconfiguration" /></th>
<th class="align-top">&nbsp;</th>
</tr>
</thead>
<tbody>
<f:for each="{rootPagesWithoutSiteConfiguration}" as="page">
<tr>
<td class="col-icon">
<button
type="button"
class="btn btn-link"
data-contextmenu-trigger="click"
data-contextmenu-table="pages"
data-contextmenu-uid="{page.uid}"
aria-label="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.contextMenu.open')}">
<core:iconForRecord table="pages" row="{page}" />
</button>
</td>
<td>
{page.title}
</td>
<td class="col-control">
<div class="btn-group">
<f:be.link
route="site_configuration.edit"
parameters="{pageUid: page.uid}"
class="btn btn-default"
>
<core:icon identifier="actions-plus" />
<f:translate key="overview.addSiteConfiguration" domain="backend.siteconfiguration" />
</f:be.link>
</div>
</td>
</tr>
</f:for>
</tbody>
</table>
</div>
</f:if>
<f:if condition="{unassignedSites}">
<h2>{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration.xlf:overview.unassignedSites.title')}</h2>
<p>
<f:translate key="overview.unassignedSites.description" domain="backend.siteconfiguration" />
</p>
<div class="table-fit">
<table class="table table-striped">
<thead>
<tr>
<th class="nowrap"><f:translate key="overview.siteIdentifier" domain="backend.siteconfiguration" /></th>
<th class="align-top">&nbsp;</th>
</tr>
</thead>
<tbody>
<f:for each="{unassignedSites}" as="unassignedSite">
<tr>
<td>
<code>{unassignedSite.identifier}</code>
</td>
<td class="col-control">
<div class="btn-group">
<button
type="submit"
class="btn btn-default t3js-modal-trigger"
form="form-site-configuration-delete"
name="site"
value="{unassignedSite.identifier}"
data-severity="error"
data-title="{f:translate(key:'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration.xlf:overview.deleteSiteConfiguration')}"
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_common.xlf:delete')}"
>
<core:icon identifier="actions-delete" />
<f:translate key="overview.deleteSiteConfiguration" domain="backend.siteconfiguration" />
</button>
</div>
</td>
</tr>
</f:for>
</tbody>
</table>
</div>
</f:if>
<f:if condition="{invalidSets}">
<f:be.infobox
state="{f:constant(name: 'TYPO3\CMS\Core\Type\ContextualFeedbackSeverity::ERROR')}"
title="{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration.xlf:overview.invalidSets.title')}"
>
<p>{f:translate(key: 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration.xlf:overview.invalidSets.description')}</p>
<div class="table-fit">
<table class="table table-striped table-hover">
<thead>
<tr>
<th><f:translate key="overview.invalidSets.set" domain="backend.siteconfiguration" /></th>
<th><f:translate key="overview.invalidSets.error" domain="backend.siteconfiguration" /></th>
</tr>
</thead>
<tbody>
<f:for each="{invalidSets}" as="invalidSet">
<tr>
<td><code>{invalidSet.name}</code></td>
<td>
<f:translate key="{invalidSet.error.label}" arguments="{0: invalidSet.name, 1: invalidSet.context}"/>
</td>
</tr>
</f:for>
</tbody>
</table>
</div>
</f:be.infobox>
</f:if>
<form action="{be:moduleLink(route:'site_configuration.delete')}" id="form-site-configuration-delete" method="post" class="hidden"></form>
</f:section>
<f:section name="list">
<div class="table-fit">
<table class="table table-striped table-hover">
<thead>
<tr>
<th colspan="2" class="nowrap align-top"><f:translate key="overview.site" domain="backend.siteconfiguration" /></th>
<th class="align-top"><f:translate key="overview.siteIdentifier" domain="backend.siteconfiguration" /></th>
<th class="align-top"><f:translate key="site_language.language" domain="backend.siteconfiguration_tca" /></th>
<th class="align-top"><f:translate key="overview.baseUrl" domain="backend.siteconfiguration" /></th>
<th class="align-top">&nbsp;</th>
</tr>
</thead>
<tbody>
<f:for each="{rootPagesWithSiteConfiguration}" as="page">
<f:variable name="rootPage" value="{page}" />
<f:for each="{page.rootline}" as="rootLinePage" iteration="rootLinePageIterator">
<f:if condition="{rootLinePage.uid} == {page.uid}">
<f:variable name="rootPage" value="{rootLinePage}" />
</f:if>
</f:for>
<tr>
<td class="col-icon align-top">
<button type="button"
class="btn btn-link"
data-contextmenu-trigger="click"
data-contextmenu-table="pages"
data-contextmenu-uid="{rootPage.uid}"
aria-label="{f:translate(key: 'labels.contextMenu.open', domain:'core.core')}">
<core:iconForRecord table="pages" row="{rootPage}" />
</button>
</td>
<td class="align-top">
<f:if condition="{page.siteIdentifier}">
<f:then>
<f:be.link route="site_configuration.edit" parameters="{site: page.siteIdentifier}" title="{f:translate(key:'overview.editSiteConfiguration', domain:'backend.siteconfiguration')}">
{rootPage.title}
</f:be.link>
</f:then>
<f:else>
{rootPage.title}
</f:else>
</f:if>
</td>
<td class="align-top">
<f:if condition="{page.siteIdentifier}">
<f:then>
<code>{page.siteIdentifier}</code>
</f:then>
<f:else>
<div>
<f:be.link route="site_configuration.edit" parameters="{pageUid: page.uid}" class="btn btn-primary">
<f:translate key="overview.addSiteConfiguration" domain="backend.siteconfiguration" />
</f:be.link>
</div>
</f:else>
</f:if>
<f:if condition="{page.siteConfiguration.invalidSets}">
<f:render partial="SiteManagement/InvalidSets" arguments="{site: page.siteConfiguration}"/>
</f:if>
</td>
<td class="align-top">
<f:if condition="{page.siteConfiguration}">
<f:for each="{page.siteConfiguration.allLanguages}" as="siteLanguage" iteration="siteLanguageIterator">
<div class="{f:if(condition: '{siteLanguageIterator.isLast}', then: '', else: 'mb-2')}">
<f:if condition="{siteLanguage.enabled}">
<f:then>
<core:icon identifier="{siteLanguage.flagIdentifier}" /> {siteLanguage.title} <code>[{siteLanguage.languageId}]</code>
</f:then>
<f:else>
<core:icon identifier="{siteLanguage.flagIdentifier}" overlay="overlay-hidden" />
<span class="text-variant">{siteLanguage.title} (<f:translate key="disabled" domain="core.common">disabled</f:translate>) <code>[{siteLanguage.languageId}]</code></span>
</f:else>
</f:if>
</div>
</f:for>
</f:if>
</td>
<td class="align-top">
<f:if condition="{page.siteConfiguration}">
<f:for each="{page.siteConfiguration.allLanguages}" as="siteLanguage" iteration="siteLanguageIterator">
<div class="{f:if(condition: '{siteLanguageIterator.isLast}', then: '', else: 'mb-2')}">
<a href="{siteLanguage.base}" target="_blank">{siteLanguage.base}</a>
</div>
</f:for>
</f:if>
</td>
<td class="align-top nowrap col-control">
<div class="btn-group">
<f:if condition="{page.siteIdentifier}">
<f:be.link
route="site_configuration.detail"
parameters="{site: page.siteIdentifier}"
title="{f:translate(key:'overview.btn.details', domain:'backend.siteconfiguration')}"
class="btn btn-default"
>
<core:icon identifier="actions-system-options-view" />
</f:be.link>
<f:be.link
route="site_configuration.edit"
parameters="{site: page.siteIdentifier}"
title="{f:translate(key:'overview.editSiteConfiguration', domain:'backend.siteconfiguration')}"
class="btn btn-default"
>
<core:icon identifier="actions-open" />
</f:be.link>
<f:if condition="{page.siteConfiguration.sets -> f:count()} > 0">
<f:then>
<f:variable name="returnUrl">{f:be.uri(route: 'site_configuration')}</f:variable>
<f:be.link
route="site_configuration.editSettings"
parameters="{site: page.siteIdentifier, returnUrl: returnUrl}"
title="{f:translate(key:'overview.editSiteSettings', domain:'backend.siteconfiguration')}"
class="btn btn-default"
>
<core:icon identifier="actions-cog" />
</f:be.link>
</f:then>
<f:else>
<button
disabled
type="button"
class="btn btn-default"
title="{f:translate(key:'overview.editSiteSettingsUnavailable', domain:'backend.siteconfiguration')}}"
>
<core:icon identifier="actions-cog" />
</button>
</f:else>
</f:if>
<button
type="submit"
class="btn btn-default t3js-modal-trigger"
form="form-site-configuration-delete"
name="site"
value="{page.siteIdentifier}"
title="{f:translate(key:'overview.deleteSiteConfiguration', domain:'backend.siteconfiguration')}}"
data-severity="error"
data-title="{f:translate(key:'overview.deleteSiteConfiguration', domain:'backend.siteconfiguration')}}"
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_common.xlf:delete')}"
>
<core:icon identifier="actions-delete" />
</button>
</f:if>
</div>
</td>
</tr>
</f:for>
</tbody>
</table>
</div>
</f:section>
<f:section name="tiles">
<div class="card-container">
<f:for each="{rootPagesWithSiteConfiguration}" as="page">
<f:variable name="rootPage" value="{page}" />
<f:for each="{page.rootline}" as="rootLinePage" iteration="rootLinePageIterator">
<f:if condition="{rootLinePage.uid} == {page.uid}">
<f:variable name="rootPage" value="{rootLinePage}" />
</f:if>
</f:for>
<div class="card card-size-medium">
<div class="card-header">
<div class="card-icon">
<button
type="button"
class="btn btn-link"
data-contextmenu-trigger="click"
data-contextmenu-table="pages"
data-contextmenu-uid="{rootPage.uid}"
aria-label="{f:translate(key: 'LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.contextMenu.open')}"
>
<core:iconForRecord table="pages" row="{rootPage}" size="medium" />
</button>
</div>
<div class="card-header-body">
<h2 class="card-title">
{rootPage.title}
</h2>
<f:if condition="{page.siteIdentifier}">
<span class="card-subtitle">
<code>{page.siteIdentifier}</code>
</span>
</f:if>
</div>
</div>
<f:if condition="{page.siteConfiguration}">
<ul class="list-group list-group-flush">
<li class="list-group-item">
<div class="d-sm-flex justify-content-sm-between">
<strong>
<f:translate key="overview.entry_point" domain="backend.siteconfiguration" />:
</strong>
<div>
<a href="{page.siteConfiguration.base}" target="_blank">{page.siteConfiguration.base}</a>
</div>
</div>
</li>
<li class="list-group-item">
<div class="d-sm-flex justify-content-sm-between">
<strong>
<f:translate key="overview.languages" domain="backend.siteconfiguration" />:
</strong>
<div>
<core:icon identifier="{page.siteConfiguration.allLanguages.0.flagIdentifier}" /> {page.siteConfiguration.allLanguages.0.title}
<f:if condition="{page.siteConfiguration.allLanguages -> f:count()} > 1">
<f:variable name="siteLanguageAmount" value="{page.siteConfiguration.allLanguages -> f:count()}" />
<f:translate
key="overview.languages.amount" domain="backend.siteconfiguration"
arguments="{
0: '{siteLanguageAmount - 1}'
}"
/>
</f:if>
</div>
</div>
</li>
<li class="list-group-item">
<div class="d-sm-flex justify-content-sm-between">
<strong>
<f:translate key="overview.site_sets" domain="backend.siteconfiguration" />:
</strong>
<div>
<f:if condition="{page.siteConfiguration.sets -> f:count()}">
<f:then>
<div class="d-none d-sm-inline">
<core:icon identifier="actions-check" />
<span class="visually-hidden">
<f:translate key="overview.site_sets.yes" domain="backend.siteconfiguration" />
</span>
</div>
<div class="d-inline d-sm-none">
<f:translate key="overview.site_sets.yes" domain="backend.siteconfiguration" />
</div>
</f:then>
<f:else>
<f:render section="none" />
</f:else>
</f:if>
</div>
</div>
<f:if condition="{page.siteConfiguration.invalidSets}">
<f:render partial="SiteManagement/InvalidSets" arguments="{site: page.siteConfiguration}"/>
</f:if>
</li>
<li class="list-group-item">
<div class="d-sm-flex justify-content-sm-between">
<strong>
<f:translate key="overview.error_handling" domain="backend.siteconfiguration" />:
</strong>
<div>
<f:if condition="{page.siteConfiguration.configuration.errorHandling -> f:count()} > 0">
<f:then>
<f:for each="{page.siteConfiguration.configuration.errorHandling}" as="errorHandling" iteration="errorHandlingIterator">
{errorHandling.errorCode}{f:if(condition: '{errorHandlingIterator.isLast}', then: '', else: ', ')}
</f:for>
</f:then>
<f:else>
<f:render section="none" />
</f:else>
</f:if>
</div>
</div>
</li>
<li class="list-group-item">
<div class="d-sm-flex justify-content-sm-between">
<strong>
<f:translate key="overview.static_routes" domain="backend.siteconfiguration" />:
</strong>
<div>
<f:if condition="{page.siteConfiguration.configuration.routes -> f:count()} > 0">
<f:then>
<f:for each="{page.siteConfiguration.configuration.routes}" as="route" iteration="routeIterator">
{route.route}{f:if(condition: '{routeIterator.isLast}', then: '', else: ', ')}
</f:for>
</f:then>
<f:else>
<f:render section="none" />
</f:else>
</f:if>
</div>
</div>
</li>
</ul>
</f:if>
<div class="card-footer">
<f:if condition="{page.siteIdentifier}">
<div class="d-flex justify-content-between">
<div class="btn-group">
<f:be.link
route="site_configuration.detail"
parameters="{site: page.siteIdentifier}"
class="btn btn-default"
>
<core:icon identifier="actions-system-options-view" />
<f:translate key="overview.btn.details" domain="backend.siteconfiguration" />
</f:be.link>
</div>
<div class="btn-group">
<f:be.link
route="site_configuration.edit"
parameters="{site: page.siteIdentifier}"
title="{f:translate(key:'overview.editSiteConfiguration', domain:'backend.siteconfiguration')}"
class="btn btn-default"
>
<core:icon identifier="actions-open" />
</f:be.link>
<f:if condition="{page.siteConfiguration.sets -> f:count()} > 0">
<f:then>
<f:be.link
route="site_configuration.editSettings"
parameters="{site: page.siteIdentifier, returnUrl: returnUrl}"
title="{f:translate(key:'overview.editSiteSettings', domain:'backend.siteconfiguration')}"
class="btn btn-default"
>
<core:icon identifier="actions-cog" />
</f:be.link>
</f:then>
<f:else>
<button
disabled
type="button"
class="btn btn-default"
title="{f:translate(key:'overview.editSiteSettingsUnavailable', domain:'backend.siteconfiguration')}"
>
<core:icon identifier="actions-cog" />
</button>
</f:else>
</f:if>
<button
type="submit"
class="btn btn-default t3js-modal-trigger"
form="form-site-configuration-delete"
name="site"
value="{page.siteIdentifier}"
title="{f:translate(key:'overview.deleteSiteConfiguration', domain:'backend.siteconfiguration')}"
data-severity="error"
data-title="{f:translate(key:'overview.deleteSiteConfiguration', domain:'backend.siteconfiguration')}"
data-button-close-text="{f:translate(key:'cancel', domain: 'core.common')}"
data-button-ok-text="{f:translate(key:'delete', domain: 'core.common')}"
>
<core:icon identifier="actions-delete" />
</button>
</div>
</div>
</f:if>
</div>
</div>
</f:for>
</div>
</f:section>
<f:section name="none">
<div class="d-none d-sm-inline">
<core:icon identifier="actions-close" />
<span class="visually-hidden">
<f:translate key="overview.none" domain="backend.siteconfiguration" />
</span>
</div>
<div class="d-inline d-sm-none">
<f:translate key="overview.none" domain="backend.siteconfiguration" />
</div>
</f:section>
</html>