TYPO3 v15 dev-main snapshot ()
This commit is contained in:
@@ -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'],
|
||||
],
|
||||
];
|
||||
@@ -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',
|
||||
],
|
||||
],
|
||||
],
|
||||
];
|
||||
@@ -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',
|
||||
],
|
||||
];
|
||||
@@ -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'],
|
||||
],
|
||||
*/
|
||||
];
|
||||
@@ -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'],
|
||||
],
|
||||
];
|
||||
@@ -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')
|
||||
),
|
||||
),
|
||||
]);
|
||||
@@ -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/',
|
||||
],
|
||||
];
|
||||
@@ -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',
|
||||
],
|
||||
],
|
||||
],
|
||||
];
|
||||
@@ -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),
|
||||
]);
|
||||
},
|
||||
);
|
||||
};
|
||||
@@ -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'
|
||||
@@ -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',
|
||||
],
|
||||
],
|
||||
];
|
||||
@@ -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'
|
||||
);
|
||||
@@ -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
|
||||
}
|
||||
}
|
||||
@@ -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 =
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user