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
+555
View File
@@ -0,0 +1,555 @@
<?php
use TYPO3\CMS\Backend\Controller;
use TYPO3\CMS\Backend\Security\SudoMode\Access\AccessLifetime;
/**
* Definitions for routes provided by EXT:backend
* Contains all AJAX-based routes for entry points
*
* Currently the "access" property is only used so no token creation + validation is made
* but will be extended further.
*/
return [
// Rename resource
'resource_rename' => [
'path' => '/resource/rename',
'methods' => ['POST'],
'target' => Controller\Resource\ResourceController::class . '::renameResourceAction',
'inheritAccessFromModule' => 'media_management',
],
// Gather resource information
'resource_gather' => [
'path' => '/resource/gather',
'methods' => ['GET'],
'target' => Controller\Resource\ResourceController::class . '::gatherInformationAction',
'inheritAccessFromModule' => 'media_management',
],
// Replace resource
'resource_replace' => [
'path' => '/resource/replace',
'methods' => ['POST'],
'target' => Controller\Resource\ResourceController::class . '::replaceResourceAction',
'inheritAccessFromModule' => 'media_management',
],
// Link resource
'link_resource' => [
'path' => '/link/resource',
'methods' => ['POST'],
'target' => Controller\LinkController::class . '::resourceAction',
],
// File processing
'file_process' => [
'path' => '/file/process',
'target' => Controller\File\FileController::class . '::processAjaxRequest',
'inheritAccessFromModule' => 'media_management',
],
// Check if file exists
'file_exists' => [
'path' => '/file/exists',
'target' => Controller\File\FileController::class . '::fileExistsInFolderAction',
'inheritAccessFromModule' => 'media_management',
],
// Get details of a file reference in FormEngine
'file_reference_details' => [
'path' => '/file/reference/details',
'target' => Controller\FormFilesAjaxController::class . '::detailsAction',
],
// Create a new file reference in FormEngine
'file_reference_create' => [
'path' => '/file/reference/create',
'methods' => ['POST'],
'target' => Controller\FormFilesAjaxController::class . '::createAction',
],
// Synchronize localization of a file reference in FormEngine
'file_reference_synchronizelocalize' => [
'path' => '/file/reference/synchronizelocalize',
'methods' => ['POST'],
'target' => Controller\FormFilesAjaxController::class . '::synchronizeLocalizeAction',
],
// Expand / Collapse a file reference in FormEngine
'file_reference_expandcollapse' => [
'path' => '/file/reference/expandcollapse',
'methods' => ['POST'],
'target' => Controller\FormFilesAjaxController::class . '::expandOrCollapseAction',
],
// Get record details of a child record in IRRE
'record_inline_details' => [
'path' => '/record/inline/details',
'target' => Controller\FormInlineAjaxController::class . '::detailsAction',
],
// Create new inline element
'record_inline_create' => [
'path' => '/record/inline/create',
'target' => Controller\FormInlineAjaxController::class . '::createAction',
],
// Synchronize localization
'record_inline_synchronizelocalize' => [
'path' => '/record/inline/synchronizelocalize',
'target' => Controller\FormInlineAjaxController::class . '::synchronizeLocalizeAction',
],
// Expand / Collapse inline record
'record_inline_expandcollapse' => [
'path' => '/record/inline/expandcollapse',
'target' => Controller\FormInlineAjaxController::class . '::expandOrCollapseAction',
],
// Site configuration inline create route
'site_configuration_inline_create' => [
'path' => '/siteconfiguration/inline/create',
'target' => Controller\SiteInlineAjaxController::class . '::newInlineChildAction',
'inheritAccessFromModule' => 'site_configuration',
],
// Validate slug input
'record_slug_suggest' => [
'path' => '/record/slug/suggest',
'target' => Controller\FormSlugAjaxController::class . '::suggestAction',
],
// Site configuration inline open existing "record" route
'site_configuration_inline_details' => [
'path' => '/siteconfiguration/inline/details',
'target' => Controller\SiteInlineAjaxController::class . '::openInlineChildAction',
'inheritAccessFromModule' => 'site_configuration',
],
// Add a flex form section container
'record_flex_container_add' => [
'path' => '/record/flex/containeradd',
'target' => Controller\FormFlexAjaxController::class . '::containerAdd',
],
// FormEngine suggest wizard result generator
'record_suggest' => [
'path' => '/wizard/suggest/search',
'target' => \TYPO3\CMS\Backend\Controller\Wizard\SuggestWizardController::class . '::searchAction',
],
// Fetch the tree-structured data from a record for the tree selection
'record_tree_data' => [
'path' => '/record/tree/fetchData',
'target' => Controller\FormSelectTreeAjaxController::class . '::fetchDataAction',
],
// Get data for page tree
'page_tree_data' => [
'path' => '/page/tree/fetchData',
'target' => Controller\Page\TreeController::class . '::fetchDataAction',
],
// Get rootline for page tree
'page_tree_rootline' => [
'path' => '/page/tree/fetchRootline',
'target' => Controller\Page\TreeController::class . '::fetchRootlineAction',
],
// Get data for page tree
'page_tree_filter' => [
'path' => '/page/tree/filterData',
'target' => Controller\Page\TreeController::class . '::filterDataAction',
],
// Get page tree configuration
'page_tree_configuration' => [
'path' => '/page/tree/fetchConfiguration',
'target' => Controller\Page\TreeController::class . '::fetchConfigurationAction',
],
// Get page tree configuration for element browser and link handler
'page_tree_browser_configuration' => [
'path' => '/browser/page/tree/fetchConfiguration',
'target' => Controller\Page\TreeController::class . '::fetchReadOnlyConfigurationAction',
],
// Set temporary mount point
'page_tree_set_temporary_mount_point' => [
'path' => '/page/tree/setTemporaryMountPoint',
'target' => Controller\Page\TreeController::class . '::setTemporaryMountPointAction',
],
// Get data for file storage tree
'filestorage_tree_data' => [
'path' => '/filestorage/tree/fetchData',
'methods' => ['GET'],
'target' => Controller\FileStorage\TreeController::class . '::fetchDataAction',
],
// Get rootline for file storage tree
'filestorage_tree_rootline' => [
'path' => '/filestorage/tree/fetchRootline',
'target' => Controller\FileStorage\TreeController::class . '::fetchRootlineAction',
],
// Get filtered data for filestorage tree
'filestorage_tree_filter' => [
'path' => '/filestorage/tree/filterData',
'methods' => ['GET'],
'target' => Controller\FileStorage\TreeController::class . '::filterDataAction',
],
// Bookmark management API
'bookmark_list' => [
'path' => '/bookmark/list',
'methods' => ['GET'],
'target' => Controller\BookmarkController::class . '::listAction',
],
'bookmark_create' => [
'path' => '/bookmark/create',
'methods' => ['POST'],
'target' => Controller\BookmarkController::class . '::createAction',
],
'bookmark_update' => [
'path' => '/bookmark/update',
'methods' => ['POST'],
'target' => Controller\BookmarkController::class . '::updateAction',
],
'bookmark_delete' => [
'path' => '/bookmark/delete',
'methods' => ['POST'],
'target' => Controller\BookmarkController::class . '::deleteAction',
],
'bookmark_reorder' => [
'path' => '/bookmark/reorder',
'methods' => ['POST'],
'target' => Controller\BookmarkController::class . '::reorderAction',
],
'bookmark_delete_multiple' => [
'path' => '/bookmark/delete-multiple',
'methods' => ['POST'],
'target' => Controller\BookmarkController::class . '::deleteMultipleAction',
],
'bookmark_move' => [
'path' => '/bookmark/move',
'methods' => ['POST'],
'target' => Controller\BookmarkController::class . '::moveAction',
],
// Bookmark group management
'bookmark_group_create' => [
'path' => '/bookmark/group/create',
'methods' => ['POST'],
'target' => Controller\BookmarkController::class . '::createGroupAction',
],
'bookmark_group_update' => [
'path' => '/bookmark/group/update',
'methods' => ['POST'],
'target' => Controller\BookmarkController::class . '::updateGroupAction',
],
'bookmark_group_delete' => [
'path' => '/bookmark/group/delete',
'methods' => ['POST'],
'target' => Controller\BookmarkController::class . '::deleteGroupAction',
],
'bookmark_group_reorder' => [
'path' => '/bookmark/group/reorder',
'methods' => ['POST'],
'target' => Controller\BookmarkController::class . '::reorderGroupsAction',
],
// Flush caches from the clear cache toolbar item
'clearcache_group_pages' => [
'path' => '/cache/group/pages/flush',
'methods' => ['POST'],
'target' => Controller\ClearCacheController::class . '::flushCacheGroupPagesAction',
],
'clearcache_group_all' => [
'path' => '/cache/group/all/flush',
'methods' => ['POST'],
'target' => Controller\ClearCacheController::class . '::flushCacheGroupAllAction',
],
'clearcache_page' => [
'path' => '/cache/page/flush',
'methods' => ['POST'],
'target' => Controller\ClearCacheController::class . '::flushCachePageAction',
],
// Render systeminformation toolbar item
'systeminformation_render' => [
'path' => '/system-information/render',
'target' => \TYPO3\CMS\Backend\Controller\SystemInformationController::class . '::renderMenuAction',
'parameters' => [
'skipSessionUpdate' => 1,
],
],
// Reload the module menu
'modulemenu' => [
'path' => '/module-menu',
'target' => Controller\BackendController::class . '::getModuleMenu',
],
'topbar' => [
'path' => '/topbar',
'target' => Controller\BackendController::class . '::getTopbar',
],
// Log in into backend
'login' => [
'path' => '/login',
'target' => \TYPO3\CMS\Backend\Controller\AjaxLoginController::class . '::loginAction',
'access' => 'public',
],
// Log out from backend
'logout' => [
'path' => '/logout',
'target' => \TYPO3\CMS\Backend\Controller\AjaxLoginController::class . '::logoutAction',
'access' => 'public',
],
// Preflight check for login form
'login_preflight' => [
'path' => '/login/preflight',
'target' => \TYPO3\CMS\Backend\Controller\AjaxLoginController::class . '::preflightAction',
'access' => 'public',
],
// Refresh login of backend
'login_refresh' => [
'path' => '/login/refresh',
'target' => \TYPO3\CMS\Backend\Controller\AjaxLoginController::class . '::refreshAction',
],
// Check if backend session has timed out
'login_timedout' => [
'path' => '/login/timedout',
'target' => \TYPO3\CMS\Backend\Controller\AjaxLoginController::class . '::isTimedOutAction',
'access' => 'public',
'parameters' => [
'skipSessionUpdate' => 1,
],
],
// Switch user
'switch_user' => [
'path' => '/switch/user',
'methods' => ['POST'],
'target' => Controller\SwitchUserController::class . '::switchUserAction',
],
'switch_user_exit' => [
'path' => '/switch/user/exit',
'methods' => ['POST'],
'target' => Controller\SwitchUserController::class . '::exitSwitchUserAction',
],
// Multi-factor authentication configuration
'mfa' => [
'path' => '/mfa',
'target' => Controller\MfaAjaxController::class . '::handleRequest',
'sudoMode' => [
'group' => 'mfa',
'lifetime' => AccessLifetime::medium,
],
],
// Load context menu for
'contextmenu' => [
'path' => '/context-menu',
'target' => Controller\ContextMenuController::class . '::getContextMenuAction',
],
// Load context menu for
'contextmenu_clipboard' => [
'path' => '/context-menu/clipboard',
'target' => Controller\ContextMenuController::class . '::clipboardAction',
],
// Process data handler commands
'record_process' => [
'path' => '/record/process',
'target' => Controller\SimpleDataHandlerController::class . '::processAjaxRequest',
],
// Process user settings
'usersettings_process' => [
'path' => '/usersettings/process',
'target' => Controller\UserSettingsController::class . '::processAjaxRequest',
],
// Open the image manipulation wizard
'wizard_image_manipulation' => [
'path' => '/wizard/image-manipulation',
'target' => \TYPO3\CMS\Backend\Controller\Wizard\ImageManipulationController::class . '::getWizardContent',
],
// Search records
'livesearch' => [
'path' => '/livesearch/search',
'target' => Controller\LiveSearchController::class . '::searchAction',
],
// Get livesearch form
'livesearch_form' => [
'path' => '/livesearch/form',
'target' => Controller\LiveSearchController::class . '::formAction',
],
// Save a newly added online media
'online_media_create' => [
'path' => '/online-media/create',
'target' => Controller\OnlineMediaController::class . '::createAction',
],
// Get icon from IconFactory
'icons' => [
'path' => '/icons',
'target' => \TYPO3\CMS\Core\Controller\IconController::class . '::getIcon',
],
// Encode typolink parts on demand
'link_browser_encodetypolink' => [
'path' => '/link-browser/encode-typolink',
'target' => \TYPO3\CMS\Backend\Controller\LinkBrowserController::class . '::encodeTypoLink',
],
// Localization Wizard
'wizard_localization_get_record' => [
'path' => '/wizard/localization/record',
'target' => Controller\Wizard\LocalizationController::class . '::getRecord',
],
'wizard_localization_get_targets' => [
'path' => '/wizard/localization/targets',
'target' => Controller\Wizard\LocalizationController::class . '::getTargets',
],
'wizard_localization_get_sources' => [
'path' => '/wizard/localization/sources',
'target' => Controller\Wizard\LocalizationController::class . '::getSources',
],
'wizard_localization_get_modes' => [
'path' => '/wizard/localization/modes',
'target' => Controller\Wizard\LocalizationController::class . '::getModes',
],
'wizard_localization_get_handlers' => [
'path' => '/wizard/localization/handlers',
'target' => Controller\Wizard\LocalizationController::class . '::getHandlers',
],
'wizard_localization_get_content' => [
'path' => '/wizard/localization/content',
'target' => Controller\Wizard\LocalizationController::class . '::getContent',
],
'wizard_localization_localize' => [
'path' => '/wizard/localization/localize',
'target' => Controller\Wizard\LocalizationController::class . '::localize',
],
// column selector
'show_columns' => [
'path' => '/show/columns',
'methods' => ['POST'],
'target' => \TYPO3\CMS\Backend\Controller\ColumnSelectorController::class . '::updateVisibleColumnsAction',
],
'show_columns_selector' => [
'path' => '/show/columns/selector',
'target' => \TYPO3\CMS\Backend\Controller\ColumnSelectorController::class . '::showColumnsSelectorAction',
],
// Record download in records module
'record_download_settings' => [
'path' => '/record/download/settings',
'target' => \TYPO3\CMS\Backend\Controller\RecordListDownloadController::class . '::downloadSettingsAction',
],
// Toggle record visibility
'record_toggle_visibility' => [
'path' => '/record/toggle-visibility',
'methods' => ['POST'],
'target' => \TYPO3\CMS\Backend\Controller\RecordListController::class . '::toggleRecordVisibilityAction',
],
// Endpoint to generate a password
'password_generate' => [
'path' => '/password/generate',
'target' => \TYPO3\CMS\Core\Controller\PasswordGeneratorController::class . '::generate',
],
'security_csp_control' => [
'access' => 'systemMaintainer',
'path' => '/security/csp/control',
'target' => \TYPO3\CMS\Backend\Security\ContentSecurityPolicy\CspAjaxController::class . '::handleRequest',
'inheritAccessFromModule' => 'content_security_policy',
],
'sudo_mode_control' => [
'path' => '/sudo-mode/verify',
'target' => Controller\Security\SudoModeController::class . '::verifyAction',
],
// Get TSRef
'codeeditor_tsref' => [
'path' => '/code-editor/tsref',
'target' => \TYPO3\CMS\Backend\Controller\CodeEditor\TypoScriptReferenceController::class . '::loadReference',
],
// Load code completion templates
'codeeditor_codecompletion_loadtemplates' => [
'path' => '/code-editor/codecompletion/load-templates',
'target' => \TYPO3\CMS\Backend\Controller\CodeEditor\CodeCompletionController::class . '::loadCompletions',
],
'color_scheme_update' => [
'path' => '/color-scheme/update',
'target' => Controller\ColorSchemeController::class . '::updateAction',
],
// QR Code
'qrcode_generator' => [
'path' => '/qrcode/generate',
'target' => Controller\QrCodeController::class . '::getQrCodeAction',
'methods' => ['GET'],
],
'qrcode_download' => [
'path' => '/qrcode/download',
'target' => Controller\QrCodeController::class . '::downloadAction',
'methods' => ['POST'],
],
'wizard_page_get_doktypes' => [
'path' => '/wizard/page/doktypes',
'target' => Controller\Wizard\PageWizardController::class . '::getDoktypesAction',
'methods' => ['GET'],
],
'wizard_page_get_page_detail' => [
'path' => '/wizard/page/page-detail',
'target' => Controller\Wizard\PageWizardController::class . '::getPageDetailAction',
'methods' => ['GET'],
],
'wizard_page_get_processed_value' => [
'path' => '/wizard/page/processed-value',
'target' => Controller\Wizard\PageWizardController::class . '::getProcessedValueAction',
'methods' => ['GET'],
],
'wizard_config' => [
'path' => '/wizard/config',
'target' => Controller\Wizard\WizardController::class . '::getConfigurationAction',
'methods' => ['GET'],
],
'wizard_submit' => [
'path' => '/wizard/submit',
'target' => Controller\Wizard\WizardController::class . '::submitDataAction',
'methods' => ['POST'],
],
// Switch primary language wizard
'switch_primary_language_count' => [
'path' => '/switch-language/count',
'target' => \Local\Multilanguage\Controller\SwitchPrimaryLanguageController::class . '::countAction',
'methods' => ['GET'],
],
'switch_primary_language_execute' => [
'path' => '/switch-language/execute',
'target' => \Local\Multilanguage\Controller\SwitchPrimaryLanguageController::class . '::executeAction',
'methods' => ['POST'],
],
];
+219
View File
@@ -0,0 +1,219 @@
<?php
use TYPO3\CMS\Backend\Controller\AboutController;
use TYPO3\CMS\Backend\Controller\PageLayoutController;
use TYPO3\CMS\Backend\Controller\PageTsConfig\PageTsConfigActiveController;
use TYPO3\CMS\Backend\Controller\PageTsConfig\PageTsConfigIncludesController;
use TYPO3\CMS\Backend\Controller\PageTsConfig\PageTsConfigRecordsOverviewController;
use TYPO3\CMS\Backend\Controller\RecordListController;
use TYPO3\CMS\Backend\Controller\SetupModuleController;
use TYPO3\CMS\Backend\Controller\SiteConfigurationController;
use TYPO3\CMS\Backend\Controller\SiteSettingsController;
use TYPO3\CMS\Backend\Security\ContentSecurityPolicy\CspModuleController;
use TYPO3\CMS\Backend\View\PageViewMode;
use TYPO3\CMS\Backend\View\SetupModuleViewMode;
use TYPO3\CMS\Backend\View\SetupSettingsViewMode;
/**
* Definitions for modules provided by EXT:backend
*/
return [
'web_layout' => [
'parent' => 'content',
'position' => ['before' => '*'],
'access' => 'user',
'path' => '/module/web/layout',
'iconIdentifier' => 'module-page',
'labels' => 'backend.modules.layout',
'routes' => [
'_default' => [
'target' => PageLayoutController::class . '::mainAction',
],
],
'moduleData' => [
'viewMode' => PageViewMode::LayoutView->value,
'showHidden' => true,
],
],
'records' => [
'parent' => 'content',
'position' => ['after' => 'web_layout'],
'access' => 'user',
'path' => '/module/content/records',
'iconIdentifier' => 'module-list',
'labels' => 'backend.modules.list',
'aliases' => ['web_list'],
'routes' => [
'_default' => [
'target' => RecordListController::class . '::mainAction',
],
],
'moduleData' => [
'clipBoard' => true,
'searchBox' => false,
'collapsedTables' => [],
],
],
'content_status' => [
'parent' => 'content',
'position' => ['after' => 'web_FormFormbuilder', 'before' => 'recycler'],
'access' => 'user',
'path' => '/module/content/status',
'iconIdentifier' => 'module-info',
'labels' => 'backend.modules.status',
'aliases' => ['web_info'],
'navigationComponent' => '@typo3/backend/tree/page-tree-element',
'appearance' => [
'dependsOnSubmodules' => true,
],
'showSubmoduleOverview' => true,
],
'site_configuration' => [
'parent' => 'site',
'position' => ['before' => '*'],
'access' => 'admin',
'path' => '/module/site/configuration',
'iconIdentifier' => 'module-sites',
'labels' => 'backend.modules.site_configuration',
'routes' => [
'_default' => [
'target' => SiteConfigurationController::class . '::overviewAction',
],
'detail' => [
'target' => SiteConfigurationController::class . '::detailAction',
],
'edit' => [
'target' => SiteConfigurationController::class . '::editAction',
],
'save' => [
'target' => SiteConfigurationController::class . '::saveAction',
'methods' => ['POST'],
],
'delete' => [
'target' => SiteConfigurationController::class . '::deleteAction',
'methods' => ['POST'],
],
'editSettings' => [
'target' => SiteSettingsController::class . '::editAction',
],
'saveSettings' => [
'target' => SiteSettingsController::class . '::saveAction',
'methods' => ['POST'],
],
'dumpSettings' => [
'target' => SiteSettingsController::class . '::dumpAction',
'methods' => ['POST'],
],
],
'moduleData' => [
'viewMode' => SetupModuleViewMode::TILES->value,
'settingsMode' => SetupSettingsViewMode::BASIC->value,
],
],
'link_management' => [
'parent' => 'site',
'position' => ['after' => 'site_configuration'],
'access' => 'user',
'path' => '/module/link-management',
'iconIdentifier' => 'module-urls',
'labels' => 'backend.modules.link_management',
'appearance' => [
'dependsOnSubmodules' => true,
],
'showSubmoduleOverview' => true,
],
'about' => [
'parent' => 'help',
'position' => ['before' => '*'],
'access' => 'user',
'path' => '/module/help/about',
'iconIdentifier' => 'module-about',
'labels' => 'backend.modules.about',
'aliases' => ['help_AboutAbout'],
'routes' => [
'_default' => [
'target' => AboutController::class . '::handleRequest',
],
],
],
'pagetsconfig' => [
'parent' => 'site',
'access' => 'admin',
'path' => '/module/pagetsconfig',
'iconIdentifier' => 'module-tsconfig',
'labels' => 'backend.modules.pagetsconfig',
'navigationComponent' => '@typo3/backend/tree/page-tree-element',
],
'pagetsconfig_pages' => [
'parent' => 'pagetsconfig',
'access' => 'admin',
'path' => '/module/pagetsconfig/records',
'iconIdentifier' => 'module-tsconfig',
'labels' => 'backend.modules.pagetsconfig_pages',
'routes' => [
'_default' => [
'target' => PageTsConfigRecordsOverviewController::class . '::handleRequest',
],
],
],
'pagetsconfig_active' => [
'parent' => 'pagetsconfig',
'access' => 'admin',
'path' => '/module/pagetsconfig/active',
'iconIdentifier' => 'module-tsconfig',
'labels' => 'backend.modules.pagetsconfig_active',
'routes' => [
'_default' => [
'target' => PageTsConfigActiveController::class . '::handleRequest',
],
],
'moduleData' => [
'sortAlphabetically' => true,
'displayComments' => true,
'displayConstantSubstitutions' => true,
'pageTsConfigConditions' => [],
],
],
'pagetsconfig_includes' => [
'parent' => 'pagetsconfig',
'access' => 'admin',
'path' => '/module/pagetsconfig/includes',
'iconIdentifier' => 'module-tsconfig',
'labels' => 'backend.modules.pagetsconfig_includes',
'routes' => [
'_default' => [
'target' => PageTsConfigIncludesController::class . '::indexAction',
],
'source' => [
'target' => PageTsConfigIncludesController::class . '::sourceAction',
],
'sourceWithIncludes' => [
'target' => PageTsConfigIncludesController::class . '::sourceWithIncludesAction',
],
],
],
'content_security_policy' => [
'parent' => 'system',
'access' => 'systemMaintainer',
'iconIdentifier' => 'module-security',
'labels' => 'backend.modules.content_security_policy',
'aliases' => ['tools_csp'],
'routes' => [
'_default' => [
'target' => CspModuleController::class . '::mainAction',
],
],
],
'user_setup' => [
'parent' => 'user',
'access' => 'user',
'path' => '/module/user/setup',
'iconIdentifier' => 'module-setup',
'labels' => 'backend.modules.user_settings',
'routes' => [
'_default' => [
'target' => SetupModuleController::class . '::mainAction',
],
],
],
];
+308
View File
@@ -0,0 +1,308 @@
<?php
use TYPO3\CMS\Backend\Controller;
use TYPO3\CMS\Backend\Security\SudoMode\Access\AccessLifetime;
/**
* Definitions for routes provided by EXT:backend
* Contains all "regular" routes for entry points
*
* Please note that this setup is preliminary until all core use-cases are set up here.
* Especially some more properties regarding modules will be added until TYPO3 CMS 7 LTS, and might change.
*
* Currently the "access" property is only used so no token creation + validation is made,
* but will be extended further.
*/
return [
// Login screen of the TYPO3 Backend
'login' => [
'path' => '/login',
'access' => 'public',
'target' => Controller\LoginController::class . '::formAction',
],
// Main backend rendering setup (previously called backend.php) for the TYPO3 Backend
'main' => [
'path' => '/main',
'referrer' => 'required,refresh-always',
'target' => Controller\BackendController::class . '::mainAction',
],
// IFrame dummy-url for browser-history state tracking of web component backend modules
'state-tracker' => [
'path' => '/state-tracker',
'access' => 'public',
'target' => Controller\StateTrackerController::class . '::mainAction',
],
// Logout script for the TYPO3 Backend
'logout' => [
'path' => '/logout',
'target' => Controller\LogoutController::class . '::logoutAction',
],
// Show the password forgotten form for entering the email
'password_forget' => [
'path' => '/login/password-reset/forget',
'access' => 'public',
'target' => Controller\ResetPasswordController::class . '::forgetPasswordFormAction',
],
// Send out the password reset email
'password_forget_initiate_reset' => [
'path' => '/login/password-reset/initiate-reset',
'access' => 'public',
'methods' => ['POST'],
'target' => Controller\ResetPasswordController::class . '::initiatePasswordResetAction',
],
'password_reset_validate' => [
'path' => '/login/password-reset/validate',
'access' => 'public',
'target' => Controller\ResetPasswordController::class . '::passwordResetAction',
],
'password_reset_finish' => [
'path' => '/login/password-reset/finish',
'access' => 'public',
'methods' => ['POST'],
'target' => Controller\ResetPasswordController::class . '::passwordResetFinishAction',
],
'sudo_mode_module' => [
'path' => '/sudo-mode/module',
'target' => Controller\Security\SudoModeController::class . '::moduleAction',
],
'sudo_mode_apply' => [
'path' => '/sudo-mode/apply',
'target' => Controller\Security\SudoModeController::class . '::applyAction',
],
'sudo_mode_error' => [
'path' => '/sudo-mode/error',
'target' => Controller\Security\SudoModeController::class . '::errorAction',
],
// Register login frameset
'login_frameset' => [
'path' => '/login/frame',
'access' => 'public',
'target' => Controller\LoginController::class . '::refreshAction',
],
// Fetch RequestToken via AJAX
'login_request_token' => [
'path' => '/login/request-token',
'access' => 'public',
'methods' => ['POST'],
'target' => Controller\LoginController::class . '::requestTokenAction',
],
// Authentication endpoint for Multi-factor authentication
'auth_mfa' => [
'path' => '/auth/mfa',
'target' => Controller\MfaController::class . '::handleRequest',
],
// Standalone setup endpoint for Multi-factor authentication
'setup_mfa' => [
'path' => '/setup/mfa',
'target' => Controller\MfaSetupController::class . '::handleRequest',
],
// Multi-factor authentication configuration
'mfa' => [
'path' => '/mfa',
'target' => Controller\MfaConfigurationController::class . '::handleRequest',
'sudoMode' => [
'group' => 'mfa',
'lifetime' => AccessLifetime::medium,
],
],
/** Wizards */
// Register add wizard
'wizard_add' => [
'path' => '/wizard/add',
'target' => Controller\Wizard\AddController::class . '::mainAction',
],
// Register list wizard
'wizard_list' => [
'path' => '/wizard/list',
'target' => Controller\Wizard\ListController::class . '::mainAction',
],
// Register edit wizard
'wizard_edit' => [
'path' => '/wizard/edit',
'target' => Controller\Wizard\EditController::class . '::mainAction',
],
// Register wizard element browser
'wizard_element_browser' => [
'path' => '/wizard/record/browse',
'target' => Controller\ElementBrowserController::class . '::mainAction',
],
// Register link wizard
'wizard_link' => [
'path' => '/wizard/link/browse',
'target' => Controller\LinkBrowserController::class . '::mainAction',
],
/** File- and folder-related routes */
// Add new online media
'online_media' => [
'path' => '/online-media',
'target' => Controller\OnlineMediaController::class . '::mainAction',
],
/** DB Records-related routes */
// Record download in records module
'record_download' => [
'path' => '/record/download',
'methods' => ['POST'],
'target' => Controller\RecordListDownloadController::class . '::handleDownloadRequest',
],
// Register record history module
'record_history' => [
'path' => '/record/history',
'target' => Controller\ContentElement\ElementHistoryController::class . '::mainAction',
],
// Register new record
'db_new' => [
'path' => '/record/new',
'target' => Controller\NewRecordController::class . '::mainAction',
'redirect' => [
'enable' => true,
'parameters' => [
'id' => true,
],
],
],
// Register sort pages
'pages_sort' => [
'path' => '/pages/sort',
'target' => Controller\Page\SortSubPagesController::class . '::mainAction',
],
// Register create multiple pages
'pages_new' => [
'path' => '/pages/new',
'target' => Controller\Page\NewMultiplePagesController::class . '::mainAction',
'redirect' => [
'enable' => true,
'parameters' => [
'id' => true,
],
],
],
// Register new content element module (used in a modal)
'new_content_element_wizard' => [
'path' => '/record/content/wizard/new',
'target' => Controller\ContentElement\NewContentElementController::class . '::handleRequest',
],
// Register move page + move content element view
'move_page' => [
'path' => '/page/move',
'target' => Controller\Page\MovePageController::class . '::mainAction',
],
'move_element' => [
'path' => '/record/move',
'target' => Controller\ContentElement\MoveElementController::class . '::mainAction',
],
// Register show item module
'show_item' => [
'path' => '/record/info',
'target' => Controller\ContentElement\ElementInformationController::class . '::mainAction',
],
// Dummy document - displays nothing but background color.
'dummy' => [
'path' => '/empty',
'target' => Controller\DummyController::class . '::mainAction',
],
/** TYPO3 Core Engine-related routes */
/**
* TCE gateway (TYPO3 Core Engine) for database handling
* This script is a gateway for POST forms to \TYPO3\CMS\Core\DataHandling\DataHandler
* that manipulates all information in the database!!
* For syntax and API information, see the document 'TYPO3 Core APIs'
*/
'tce_db' => [
'path' => '/record/commit',
'target' => Controller\SimpleDataHandlerController::class . '::mainAction',
],
/**
* Gateway for TCE (TYPO3 Core Engine) file-handling through POST forms.
* This script serves as the file administration part of the TYPO3 Core Engine.
* Basically it includes two libraries which are used to manipulate files on the server.
*
* For syntax and API information, see the document 'TYPO3 Core APIs'
*/
'tce_file' => [
'path' => '/file/commit',
'target' => Controller\File\FileController::class . '::mainAction',
],
/**
* Main form rendering script
* By sending certain parameters to this script you can bring up a form
* which allows the user to edit the content of one or more database records.
*/
'record_edit' => [
'path' => '/record/edit',
'target' => Controller\EditDocumentController::class . '::mainAction',
'redirect' => [
'enable' => true,
'parameters' => [
'edit' => true,
'defVals' => true,
'columnsOnly' => true,
'module' => true,
],
],
'options' => [
'requestPageContext' => true,
],
],
// Lightweight contextual edit form for the context panel
'record_edit_contextual' => [
'path' => '/record/edit/contextual',
'target' => Controller\ContextualRecordEditController::class . '::mainAction',
],
// Image processing
'image_processing' => [
'path' => '/image/process',
'target' => Controller\File\ImageProcessController::class . '::process',
],
// Clipboard processing
'clipboard_process' => [
'path' => '/clipboard/process',
'methods' => ['POST'],
'target' => Controller\ClipboardController::class . '::processRequest',
],
// Request thumbnail, created on-demand
'resource_request_thumbnail' => [
'path' => '/resource/request-thumbnail',
'methods' => ['GET'],
'target' => Controller\Resource\ResourceController::class . '::requestThumbnailAction',
],
// Language domain
'language_domain' => [
'path' => '/language/domain/{locale}/{cacheBustInfix}/{domain}',
'methods' => ['GET'],
'target' => Controller\JavaScriptLanguageDomainController::class . '::getLanguageDomainAction',
// Do not require a request token
'access' => 'public',
],
];
+59
View File
@@ -0,0 +1,59 @@
<?php
use TYPO3\CMS\Core\Page\JavaScriptModuleInstruction;
/**
* Addons for code editor
*/
return [
'highlightActiveLineGutter' => [
'module' => JavaScriptModuleInstruction::create('@codemirror/view', 'highlightActiveLineGutter')->invoke(),
],
'history' => [
'module' => JavaScriptModuleInstruction::create('@codemirror/commands', 'history')->invoke(),
'keymap' => JavaScriptModuleInstruction::create('@codemirror/commands', 'historyKeymap'),
],
'foldGutter' => [
'module' => JavaScriptModuleInstruction::create('@codemirror/language', 'foldGutter')->invoke(),
'keymap' => JavaScriptModuleInstruction::create('@codemirror/language', 'foldKeymap'),
],
'dropCursor' => [
'module' => JavaScriptModuleInstruction::create('@codemirror/view', 'dropCursor')->invoke(),
],
'indentOnInput' => [
'module' => JavaScriptModuleInstruction::create('@codemirror/language', 'indentOnInput')->invoke(),
],
'bracketMatching' => [
'module' => JavaScriptModuleInstruction::create('@codemirror/language', 'bracketMatching')->invoke(),
],
'closeBrackets' => [
'module' => JavaScriptModuleInstruction::create('@codemirror/autocomplete', 'closeBrackets')->invoke(),
'keymap' => JavaScriptModuleInstruction::create('@codemirror/autocomplete', 'closeBracketsKeymap'),
],
'autocompletion' => [
'module' => JavaScriptModuleInstruction::create('@codemirror/autocomplete', 'autocompletion')->invoke(),
'keymap' => JavaScriptModuleInstruction::create('@codemirror/autocomplete', 'completionKeymap'),
],
'rectangularSelection' => [
'module' => JavaScriptModuleInstruction::create('@codemirror/view', 'rectangularSelection')->invoke(),
],
'crosshairCursor' => [
'module' => JavaScriptModuleInstruction::create('@codemirror/view', 'crosshairCursor')->invoke(),
],
'highlightActiveLine' => [
'module' => JavaScriptModuleInstruction::create('@codemirror/view', 'highlightActiveLine')->invoke(),
],
'highlightSelectionMatches' => [
'module' => JavaScriptModuleInstruction::create('@codemirror/search', 'highlightSelectionMatches')->invoke(),
'keymap' => JavaScriptModuleInstruction::create('@codemirror/search', 'searchKeymap'),
],
'lint' => [
'keymap' => JavaScriptModuleInstruction::create('@codemirror/lint', 'lintKeymap'),
],
/*
'hint/typoscript-hint' => [
'module' => 'TYPO3/CMS/T3editor/Addon/Hint/TypoScriptHint',
'modes' => ['typoscript'],
],
*/
];
+42
View File
@@ -0,0 +1,42 @@
<?php
use TYPO3\CMS\Core\Page\JavaScriptModuleInstruction;
/**
* Mode definitions for code editor
*/
return [
'css' => [
'module' => JavaScriptModuleInstruction::create('@codemirror/lang-css', 'css')->invoke(),
'extensions' => ['css'],
],
'html' => [
'module' => JavaScriptModuleInstruction::create('@codemirror/lang-html', 'html')->invoke(),
'extensions' => ['htm', 'html'],
'default' => true,
],
'javascript' => [
'module' => JavaScriptModuleInstruction::create('@codemirror/lang-javascript', 'javascript')->invoke(),
'extensions' => ['javascript'],
],
'json' => [
'module' => JavaScriptModuleInstruction::create('@codemirror/lang-json', 'json')->invoke(),
'extensions' => ['json'],
],
'php' => [
'module' => JavaScriptModuleInstruction::create('@codemirror/lang-php', 'php')->invoke(),
'extensions' => ['php', 'php5', 'php7', 'phps'],
],
'sql' => [
'module' => JavaScriptModuleInstruction::create('@codemirror/lang-sql', 'sql')->invoke(),
'extensions' => ['sql'],
],
'typoscript' => [
'module' => JavaScriptModuleInstruction::create('@typo3/backend/code-editor/language/typoscript.js', 'typoscript')->invoke(),
'extensions' => ['ts', 'typoscript', 'tsconfig'],
],
'xml' => [
'module' => JavaScriptModuleInstruction::create('@codemirror/lang-xml', 'xml')->invoke(),
'extensions' => ['xml'],
],
];
+56
View File
@@ -0,0 +1,56 @@
<?php
declare(strict_types=1);
use TYPO3\CMS\Core\Security\ContentSecurityPolicy\Directive;
use TYPO3\CMS\Core\Security\ContentSecurityPolicy\Mutation;
use TYPO3\CMS\Core\Security\ContentSecurityPolicy\MutationCollection;
use TYPO3\CMS\Core\Security\ContentSecurityPolicy\MutationMode;
use TYPO3\CMS\Core\Security\ContentSecurityPolicy\Scope;
use TYPO3\CMS\Core\Security\ContentSecurityPolicy\SourceKeyword;
use TYPO3\CMS\Core\Security\ContentSecurityPolicy\SourceScheme;
use TYPO3\CMS\Core\Security\ContentSecurityPolicy\UriValue;
use TYPO3\CMS\Core\Type\Map;
/**
* Provides a simple basic Content-Security-Policy for the generic backend scope.
*/
return Map::fromEntries([
Scope::backend(),
new MutationCollection(
new Mutation(MutationMode::Extend, Directive::DefaultSrc, SourceKeyword::self),
// script-src 'nonce-...' required for importmaps
new Mutation(MutationMode::Extend, Directive::ScriptSrc, SourceKeyword::nonceProxy),
// `style-src 'unsafe-inline'` required for lit in safari and firefox to allow inline <style> tags
// (for browsers that do not support https://caniuse.com/mdn-api_shadowroot_adoptedstylesheets)
new Mutation(MutationMode::Extend, Directive::StyleSrc, SourceKeyword::unsafeInline),
// `style-src-attr 'unsafe-inline'` required for remaining inline styles, which is okay for color & dimension
// (e.g. `<div style="color: #000">` - but NOT having the possibility to use any other assets/files/URIs)
new Mutation(MutationMode::Set, Directive::StyleSrcAttr, SourceKeyword::unsafeInline),
// allow `data:` images
new Mutation(MutationMode::Extend, Directive::ImgSrc, SourceScheme::data),
// `frame-src self` required for backend nav and list iframes
new Mutation(MutationMode::Extend, Directive::FrameSrc, SourceKeyword::self),
// deny `<base>` element which might be used for cross-origin targets
new Mutation(MutationMode::Set, Directive::BaseUri, SourceKeyword::none),
// deny `<object>` and `<embed>` elements
new Mutation(MutationMode::Set, Directive::ObjectSrc, SourceKeyword::none),
// Allows to fetch media assets from YouTube and Vimeo and their associated CDNs,
// to be embedded in an `<iframe>` of the corresponding info modal in the file list
// backend module.
new Mutation(
MutationMode::Extend,
Directive::FrameSrc,
new UriValue('*.youtube-nocookie.com'),
new UriValue('*.youtube.com'),
new UriValue('*.vimeo.com')
),
new Mutation(
MutationMode::Extend,
Directive::ImgSrc,
new UriValue('*.ytimg.com'),
new UriValue('*.vimeocdn.com')
),
),
]);
+63
View File
@@ -0,0 +1,63 @@
<?php
return [
'dependencies' => [
'core',
],
'imports' => [
'@typo3/backend/' => [
'path' => 'EXT:backend/Resources/Public/JavaScript/',
'exclude' => [
'EXT:backend/Resources/Public/JavaScript/Contrib/',
],
],
'bootstrap' => 'EXT:backend/Resources/Public/JavaScript/Contrib/bootstrap.js',
'crelt' => 'EXT:backend/Resources/Public/JavaScript/Contrib/crelt.js',
'style-mod' => 'EXT:backend/Resources/Public/JavaScript/Contrib/style-mod.js',
'w3c-keyname' => 'EXT:backend/Resources/Public/JavaScript/Contrib/w3c-keyname.js',
'@lezer/common' => 'EXT:backend/Resources/Public/JavaScript/Contrib/@lezer/common.js',
'@lezer/css' => 'EXT:backend/Resources/Public/JavaScript/Contrib/@lezer/css.js',
'@lezer/html' => 'EXT:backend/Resources/Public/JavaScript/Contrib/@lezer/html.js',
'@lezer/javascript' => 'EXT:backend/Resources/Public/JavaScript/Contrib/@lezer/javascript.js',
'@lezer/json' => 'EXT:backend/Resources/Public/JavaScript/Contrib/@lezer/json.js',
'@lezer/php' => 'EXT:backend/Resources/Public/JavaScript/Contrib/@lezer/php.js',
'@lezer/xml' => 'EXT:backend/Resources/Public/JavaScript/Contrib/@lezer/xml.js',
'@lezer/lr' => 'EXT:backend/Resources/Public/JavaScript/Contrib/@lezer/lr.js',
'@lezer/highlight' => 'EXT:backend/Resources/Public/JavaScript/Contrib/@lezer/highlight.js',
'@codemirror/autocomplete' => 'EXT:backend/Resources/Public/JavaScript/Contrib/@codemirror/autocomplete.js',
'@codemirror/closebrackets' => 'EXT:backend/Resources/Public/JavaScript/Contrib/@codemirror/closebrackets.js',
'@codemirror/commands' => 'EXT:backend/Resources/Public/JavaScript/Contrib/@codemirror/commands.js',
'@codemirror/comment' => 'EXT:backend/Resources/Public/JavaScript/Contrib/@codemirror/comment.js',
'@codemirror/fold' => 'EXT:backend/Resources/Public/JavaScript/Contrib/@codemirror/fold.js',
'@codemirror/gutter' => 'EXT:backend/Resources/Public/JavaScript/Contrib/@codemirror/gutter.js',
'@codemirror/highlight' => 'EXT:backend/Resources/Public/JavaScript/Contrib/@codemirror/highlight.js',
'@codemirror/history' => 'EXT:backend/Resources/Public/JavaScript/Contrib/@codemirror/history.js',
'@codemirror/language' => 'EXT:backend/Resources/Public/JavaScript/Contrib/@codemirror/language.js',
'@codemirror/lang-css' => 'EXT:backend/Resources/Public/JavaScript/Contrib/@codemirror/lang-css.js',
'@codemirror/lang-html' => 'EXT:backend/Resources/Public/JavaScript/Contrib/@codemirror/lang-html.js',
'@codemirror/lang-javascript' => 'EXT:backend/Resources/Public/JavaScript/Contrib/@codemirror/lang-javascript.js',
'@codemirror/lang-json' => 'EXT:backend/Resources/Public/JavaScript/Contrib/@codemirror/lang-json.js',
'@codemirror/lang-php' => 'EXT:backend/Resources/Public/JavaScript/Contrib/@codemirror/lang-php.js',
'@codemirror/lang-sql' => 'EXT:backend/Resources/Public/JavaScript/Contrib/@codemirror/lang-sql.js',
'@codemirror/lang-xml' => 'EXT:backend/Resources/Public/JavaScript/Contrib/@codemirror/lang-xml.js',
'@codemirror/lint' => 'EXT:backend/Resources/Public/JavaScript/Contrib/@codemirror/lint.js',
'@codemirror/matchbrackets' => 'EXT:backend/Resources/Public/JavaScript/Contrib/@codemirror/matchbrackets.js',
'@codemirror/panel' => 'EXT:backend/Resources/Public/JavaScript/Contrib/@codemirror/panel.js',
'@codemirror/rangeset' => 'EXT:backend/Resources/Public/JavaScript/Contrib/@codemirror/rangeset.js',
'@codemirror/rectangular-selection' => 'EXT:backend/Resources/Public/JavaScript/Contrib/@codemirror/rectangular-selection.js',
'@codemirror/search' => 'EXT:backend/Resources/Public/JavaScript/Contrib/@codemirror/search.js',
'@codemirror/state' => 'EXT:backend/Resources/Public/JavaScript/Contrib/@codemirror/state.js',
'@codemirror/text' => 'EXT:backend/Resources/Public/JavaScript/Contrib/@codemirror/text.js',
'@codemirror/tooltip' => 'EXT:backend/Resources/Public/JavaScript/Contrib/@codemirror/tooltip.js',
'@codemirror/theme-one-dark' => 'EXT:backend/Resources/Public/JavaScript/Contrib/@codemirror/theme-one-dark.js',
'@codemirror/view' => 'EXT:backend/Resources/Public/JavaScript/Contrib/@codemirror/view.js',
'mark.js' => 'EXT:backend/Resources/Public/JavaScript/Contrib/markjs.js',
// legacy, please use "mark.js" instead
'@typo3/backend/contrib/mark.js' => 'EXT:backend/Resources/Public/JavaScript/Contrib/markjs.js',
'alwan' => 'EXT:backend/Resources/Public/JavaScript/Contrib/alwan.js',
'lodash-es' => 'EXT:backend/Resources/Public/JavaScript/Contrib/lodash-es.js',
'select-pure' => 'EXT:backend/Resources/Public/JavaScript/Contrib/select-pure.js',
// Note: The prefix 'VIRTUAL:' is an @internal placeholder and not meant for public usage
'~labels/' => 'VIRTUAL:labels/',
],
];
+118
View File
@@ -0,0 +1,118 @@
<?php
/**
* An array consisting of implementations of middlewares for a middleware stack to be registered
*
* ```
* 'stackname' => [
* 'middleware-identifier' => [
* 'target' => classname or callable
* 'before/after' => array of dependencies
* ]
* ]
* ```
*/
return [
'backend' => [
/** internal: do not use or reference this middleware in your own code */
'typo3/cms-core/normalized-params-attribute' => [
'target' => \TYPO3\CMS\Core\Middleware\NormalizedParamsAttribute::class,
],
'typo3/cms-backend/locked-backend' => [
'target' => \TYPO3\CMS\Backend\Middleware\LockedBackendGuard::class,
'after' => [
'typo3/cms-core/normalized-params-attribute',
],
],
'typo3/cms-backend/https-redirector' => [
'target' => \TYPO3\CMS\Backend\Middleware\ForcedHttpsBackendRedirector::class,
'after' => [
'typo3/cms-core/normalized-params-attribute',
'typo3/cms-backend/locked-backend',
],
],
'typo3/cms-backend/csp-report' => [
'target' => \TYPO3\CMS\Backend\Middleware\ContentSecurityPolicyReporter::class,
'after' => [
'typo3/cms-core/normalized-params-attribute',
'typo3/cms-backend/https-redirector',
],
'before' => [
'typo3/cms-backend/backend-routing',
],
],
'typo3/cms-backend/backend-routing' => [
'target' => \TYPO3\CMS\Backend\Middleware\BackendRouteInitialization::class,
'after' => [
'typo3/cms-backend/https-redirector',
],
],
'typo3/cms-core/request-token-middleware' => [
'target' => \TYPO3\CMS\Core\Middleware\RequestTokenMiddleware::class,
'after' => [
'typo3/cms-backend/backend-routing',
],
'before' => [
'typo3/cms-backend/authentication',
],
],
'typo3/cms-backend/authentication' => [
'target' => \TYPO3\CMS\Backend\Middleware\BackendUserAuthenticator::class,
'after' => [
'typo3/cms-backend/backend-routing',
],
],
'typo3/cms-backend/backend-module-validator' => [
'target' => \TYPO3\CMS\Backend\Middleware\BackendModuleValidator::class,
'after' => [
'typo3/cms-backend/authentication',
],
],
'typo3/cms-backend/sudo-mode-interceptor' => [
'target' => \TYPO3\CMS\Backend\Middleware\SudoModeInterceptor::class,
'after' => [
'typo3/cms-backend/backend-module-validator',
],
],
'typo3/cms-backend/site-resolver' => [
'target' => \TYPO3\CMS\Backend\Middleware\SiteResolver::class,
'after' => [
'typo3/cms-backend/sudo-mode-interceptor',
],
],
'typo3/cms-backend/page-context' => [
'target' => \TYPO3\CMS\Backend\Middleware\PageContextInitialization::class,
'after' => [
'typo3/cms-backend/site-resolver',
],
],
/** internal: do not use or reference this middleware in your own code */
'typo3/cms-backend/csp-headers' => [
'target' => \TYPO3\CMS\Backend\Middleware\ContentSecurityPolicyHeaders::class,
'after' => [
'typo3/cms-backend/authentication',
],
],
/** internal: do not use or reference this middleware in your own code */
'typo3/cms-backend/js-label-importmap-resolver' => [
'target' => \TYPO3\CMS\Backend\Middleware\JavaScriptLabelImportMapEntryResolver::class,
'after' => [
'typo3/cms-backend/csp-headers',
],
],
/** internal: do not use or reference this middleware in your own code */
'typo3/cms-backend/response-headers' => [
'target' => \TYPO3\CMS\Backend\Middleware\AdditionalResponseHeaders::class,
'after' => [
'typo3/cms-backend/js-label-importmap-resolver',
],
],
/** internal: do not use or reference this middleware in your own code */
'typo3/cms-core/response-propagation' => [
'target' => \TYPO3\CMS\Core\Middleware\ResponsePropagation::class,
'after' => [
'typo3/cms-backend/response-headers',
],
],
],
];
+81
View File
@@ -0,0 +1,81 @@
<?php
declare(strict_types=1);
namespace TYPO3\CMS\Backend;
use Symfony\Component\DependencyInjection\ChildDefinition;
use Symfony\Component\DependencyInjection\ContainerBuilder;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
use TYPO3\CMS\Backend\Attribute\AsAvatarProvider;
use TYPO3\CMS\Backend\Attribute\AsController;
use TYPO3\CMS\Backend\Attribute\AsSidebarComponent;
use TYPO3\CMS\Backend\ContextMenu\ItemProviders\ProviderInterface;
use TYPO3\CMS\Backend\DependencyInjection\AvatarProviderPass;
use TYPO3\CMS\Backend\DependencyInjection\ModuleAccessGatePass;
use TYPO3\CMS\Backend\DependencyInjection\SidebarComponentsPass;
use TYPO3\CMS\Backend\ElementBrowser\ElementBrowserInterface;
use TYPO3\CMS\Backend\Form\NodeInterface;
use TYPO3\CMS\Backend\Localization\LocalizationHandlerInterface;
use TYPO3\CMS\Backend\Search\LiveSearch\SearchProviderInterface;
use TYPO3\CMS\Backend\Toolbar\ToolbarItemInterface;
use TYPO3\CMS\Core\Attribute\AsModuleAccessGate;
use TYPO3\CMS\Core\DependencyInjection\PublicServicePass;
return static function (ContainerConfigurator $container, ContainerBuilder $containerBuilder) {
$containerBuilder->registerForAutoconfiguration(ElementBrowserInterface::class)->addTag('recordlist.elementbrowser');
$containerBuilder->registerForAutoconfiguration(ToolbarItemInterface::class)->addTag('backend.toolbar.item');
$containerBuilder->registerForAutoconfiguration(ProviderInterface::class)->addTag('backend.contextmenu.itemprovider');
$containerBuilder->registerForAutoconfiguration(SearchProviderInterface::class)->addTag('livesearch.provider');
$containerBuilder->registerForAutoconfiguration(NodeInterface::class)->addTag('backend.form.node');
$containerBuilder->registerForAutoconfiguration(LocalizationHandlerInterface::class)->addTag('backend.localization.handler');
$containerBuilder->addCompilerPass(new PublicServicePass('backend.controller'));
// Single NodeInterface nodes *may* be stateful, for instance when they have properties that are not
// properly reset in render(), or if stateful services are injected. Thus, the second argument is true,
// which will trigger a new object creation each time, instead of re-using an already existing one.
// Note we *may* be able to get rid of this later (to create fewer objects), but it may need some changes,
// plus proper communication that single nodes have to be set "shared: false" manually, in case they are stateful.
$containerBuilder->addCompilerPass(new PublicServicePass('backend.form.node', true));
$containerBuilder->addCompilerPass(new PublicServicePass('backend.form.dataprovider'));
$containerBuilder->addCompilerPass(new AvatarProviderPass('backend.avatar_provider'));
$containerBuilder->addCompilerPass(new SidebarComponentsPass(AsSidebarComponent::TAG_NAME));
$containerBuilder->addCompilerPass(new ModuleAccessGatePass(AsModuleAccessGate::TAG_NAME));
// adds tag backend.controller to services
$containerBuilder->registerAttributeForAutoconfiguration(
AsController::class,
static function (ChildDefinition $definition, AsController $attribute): void {
$definition->addTag(AsController::TAG_NAME);
}
);
// Autoconfigure backend avatar providers
$containerBuilder->registerAttributeForAutoconfiguration(
AsAvatarProvider::class,
static function (ChildDefinition $definition, AsAvatarProvider $attribute): void {
$definition->addTag(AsAvatarProvider::TAG_NAME, [
'identifier' => $attribute->identifier,
'before' => implode(',', $attribute->before),
'after' => implode(',', $attribute->after),
]);
},
);
// Autoconfigure backend sidebar components
$containerBuilder->registerAttributeForAutoconfiguration(
AsSidebarComponent::class,
static function (ChildDefinition $definition, AsSidebarComponent $attribute): void {
$definition->addTag(AsSidebarComponent::TAG_NAME, [
'identifier' => $attribute->identifier,
'before' => implode(',', $attribute->before),
'after' => implode(',', $attribute->after),
]);
},
);
};
+80
View File
@@ -0,0 +1,80 @@
services:
_defaults:
autowire: true
autoconfigure: true
public: false
TYPO3\CMS\Backend\:
resource: '../Classes/*'
backend.middlewares:
class: ArrayObject
factory: ['@TYPO3\CMS\Core\Http\MiddlewareStackResolver', 'resolve']
arguments: ['backend']
public: true
TYPO3\CMS\Backend\Clipboard\Clipboard:
shared: false
public: true
TYPO3\CMS\Backend\ContextMenu\ItemProviders\ItemProvidersRegistry:
arguments:
- !tagged_iterator backend.contextmenu.itemprovider
# ModuleTemplate instantiated using factory.
TYPO3\CMS\Backend\Template\ModuleTemplate: ~
# Not a service, not injectable
TYPO3\CMS\Backend\Module\ModuleInterface: ~
# Breadcrumb component with providers
TYPO3\CMS\Backend\Template\Components\Breadcrumb:
arguments:
$providers: !tagged_iterator backend.breadcrumb.provider
# Auto-tag breadcrumb providers
_instanceof:
TYPO3\CMS\Backend\Breadcrumb\BreadcrumbProviderInterface:
tags: ['backend.breadcrumb.provider']
TYPO3\CMS\Backend\Search\LiveSearch\SearchProviderRegistry:
arguments:
- !tagged_iterator livesearch.provider
TYPO3\CMS\Backend\Search\LiveSearch\DatabaseRecordProvider:
tags:
- { name: 'livesearch.provider', priority: 50 }
TYPO3\CMS\Backend\Search\LiveSearch\PageRecordProvider:
tags:
- { name: 'livesearch.provider', priority: 60 }
# Localization handler registry
TYPO3\CMS\Backend\Localization\LocalizationHandlerRegistry:
arguments:
- !tagged_iterator backend.localization.handler
TYPO3\CMS\Backend\ElementBrowser\DatabaseBrowser:
shared: false
TYPO3\CMS\Backend\ElementBrowser\ElementBrowserRegistry:
arguments:
- !tagged_iterator recordlist.elementbrowser
# Toolbar registry
TYPO3\CMS\Backend\Toolbar\ToolbarItemsRegistry:
arguments:
- !tagged_iterator backend.toolbar.item
backendPasswordRecovery.rateLimiterFactory:
class: TYPO3\CMS\Core\RateLimiter\RateLimiterFactory
arguments:
$config:
id: 'backend-password-recovery'
policy: 'sliding_window'
limit: 3
interval: '30 minutes'
TYPO3\CMS\Backend\Authentication\PasswordReset:
arguments:
$rateLimiterFactory: '@backendPasswordRecovery.rateLimiterFactory'
+128
View File
@@ -0,0 +1,128 @@
<?php
return [
'ctrl' => [
'label' => 'identifier',
'title' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site.ctrl.title',
'typeicon_classes' => [
'default' => 'mimetypes-x-content-domain',
],
],
'columns' => [
'identifier' => [
'label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site.identifier',
'description' => 'LLL:EXT:backend/Resources/Private/Language/siteconfiguration_fieldinformation.xlf:site.identifier',
'config' => [
'type' => 'input',
'size' => 35,
'max' => 255,
'required' => true,
// identifier is used as directory name - allow a-z,0-9,_,- as chars only.
// unique is additionally checked server side
'eval' => 'lower, alphanum_x, trim',
],
],
'rootPageId' => [
'label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site.rootPageId',
'description' => 'LLL:EXT:backend/Resources/Private/Language/siteconfiguration_fieldinformation.xlf:site.rootPageId',
'config' => [
'type' => 'select',
'readOnly' => true,
'renderType' => 'selectSingle',
'foreign_table' => 'pages',
'foreign_table_where' => ' AND ({#is_siteroot}=1 OR ({#pid}=0 AND {#doktype} IN (1,6,7))) AND {#l10n_parent} = 0 ORDER BY pid, sorting',
],
],
'base' => [
'label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site.base',
'description' => 'LLL:EXT:backend/Resources/Private/Language/siteconfiguration_fieldinformation.xlf:site.base',
'config' => [
'type' => 'input',
'required' => true,
'eval' => 'trim',
],
],
'baseVariants' => [
'label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site.baseVariants',
'description' => 'LLL:EXT:backend/Resources/Private/Language/siteconfiguration_fieldinformation.xlf:site.baseVariants',
'config' => [
'type' => 'inline',
'foreign_table' => 'site_base_variant',
'appearance' => [
'enabledControls' => [
'info' => false,
],
],
],
],
'websiteTitle' => [
'label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site.websiteTitle',
'description' => 'LLL:EXT:backend/Resources/Private/Language/siteconfiguration_fieldinformation.xlf:site.websiteTitle',
'config' => [
'type' => 'input',
'eval' => 'trim',
'default' => '',
],
],
'dependencies' => [
'label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site.dependencies',
'description' => 'LLL:EXT:backend/Resources/Private/Language/siteconfiguration_fieldinformation.xlf:site.dependencies',
'config' => [
'type' => 'select',
'renderType' => 'selectMultipleSideBySide',
'itemsProcFunc' => \TYPO3\CMS\Core\Site\TcaSiteSetCollector::class . '->populateSiteSets',
'size' => 5,
'maxitems' => 9999,
],
],
'languages' => [
'label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site.languages',
'description' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site.languages.description',
'config' => [
'type' => 'siteLanguage',
],
],
'errorHandling' => [
'label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site.errorHandling',
'config' => [
'type' => 'inline',
'foreign_table' => 'site_errorhandling',
'appearance' => [
'collapseAll' => true,
'enabledControls' => [
'info' => false,
],
],
],
],
'routes' => [
'label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site.routes',
'config' => [
'type' => 'inline',
'foreign_table' => 'site_route',
'appearance' => [
'collapseAll' => true,
'enabledControls' => [
'info' => false,
],
],
],
],
],
'types' => [
'0' => [
'showitem' => '--palette--;;default,--palette--;;base,dependencies,
--div--;LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site.tab.languages, languages,
--div--;LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site.tab.errorHandling, errorHandling,
--div--;LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site.tab.routes, routes',
],
],
'palettes' => [
'default' => [
'showitem' => 'rootPageId, identifier, --linebreak--, websiteTitle',
],
'base' => [
'showitem' => 'base, baseVariants',
],
],
];
@@ -0,0 +1,46 @@
<?php
return [
'ctrl' => [
'label' => 'base',
'label_alt' => 'condition',
'label_alt_force' => true,
'title' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_base_variant.ctrl.title',
'typeicon_classes' => [
'default' => 'mimetypes-x-content-domain',
],
],
'columns' => [
'base' => [
'label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_base_variant.base',
'description' => 'LLL:EXT:backend/Resources/Private/Language/siteconfiguration_fieldinformation.xlf:site_base_variant.base',
'config' => [
'type' => 'input',
'required' => true,
'eval' => 'trim',
'placeholder' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_base_variant.base.placeholder',
],
],
'condition' => [
'label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_base_variant.condition',
'description' => 'LLL:EXT:backend/Resources/Private/Language/siteconfiguration_fieldinformation.xlf:site_base_variant.condition',
'config' => [
'type' => 'input',
'required' => true,
'eval' => 'trim',
'valuePicker' => [
'items' => [
[ 'label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_base_variant.condition.applicationContext', 'value' => 'applicationContext == "Production"'],
[ 'label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_base_variant.condition.environmentVariable', 'value' => 'getenv("mycontext") == "production"'],
],
],
'placeholder' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_base_variant.condition.placeholder',
],
],
],
'types' => [
'1' => [
'showitem' => 'base,condition',
],
],
];
@@ -0,0 +1,151 @@
<?php
return [
'ctrl' => [
'label' => 'errorHandler',
'label_userFunc' => \TYPO3\CMS\Backend\Configuration\TCA\UserFunctions::class . '->getErrorHandlingTitle',
'title' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_errorhandling.ctrl.title',
'type' => 'errorHandler',
'typeicon_column' => 'errorHandler',
'typeicon_classes' => [
'default' => 'default-not-found',
'Fluid' => 'mimetypes-text-html',
'Page' => 'apps-pagetree-page-content-from-page',
'PHP' => 'mimetypes-text-php',
'LoginRedirect' => 'content-elements-login',
],
],
'columns' => [
'errorCode' => [
'label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_errorhandling.errorCode',
'description' => 'LLL:EXT:backend/Resources/Private/Language/siteconfiguration_fieldinformation.xlf:site_errorhandling.errorCode',
'config' => [
'type' => 'number',
'required' => true,
'range' => [
'lower' => 0,
'upper' => 599,
],
'size' => 8,
'default' => 404,
'valuePicker' => [
'items' => [
['label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_errorhandling.errorCode.404', 'value' => '404'],
['label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_errorhandling.errorCode.403', 'value' => '403'],
['label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_errorhandling.errorCode.500', 'value' => '500'],
['label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_errorhandling.errorCode.503', 'value' => '503'],
['label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_errorhandling.errorCode.0', 'value' => '0'],
],
],
],
],
'errorHandler' => [
'label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_errorhandling.errorHandler',
'config' => [
'type' => 'select',
'renderType' => 'selectSingle',
'required' => true,
'items' => [
['label' => '', 'value' => ''],
['label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_errorhandling.errorHandler.fluid', 'value' => 'Fluid'],
['label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_errorhandling.errorHandler.page', 'value' => 'Page'],
['label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_errorhandling.errorHandler.php', 'value' => 'PHP'],
['label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_errorhandling.errorHandler.loginRedirect', 'value' => 'LoginRedirect'],
],
],
],
'errorFluidTemplate' => [
'label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_errorhandling.errorFluidTemplate',
'description' => 'LLL:EXT:backend/Resources/Private/Language/siteconfiguration_fieldinformation.xlf:site_errorhandling.errorFluidTemplate',
'config' => [
'type' => 'input',
'required' => true,
'eval' => 'trim',
'placeholder' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_errorhandling.errorFluidTemplate.placeholder',
],
],
'errorFluidTemplatesRootPath' => [
'label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_errorhandling.errorFluidTemplatesRootPath',
'config' => [
'type' => 'input',
'eval' => 'trim',
],
],
'errorFluidLayoutsRootPath' => [
'label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_errorhandling.errorFluidLayoutsRootPath',
'config' => [
'type' => 'input',
'eval' => 'trim',
],
],
'errorFluidPartialsRootPath' => [
'label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_errorhandling.errorFluidPartialsRootPath',
'config' => [
'type' => 'input',
'eval' => 'trim',
],
],
'errorContentSource' => [
'label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_errorhandling.errorContentSource',
'config' => [
'type' => 'link',
'required' => true,
'allowedTypes' => ['page', 'url', 'record'],
],
],
'errorPhpClassFQCN' => [
'label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_errorhandling.errorPhpClassFQCN',
'description' => 'LLL:EXT:backend/Resources/Private/Language/siteconfiguration_fieldinformation.xlf:site_errorhandling.errorPhpClassFQCN',
'config' => [
'type' => 'input',
'required' => true,
'eval' => 'trim',
'placeholder' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_errorhandling.errorPhpClassFQCN.placeholder',
],
],
'loginRedirectTarget' => [
'label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_errorhandling.loginRedirectTarget',
'config' => [
'type' => 'link',
'required' => true,
'allowedTypes' => ['page'],
],
],
'loginRedirectParameter' => [
'label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_errorhandling.loginRedirectParameter',
'config' => [
'type' => 'select',
'renderType' => 'selectSingle',
'required' => true,
'items' => [
['label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_errorhandling.loginRedirectParameter.return_url', 'value' => 'return_url'],
['label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_errorhandling.loginRedirectParameter.redirect_url', 'value' => 'redirect_url'],
],
],
],
],
'types' => [
'1' => [
'showitem' => '--palette--;;general',
],
'Fluid' => [
'showitem' => '--palette--;;general, errorFluidTemplate,
--div--;LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_errorhandling.tab.rootpaths,
errorFluidTemplatesRootPath, errorFluidLayoutsRootPath, errorFluidPartialsRootPath',
],
'Page' => [
'showitem' => '--palette--;;general, errorContentSource',
],
'PHP' => [
'showitem' => '--palette--;;general, errorPhpClassFQCN',
],
'LoginRedirect' => [
'showitem' => '--palette--;;general, loginRedirectTarget, loginRedirectParameter',
],
],
'palettes' => [
'general' => [
'showitem' => 'errorCode, errorHandler',
],
],
];
@@ -0,0 +1,183 @@
<?php
return [
'ctrl' => [
'label' => 'languageId',
'label_userFunc' => \TYPO3\CMS\Backend\Configuration\TCA\UserFunctions::class . '->getSiteLanguageTitle',
'title' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_language.ctrl.title',
'typeicon_classes' => [
'default' => 'mimetypes-x-content-domain',
],
],
'columns' => [
'languageId' => [
'label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_language.languageId',
'config' => [
'type' => 'select',
'renderType' => 'selectSingle',
'itemsProcFunc' => \TYPO3\CMS\Backend\Configuration\TCA\ItemsProcessorFunctions::class . '->populateAvailableLanguagesFromSites',
],
],
'title' => [
'label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_language.title',
'config' => [
'type' => 'input',
'size' => 15,
'required' => true,
'eval' => 'trim',
'placeholder' => 'English',
],
],
'navigationTitle' => [
'label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_language.navigationTitle',
'description' => 'LLL:EXT:backend/Resources/Private/Language/siteconfiguration_fieldinformation.xlf:site_language.navigationTitle',
'config' => [
'type' => 'input',
'size' => 15,
'eval' => 'trim',
'placeholder' => 'English',
],
],
'base' => [
'label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_language.base',
'description' => 'LLL:EXT:backend/Resources/Private/Language/siteconfiguration_fieldinformation.xlf:site_language.base',
'config' => [
'type' => 'input',
'required' => true,
'eval' => 'trim',
'size' => 15,
'default' => '/',
'placeholder' => '/',
],
],
'websiteTitle' => [
'label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_language.websiteTitle',
'description' => 'LLL:EXT:backend/Resources/Private/Language/siteconfiguration_fieldinformation.xlf:site_language.websiteTitle',
'config' => [
'type' => 'input',
'eval' => 'trim',
'default' => '',
],
],
'locale' => [
'label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_language.locale',
'description' => 'LLL:EXT:backend/Resources/Private/Language/siteconfiguration_fieldinformation.xlf:site_language.locale',
'config' => [
'type' => 'input',
'required' => true,
'eval' => 'trim',
'size' => 20,
'placeholder' => 'en-US',
'valuePicker' => [
'items' => \TYPO3\CMS\Backend\Configuration\TCA\UserFunctions::getAllSystemLocales(),
],
],
],
'hreflang' => [
'label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_language.hreflang',
'description' => 'LLL:EXT:backend/Resources/Private/Language/siteconfiguration_fieldinformation.xlf:site_language.hreflang',
'config' => [
'type' => 'input',
'eval' => 'trim',
'size' => 6,
'default' => '',
'placeholder' => 'en-US',
],
],
'languageTag' => [
'label' => 'Language Tag',
'description' => 'IETF language tag, e.g. "en", "de", "de-CH"',
'config' => [
'type' => 'input',
'eval' => 'trim',
'size' => 10,
'max' => 35,
'default' => '',
],
],
'enabled' => [
'label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_language.enabled',
'config' => [
'type' => 'check',
'renderType' => 'checkboxToggle',
'default' => 1,
],
],
'flag' => [
'label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_language.flag',
'config' => [
'type' => 'select',
'renderType' => 'selectSingle',
'itemGroups' => [
'misc' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_language.flag.group.misc',
'countries' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_language.flag.group.countries',
'colors' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_language.flag.group.colors',
],
'itemsProcFunc' => \TYPO3\CMS\Backend\Configuration\TCA\ItemsProcessorFunctions::class . '->populateFlags',
'items' => [
['label' => 'default', 'value' => 'global', 'icon' => 'flags-multiple', 'group' => 'misc'],
['label' => 'en-us-gb', 'value' => 'en-us-gb', 'icon' => 'flags-en-us-gb', 'group' => 'misc'],
['label' => 'eu', 'value' => 'eu', 'icon' => 'flags-eu', 'group' => 'misc'],
],
'sortItems' => [
'label' => 'asc',
],
'fieldWizard' => [
'selectIcons' => [
'disabled' => false,
],
],
],
],
'fallbackType' => [
'label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_language.fallbackType',
'displayCond' => 'FIELD:languageId:>:0',
'config' => [
'type' => 'select',
'renderType' => 'selectSingle',
'items' => [
['label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_language.fallbackType.strict', 'value' => 'strict'],
['label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_language.fallbackType.fallback', 'value' => 'fallback'],
['label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_language.fallbackType.free', 'value' => 'free'],
],
],
],
'fallbacks' => [
'label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_language.fallbacks',
'displayCond' => 'FIELD:languageId:>:0',
'config' => [
'type' => 'select',
'renderType' => 'selectMultipleSideBySide',
'itemsProcFunc' => \TYPO3\CMS\Backend\Configuration\TCA\ItemsProcessorFunctions::class . '->populateFallbackLanguages',
'size' => 5,
'min' => 0,
],
],
'primary' => [
'label' => 'Primary Language',
'config' => [
'type' => 'check',
'renderType' => 'checkboxToggle',
'default' => 0,
],
],
],
'types' => [
'1' => [
'showitem' => '--palette--;;default, --palette--;;rendering-related, flag, --palette--;;languageIdPalette',
],
],
'palettes' => [
'default' => [
'showitem' => 'title, enabled, --linebreak--, locale, hreflang, languageTag, --linebreak--, base',
],
'languageIdPalette' => [
'showitem' => 'languageId, primary',
'isHiddenPalette' => true,
],
'rendering-related' => [
'label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_language.palette.frontend',
'showitem' => 'websiteTitle, navigationTitle, --linebreak--, fallbackType, --linebreak--, fallbacks',
],
],
];
@@ -0,0 +1,99 @@
<?php
return [
'ctrl' => [
'label' => 'route',
'label_userFunc' => \TYPO3\CMS\Backend\Configuration\TCA\UserFunctions::class . '->getRouteTitle',
'title' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_route.ctrl.title',
'type' => 'type',
'typeicon_column' => 'type',
'typeicon_classes' => [
'staticText' => 'mimetypes-text-html',
'asset' => 'mimetypes-text-html',
'uri' => 'apps-pagetree-page-content-from-page',
],
],
'columns' => [
'route' => [
'label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_route.route',
'config' => [
'type' => 'input',
'required' => true,
'eval' => 'trim',
'placeholder' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_route.route.placeholder',
'valuePicker' => [
'items' => [
['label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_route.route.example1', 'value' => 'robots.txt'],
],
],
],
],
'type' => [
'label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_route.type',
'config' => [
'type' => 'select',
'renderType' => 'selectSingle',
'required' => true,
'items' => [
['label' => '', 'value' => ''],
['label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_route.staticText', 'value' => 'staticText'],
['label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_route.source', 'value' => 'uri'],
['label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_route.asset', 'value' => 'asset'],
],
],
],
'content' => [
'label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_route.staticText',
'config' => [
'type' => 'text',
'required' => true,
'valuePicker' => [
'items' => [
['label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_route.staticText.example1', 'value' => 'User-agent: *
Disallow: /typo3/
Disallow: /typo3_src/
Disallow: /fileadmin/user_upload/_temp_/importexport
# Uncomment the following line if you have a sitemap enabled. Replace the domain with your own.
# Sitemap: https://www.example.org/sitemap.xml
'],
],
],
],
],
'source' => [
'label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_route.source',
'config' => [
'type' => 'link',
'required' => true,
'allowedTypes' => ['page', 'url', 'record', 'file'],
],
],
'asset' => [
'label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_route.asset',
'config' => [
'type' => 'input',
'eval' => 'trim',
'required' => true,
'valuePicker' => [
'items' => [
['label' => 'LLL:EXT:backend/Resources/Private/Language/locallang_siteconfiguration_tca.xlf:site_route.asset.example', 'value' => 'EXT:backend/Resources/Public/Icons/favicon.ico'],
],
],
],
],
],
'types' => [
'1' => [
'showitem' => 'route, type',
],
'staticText' => [
'showitem' => 'route, type, content',
],
'uri' => [
'showitem' => 'route, type, source',
],
'asset' => [
'showitem' => 'route, type, asset',
],
],
];
+265
View File
@@ -0,0 +1,265 @@
<?php
declare(strict_types=1);
use TYPO3\CMS\Backend\Backend\ColorScheme;
use TYPO3\CMS\Backend\UserFunctions\UserSettingsItemsProcFunc;
use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
defined('TYPO3') or die();
$GLOBALS['TCA']['be_users']['columns']['user_settings'] = [
'label' => 'backend.user_profile:user_settings',
'config' => [
'type' => 'json',
],
];
// Set up the showitem structure with tabs
$GLOBALS['TCA']['be_users']['columns']['user_settings']['showitem'] = '
--div--;core.form.tabs:personaldata,
--div--;core.form.tabs:account_security,
--div--;core.form.tabs:backend_appearance,
--div--;core.form.tabs:personalization';
// Personal data tab
ExtensionManagementUtility::addUserSetting(
'realName',
[
'inheritFromParent' => true,
],
'after:--div--;core.form.tabs:personaldata'
);
ExtensionManagementUtility::addUserSetting(
'email',
[
'inheritFromParent' => true,
],
'after:realName'
);
ExtensionManagementUtility::addUserSetting(
'emailMeAtLogin',
[
'label' => 'backend.user_profile:email_me_at_login',
'config' => [
'type' => 'check',
'renderType' => 'checkboxToggle',
],
],
'after:email'
);
ExtensionManagementUtility::addUserSetting(
'avatar',
[
'label' => 'backend.user_profile:avatar',
'config' => [
'type' => 'none',
'renderType' => 'avatar',
],
],
'after:emailMeAtLogin'
);
ExtensionManagementUtility::addUserSetting(
'lang',
[
'label' => 'backend.user_profile:language',
'table' => 'be_users',
'config' => [
'type' => 'select',
'renderType' => 'selectSingle',
'itemsProcFunc' => UserSettingsItemsProcFunc::class . '->addLanguageItems',
],
],
'after:avatar'
);
// Account security tab
ExtensionManagementUtility::addUserSetting(
'password',
[
'inheritFromParent' => true,
'label' => 'backend.user_profile:new_password',
],
'after:--div--;core.form.tabs:account_security'
);
ExtensionManagementUtility::addUserSetting(
'password2',
[
'label' => 'backend.user_profile:new_password_again',
'config' => [
'type' => 'password',
'passwordPolicy' => $GLOBALS['TYPO3_CONF_VARS']['BE']['passwordPolicy'] ?? '',
'size' => 20,
'required' => true,
],
],
'after:password'
);
ExtensionManagementUtility::addUserSetting(
'mfaProviders',
[
'label' => 'backend.user_profile:mfa_providers',
'config' => [
// @todo Use a new internal TCA type to prevent raw data being displayed in the backend
'type' => 'none',
'renderType' => 'mfaInfo',
],
'authenticationContext' => [
'group' => 'be.userManagement',
],
],
'after:password2'
);
// Backend appearance tab
ExtensionManagementUtility::addUserSetting(
'colorScheme',
[
'label' => 'backend.messages:colorScheme',
'config' => [
'type' => 'select',
'renderType' => 'selectSingle',
'items' => ColorScheme::getAvailableItemsForSelection(),
],
],
'after:--div--;core.form.tabs:backend_appearance'
);
ExtensionManagementUtility::addUserSetting(
'theme',
[
'label' => 'backend.messages:theme',
'config' => [
'type' => 'select',
'renderType' => 'selectSingle',
'items' => [
['label' => 'backend.messages:theme.fresh', 'value' => 'fresh'],
['label' => 'backend.messages:theme.modern', 'value' => 'modern'],
['label' => 'backend.messages:theme.classic', 'value' => 'classic'],
],
],
],
'after:colorScheme'
);
ExtensionManagementUtility::addUserSetting(
'startModule',
[
'label' => 'backend.user_profile:start_module',
'config' => [
'type' => 'select',
'renderType' => 'selectSingle',
'itemsProcFunc' => UserSettingsItemsProcFunc::class . '->renderStartModuleSelect',
'items' => [],
],
],
'after:theme'
);
ExtensionManagementUtility::addUserSetting(
'backendTitleFormat',
[
'label' => 'backend.user_profile:backend_title_format',
'config' => [
'type' => 'select',
'renderType' => 'selectSingle',
'items' => [
['label' => 'backend.user_profile:backend_title_format.title_first', 'value' => 'titleFirst'],
['label' => 'backend.user_profile:backend_title_format.sitename_first', 'value' => 'sitenameFirst'],
],
],
],
'after:startModule'
);
ExtensionManagementUtility::addUserSetting(
'dateTimeFirstDayOfWeek',
[
'label' => 'backend.user_profile:datetime_first_day_of_week',
'config' => [
'type' => 'select',
'renderType' => 'selectSingle',
'itemsProcFunc' => UserSettingsItemsProcFunc::class . '->renderDateTimeFirstDayOfWeekSelect',
'items' => [],
],
],
'after:backendTitleFormat'
);
// Personalization tab
ExtensionManagementUtility::addUserSetting(
'titleLen',
[
'label' => 'backend.user_profile:max_title_len',
'config' => [
'type' => 'number',
'size' => 5,
'range' => [
'lower' => 10,
'upper' => 255,
],
'default' => 50,
],
],
'after:--div--;core.form.tabs:personalization'
);
ExtensionManagementUtility::addUserSetting(
'edit_docModuleUpload',
[
'label' => 'backend.user_profile:edit_doc_module_upload',
'config' => [
'type' => 'check',
'renderType' => 'checkboxToggle',
],
],
'after:titleLen'
);
ExtensionManagementUtility::addUserSetting(
'showHiddenFilesAndFolders',
[
'label' => 'backend.user_profile:show_hidden_files_and_folders',
'config' => [
'type' => 'check',
'renderType' => 'checkboxToggle',
],
],
'after:edit_docModuleUpload'
);
ExtensionManagementUtility::addUserSetting(
'displayRecentlyUsed',
[
'label' => 'backend.user_profile:display_recently_used',
'persistentUpdate' => true,
'config' => [
'type' => 'check',
'renderType' => 'checkboxToggle',
'default' => 1,
],
],
'after:showHiddenFilesAndFolders'
);
ExtensionManagementUtility::addUserSetting(
'contextualRecordEdit',
[
'label' => 'backend.user_profile:contextual_record_edit',
'persistentUpdate' => true,
'config' => [
'type' => 'check',
'renderType' => 'checkboxToggle',
'default' => 1,
],
],
'after:edit_docModuleUpload'
);
ExtensionManagementUtility::addUserSetting(
'copyLevels',
[
'label' => 'backend.user_profile:copy_levels',
'config' => [
'type' => 'number',
'size' => 5,
'range' => [
'lower' => 0,
'upper' => 100,
],
'default' => 0,
],
],
'after:displayRecentlyUsed'
);
+56
View File
@@ -0,0 +1,56 @@
# Register default link handlers
TCEMAIN.linkHandler {
page {
handler = TYPO3\CMS\Backend\LinkHandler\PageLinkHandler
label = LLL:EXT:backend/Resources/Private/Language/locallang_browse_links.xlf:page
}
url {
handler = TYPO3\CMS\Backend\LinkHandler\UrlLinkHandler
label = LLL:EXT:backend/Resources/Private/Language/locallang_browse_links.xlf:extUrl
displayAfter = page,file,folder
scanAfter = telephone
}
email {
handler = TYPO3\CMS\Backend\LinkHandler\MailLinkHandler
label = LLL:EXT:backend/Resources/Private/Language/locallang_browse_links.xlf:email
displayAfter = page,file,folder,url
scanBefore = url
}
telephone {
handler = TYPO3\CMS\Backend\LinkHandler\TelephoneLinkHandler
label = LLL:EXT:backend/Resources/Private/Language/locallang_browse_links.xlf:telephone
displayAfter = page,file,folder,url,mail
scanBefore = url
}
}
mod.web_list {
enableClipBoard = selectable
tableDisplayOrder {
be_users.after = be_groups
sys_filemounts.after = be_users
sys_file_storage.after = sys_filemounts
fe_users.after = fe_groups
fe_users.before = pages
sys_template.after = pages
backend_layout.after = pages
tt_content.after = pages,backend_layout,sys_template
sys_category.after = tt_content
}
searchLevel.items {
-1 = EXT:core/Resources/Private/Language/locallang_core.xlf:labels.searchLevel.infinite
0 = EXT:core/Resources/Private/Language/locallang_core.xlf:labels.searchLevel.0
1 = EXT:core/Resources/Private/Language/locallang_core.xlf:labels.searchLevel.1
2 = EXT:core/Resources/Private/Language/locallang_core.xlf:labels.searchLevel.2
3 = EXT:core/Resources/Private/Language/locallang_core.xlf:labels.searchLevel.3
4 = EXT:core/Resources/Private/Language/locallang_core.xlf:labels.searchLevel.4
}
}
# dummy placeholders for item groups
mod.wizards {
newRecord.pages.show {
pageInside = 1
pageAfter = 1
}
}
+32
View File
@@ -0,0 +1,32 @@
options.enableBookmarks = 1
# Default bookmark groups (can be disabled by setting to 0 or empty)
options.bookmarkGroups {
1 = core.bookmarks:group_pages
2 = core.bookmarks:group_records
3 = core.bookmarks:group_files
4 = core.bookmarks:group_tools
5 = core.bookmarks:group_miscellaneous
}
options.pageTree {
searchInTranslatedPages = 1
searchByFrontendUri = 1
}
options.contextMenu {
table {
pages {
disableItems =
tree.disableItems =
}
sys_file {
disableItems =
tree.disableItems =
}
sys_filemounts {
disableItems =
tree.disableItems =
}
}
}