This document describes TSconfig: A TypoScript-like syntax for configuring
details of the TYPO3 backend.
In addition, you can find a quick reference guide to TypoScript templates in
TypoScript in 45 Minutes, a complete reference of all object types and properties of
TypoScript in TypoScript Reference and explanations of
TypoScript syntax in the chapter
"TypoScript Syntax" of TYPO3
Explained.
This document describes TSconfig: A TypoScript-like syntax for configuring
details of the TYPO3 backend.
In addition, you can find a quick reference guide to TypoScript templates in
TypoScript in 45 Minutes, a complete reference of all object types and properties of
TypoScript in TypoScript Reference and explanations of
TypoScript syntax in the chapter
"TypoScript Syntax" of TYPO3
Explained.
This document describes TSconfig and its options: A TypoScript a-like configuration
syntax to configure details of the backend for backend users based on a user, group and page level.
This document can be seen as detail below the main TYPO3 Explained documentation.
It is too huge to be integrated into TYPO3 Explained directly.
First parts of this document explain the concepts of TSconfig, the different places it can be
found in the system, how it can be diagnosed, and goes a bit into the PHP API if developers
need to access data from TSconfig.
The rest of the document is a reference: A document to look-up and find properties on a daily basis.
This document is especially important for integrators who want to make life as easy as possible
for their dear backend users.
TSconfig is used in TYPO3 to configure and customize the backend on a page and
a user or group basis. The syntax to do this is based on TypoScript that is also
used to configure frontend output of the web site.
The whole point of TSconfig is that it allows configuration of backend details
by integrators, without asking developers for writing PHP code. Thus, some areas
of TSconfig are rather powerful and offer vast possibilities of customizing the TYPO3 backend.
TSconfig is divided into configuration for pages ("Page TSconfig") and configuration
for users and groups ("User TSconfig"). Each variant is further detailed in this document.
The general "dotted notation" of TypoScript is re-used for Page TSconfig and
User TSconfig, it is possible to reference values, use conditions, and so on.
For a general look at the syntax, please read the according section of
TYPO3 Explained.
Other than the basic syntax, TSconfig and frontend TypoScript have nothing in common.
Properties outlined in the TypoScript Reference can never be
used in TSconfig and vice versa. Frontend TypoScript and TSconfig are different
things: TypoScript is used to steer the rendering of the frontend web site, TSconfig
is used to configure what is displayed to a logged in backend user.
While this might be confusing in the first place, it becomes clear as soon as integrators
start using TSconfig and looking at the available options: It is all about setting values
to configure if a backend users sees or does not see this-and-that, give a user additional
editing options, or removing them. As a last note to complete this picture: TSconfig is
also used to configure the "Admin panel" in the frontend. While this might look funny in the
first place, thinking about that makes clear on why admin panel configuration options are
bound to TSconfig and not to frontend TypoScript: The admin panel is basically a view to parts
of the backend that is shown in the frontend, it is entirely bound to backend users. So, the
admin panel is a backend thing, even if displayed in frontend, it is for backend users. This
is why the admin panel is configured via TSconfig.
This chapter gives an overview where TSconfig is set, how it
can be edited, and the load order of the different variants.
TSconfig can be used in page, it is then referred to as
"Page TSconfig", or for backend users and backend user groups,
in which case it is known as "User TSconfig".
It is recommended to always define custom page TSconfig in a project-specific
sitepackage extension. This way the page TSconfig
settings can be kept under version control.
The options described below are available for setting page TSconfig in
non-sitepackage extensions.
Starting with TYPO3 v12.0 page TSconfig in a file named
Configuration/page.tsconfig in an extension is automatically
loaded during build time.
Global page TSconfig should be stored within an extension, usually a sitepackage
extension. The content of the file Configuration/page.tsconfig within
an extension is automatically loaded during build time.
It is possible to load other TSconfig files with the import syntax within this
file:
Many page TSconfig settings can be set globally. This is useful for
installations that contain only one site and use only one sitepackage extension.
Extensions supplying custom default page TSconfig that should always be included,
can also set the page TSconfig globally.
The PSR-14 event BeforeLoadedPageTsConfigEvent is available to
add global static page TSconfig before anything else is loaded.
Global page TSconfig, compatible with TYPO3 v11 and v12¶
In TYPO3 v11 installations the content of Configuration/page.tsconfig
is not loaded automatically yet. You can achieve compatibility with both
TYPO3 v11 and v12 by importing the content of this file with the API function
ExtensionManagementUtility::addPageTSConfig:
EXT:my_sitepackage/ext_localconf.php
<?phpdeclare(strict_types=1);
useTYPO3\CMS\Core\Information\Typo3Version;
useTYPO3\CMS\Core\Utility\ExtensionManagementUtility;
useTYPO3\CMS\Core\Utility\GeneralUtility;
defined('TYPO3') ordie();
$versionInformation = GeneralUtility::makeInstance(Typo3Version::class);
// Only include page.tsconfig if TYPO3 version is below 12 so that it is not imported twice.if ($versionInformation->getMajorVersion() < 12) {
ExtensionManagementUtility::addPageTSConfig(
'@import "EXT:my_sitepackage/Configuration/page.tsconfig"'
);
}
Page TSconfig can be included on a per site level.
Page TSconfig can be defined on a site level by placing a file called
page.tsconfig in the storage directory of the site
(config/sites/<identifier>/).
Extensions and site packages can provide page TSconfig in
site sets by placing a file called page.tsconfig
into the folder of that set.
This way sites and sets can ship page TSconfig without the need for database
entries or by polluting global scope. Dependencies can be expressed via site sets,
allowing for automatic ordering and deduplication.
You can now put a file called page.tsconfig in the same folder like your
site configuration and it will be automatically loaded for all pages in that
site.
config/sites/my-site/page.tsconfig
# This tsconfig will be loaded for pages in site "my-site"
# [...]
Copied!
Or you can put the file page.tsconfig in the same directory like the
site set you defined in your extension. It will then be loaded by all pages
of all sites that depend on this set:
Static page TSconfig that has been
registered by your sitepackage or a
third party extension can be included in the page properties.
Go to the page properties of the page where you want to include the page TSconfig.
Go to the tab Resources, then to
page TSconfig > Include static page TSconfig (from extensions) and
select the desired configurations from the Available Items.
Set page TSconfig directly in the page properties¶
Go to the page properties of the page where you want to include the page TSconfig
and open the tab Resources.
You can enter page TSconfig directly into the field Page TSconfig:
Page TSconfig inserted directly into the page properties is applied to the
page itself and all its subpages.
Note
The configuration is stored in the database and not in the file
system. Therefore it cannot be kept under version control. This
strategy is not recommended. Setting page TSconfig in the page properties
directly is available for backward-compatibility reasons and for quickly trying
out some settings in development only.
It is recommended to always define custom user TSconfig in a project-specific
sitepackage extension. This way the user TSconfig
settings can be kept under version control.
This will make all settings in the file available to the user. The file
itself can be kept under version control together with your sitepackage.
TSconfig defined at user level overrides TSconfig defined at group level.
If a user is a member of several groups, the TSconfig from each
group is loaded. The order in which the groups are added to the user in field
General > Group is used.
The TSconfig from latter groups overrides the TSconfig from earlier groups if
both define the same property.
Starting with TYPO3 v13.0 user TSconfig in a file named
Configuration/user.tsconfig in an extension is automatically loaded
during build time.
User TSconfig is designed to be individual for users or groups of
users. However, good defaults can be defined and overridden by group or
user-specific TSconfig.
Default user TSconfig should be stored within an extension, usually a
sitepackage extension. The content of the file
Configuration/user.tsconfig within an extension is automatically loaded
during build time.
It is possible to load other user TSconfig files with the import syntax within
this file:
In TYPO3 v12 installations the content of Configuration/user.tsconfig is
not loaded automatically. You can achieve compatibility with both TYPO3 v12 and
v13 by importing the content of this file with the API function
ExtensionManagementUtility::addUserTSConfig:
EXT:my_sitepackage/ext_localconf.php
<?phpdeclare(strict_types=1);
useTYPO3\CMS\Core\Information\Typo3Version;
useTYPO3\CMS\Core\Utility\ExtensionManagementUtility;
useTYPO3\CMS\Core\Utility\GeneralUtility;
defined('TYPO3') ordie();
$versionInformation = GeneralUtility::makeInstance(Typo3Version::class);
// Only include user.tsconfig if TYPO3 version is below 13 so that it is not imported twice.if ($versionInformation->getMajorVersion() < 13) {
ExtensionManagementUtility::addUserTSConfig(
'@import "EXT:my_sitepackage/Configuration/user.tsconfig"'
);
}
Copied!
Deprecated since version 13.0
The method \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addUserTSConfig()
has been marked as deprecated in TYPO3 v13 and will be removed with TYPO3
v14.
The full user TSconfig of the currently logged-in backend user can be viewed
using the System > Configuration backend module and choosing the
action $GLOBALS['BE_USER']->getTSConfig() (User TSconfig). However
this module can only be accessed by admins.
Viewing user TSconfig using the Configuration module
The Configuration module is available with installed
lowlevel system extension.
Properties, which are set in the TSconfig field of a group, are valid
for all users of that group.
Values set in one group can be overridden and
modified in the
same or another group. If a user is a member of multiple groups, the TSconfig
settings are evaluated in the order in which the groups are included in the
user account: When editing the backend user, the selected groups are evaluated
from top to bottom.
Example:
Add in user TSconfig
EXT:site_package/Configuration/user.tsconfig
page.RTE.default.showButtons = bold
Copied!
You get the value "bold".
Add later in user TSconfig
EXT:site_package/Configuration/user.tsconfig
page.RTE.default.showButtons := addToList(italic)
Copied!
You get the value "bold,italic".
Finally, you can override or
modify the
settings from groups that your user is a member of in the user TSconfig
field of that specific user.
Example:
Let's say the user is a member of a usergroup with this
configuration:
This would override the default value of the header ("234") and add the
clear cache option. The default value of the hidden field is not
changed and simply inherited directly from the group.
All properties from page TSconfig can be overridden in user TSconfig by
prepending the property name with page..
When a page TSconfig property is set in user TSconfig that way, regardless
of whether it is in the TSconfig field of a
group or a user, it overrides the value of the according page TSconfig property.
To illustrate this feature let's say new pages and copied pages are not hidden
by default:
If we activate the following configuration in the user TSconfig of a certain backend
user group, new and copied pages will be hidden for that group. The user TSconfig to
be used is the same, but prefixed with page.
// Override the settings from the page TSconfig for the editors usergroup
page {
TCAdefaults.pages.hidden = 1
TCEMAIN.table.pages.disableHideAtCopy = 0
}
Copied!
Attention
It is not possible to reference the value of a property from page
TSconfig and to modify this value in user TSconfig! If you set a property
in user TSconfig, which already had been set in page TSconfig, then the
value from page TSconfig will be overridden.
The result of the example below is not the value "bold,italic",
but the value "italic".
EXT:site_package/Configuration/page.tsconfig
# Enable the "bold" button in Page TSconfig (!)
RTE.default.showButtons = bold
Copied!
EXT:site_package/Configuration/user.tsconfig
# Try to additionally add the "italic" button in User TSconfig (!)
page.RTE.default.showButtons := addToList(italic)
While the objects, properties and conditions are different,
the syntax of TSconfig is basically the same as it is for
TypoScript in frontend TypoScript templates.
Please note the following differences:
In TSconfig no constants are available.
There are differences in the conditions that can be used.
TSconfig TypoScript conditions offer a way to conditionally change TypoScript based
on current context. See the TypoScript syntax condition chapter
for the basic syntax of conditions.
It is possible to use TypoScript conditions in both user TSconfig and page TSconfig,
just as it is done in frontend TypoScript. The list of available variables and
functions is different, though.
The Symfony expression language tends to throw warnings when sub arrays are
checked in a condition that do not exist. Use the traverse
function to avoid this.
# Check single page uid[traverse(page, "uid") == 2]// Your settings go here[END]# Check list of page uids[traverse(page, "uid") in [17,24]]// Your settings go here[END]# Check list of page uids NOT in[traverse(page, "uid") not in [17,24]]// Your settings go here[END]# Check range of pages (example: page uid from 10 to 20)[traverse(page, "uid") in 10..20]// Your settings go here[END]# Check the page backend layout[traverse(page, "backend_layout") == 5]// Your settings go here[END][traverse(page, "backend_layout") == "example_layout"]// Your settings go here[END]# Check the page title[traverse(page, "title") == "foo"]// Your settings go here[END]
Check for the defined backend layout of a page including the inheritance of
the field Backend Layout (subpages of this page). Only available in page TSconfig,
not in user TSconfig.
Example: Condition applies on pages with a certain backend layout¶
EXT:site_package/Configuration/page.tsconfig
# Use backend_layout records uids[tree.pagelayout == 2]// Your settings go here[END]# Use TSconfig provider of backend layouts[tree.pagelayout == "pagets__Home"]// Your settings go here[END]
Get current date in given format. See PHP date
function as reference for possible usage.
Example: Condition applies at certain dates or times¶
EXT:site_package/Configuration/page.tsconfig
# True if day of current month is 7[date("j") == 7]// Your settings go here[END]# True if day of current week is 7[date("w") == 7]// Your settings go here[END]# True if day of current year is 7[date("z") == 7]// Your settings go here[END]# True if current hour is 7[date("G") == 7]// Your settings go here[END]
# Search a string with * within another string[like("fooBarBaz", "*Bar*")]// Your settings go here[END]# Search string with single characters in between, using ?[like("fooBarBaz", "f?oBa?Baz")]// Your settings go here[END]# Search string using regular expression[like("fooBarBaz", "/f[o]{2,2}[aBrz]+/")]// Your settings go here[END]
This function gets a value from an array with arbitrary depth and suppresses
PHP warning when sub arrays do not exist. It has two parameters: The first parameter
is the array to traverse, the second parameter is the path to traverse.
In case the path is not found in the array, an empty string is returned.
Example: Condition applies if request parameter matches a certain value¶
EXT:site_package/Configuration/page.tsconfig
# Traverse query parameters of current request along tx_news_pi1[news][traverse(request.getQueryParams(), 'tx_news_pi1/news') > 0]// Your settings go here[END]
Example: Condition applies if the current TYPO3 version matches a pattern¶
EXT:site_package/Configuration/page.tsconfig
# True if current version is 12.4.x[compatVersion("12.4")]// Your settings go here[END][compatVersion("12.4.0")]// Your settings go here[END][compatVersion("12.4.1")]// Your settings go here[END]
Get value from site configuration, or null if no site was found or property
does not exists. Only available in page TSconfig, not available in user TSconfig.
Available Information:
site("identifier")
Returns the identifier of current site as string.
site("base")
Returns the base of current site as string.
site("rootPageId")
Returns the root page uid of current site as integer.
site("languages")
Returns array of available languages for current site.
For deeper information, see siteLanguage().
site("allLanguages")
Returns array of available and unavailable languages for current site.
For deeper information, see siteLanguage().
site("defaultLanguage")
Returns the default language for current site.
For deeper information, see siteLanguage().
site("configuration")
Returns an array with all available configuration for current site.
Example: Condition applies if a certain value is set in the site configuration¶
EXT:site_package/Configuration/page.tsconfig
# Site identifier[site("identifier") == "my_website"]// Your settings go here[END]# Match site base host[site("base").getHost() == "www.example.org"]// Your settings go here[END]# Match base path[site("base").getPath() == "/"]// Your settings go here[END]# Match root page uid[site("rootPageId") == 1]// Your settings go here[END]# Match a configuration property[traverse(site("configuration"), "myCustomProperty") == true]// Your settings go here[END]
<?phpdeclare(strict_types=1);
useTYPO3\CMS\Backend\Utility\BackendUtility;
useTYPO3\CMS\Core\Authentication\BackendUserAuthentication;
finalclassMyBackendController{
publicfunctionsomeMethod(int $currentPageId): void{
// Retrieve user TSconfig of currently logged in user
$userTsConfig = $this->getBackendUser()->getTSConfig();
// Retrieve page TSconfig of the given page id
$pageTsConfig = BackendUtility::getPagesTSconfig($currentPageId);
}
privatefunctiongetBackendUser(): BackendUserAuthentication{
return $GLOBALS['BE_USER'];
}
}
Copied!
Both methods return the entire TSconfig as a PHP array. The former
retrieves the user TSconfig while the latter retrieves the page TSconfig.
All imports, overrides, modifications, etc. are already resolved. This includes
page TSconfig overrides by user TSconfig.
Similar to other TypoScript-related API methods, properties that contain
sub-properties return their sub-properties using the property name with a
trailing dot, while a single property is accessible by the property
name itself. The example below gives more insight on this.
If accessing TSconfig arrays, the PHP null coalescing operator ?? is
useful: TSconfig options may or not be set, accessing non-existent
array keys in PHP would thus raise PHP notice level warnings.
Combining the array access with a fallback using ?? helps when accessing
these optional array structures.
Incoming (user) TSconfig:
options.someToggle = 1
options.somePartWithSubToggles = foo
options.somePartWithSubToggles.aValue = bar
Copied!
Parsed array returned by getTSConfig(), note the dot if a property has sub keys:
The page TSconfig primarily concerns configuration of the modules in
the TYPO3 backend, the most important section is mod.
The TSconfig for a page is accumulated from the root and extends
to cover the whole branch of sub pages as well (unless values are
overridden further out).
TYPO3 provides a color picker component that
supports color palettes, or swatches. The colors can be configured and assigned
to palettes. This way, for example, colors defined in a corporate design can be
selected by a simple click. Multiple color palettes can be configured.
Configuration for backend modules. This is the part of page TSconfig
with the most options, most sections affect the main TYPO3 editing modules
like Web > Page and Web > List.
This option lets you specify which columns of tt_content elements should be editable in the
'Columns' view of the Web > Page module.
Used on top of backend layouts, this setting controls which columns are editable. Columns configured
in the Backend Layout which are not listed here, will be displayed with placeholder area.
Each column has a number which ultimately comes from the configuration of the table tt_content,
field 'colPos'. These are the values of the four default columns used in the default backend layout:
The example creates a basic backend layout and sets the "Left" column to be not editable:
Create a record of type "Backend Layout", for instance in the root page of your website
Add a title, e.g. "My Layout"
Use the wizard to create a two column backend layout, the result may look like this:
A simple backend layout
Create a page and select this new backend layout in the "Appearance" tab.
The page module then looks like this, displaying the two defined columns:
Backend layout used in page module
Now set the "Left" column to be not editable using page TSconfig in the
Resources tab of the page, by restricting colPos_list to
0 (the "Content" columns as defined above):
Page TSconfig in the "Resources" tab of the page
mod.SHARED.colPos_list = 0
Copied!
The result in the page module then looks like this:
Note that this option has largely been superseded by site configuration since TYPO3 v10 and will only
work in the Backend for a "NullSite". For instance, a global sysfolder in the page tree without an
attached site configuration. Once a page tree has a site configuration, the default language icon is
set from the site configuration's language settings and this option will have no effect at all.
Country flag shown for the "Default" language in the backend, used in Web > List and Web > Page module.
Values as listed in the "Select flag icon" of a language record in the backend are allowed, including
the value "multiple".
The flag selector of a language record in the backend
Note that this option has largely been superseded by site configuration since TYPO3 v10 and will only
work in the backend for a "NullSite". For instance a global sysfolder in the page tree without an
attached site configuration. Once a page tree has a site configuration, the default language label is
set from the site configuration's language settings and this option will have no effect at all.
Note that this option has largely been superseded by site configuration since TYPO3 v10 and will only
work in the Backend for a "NullSite". For instance, a global sysfolder in the page tree without an
attached site configuration. Once a page tree has a site configuration, the language settings
from the site configuration are applied and this option will have no effect at all.
The available fields in the "Pagetree overview" module under the Info module, by default ship with the entries
"Basic settings", "Record overview", and "Cache and age".
Default entries of Pagetree Overview
By using page TsConfig it is possible to change the available fields and add additional entries to the select box.
Next to using a list of fields from the pages table you can add counters for records in a given table by prefixing a
table name with table_ and adding it to the list of fields.
The string ###ALL_TABLES### is replaced with a list of all table names an editor has access to.
Example: Override the field definitions in the info module¶
By default, TYPO3 will not allow you to mix translated content and independent content in the page module.
Content elements violating this behavior will be marked in the page module and there is no UI control (yet)
allowing you to create independent content elements in a given language.
If you want to go back to the old, inconsistent behavior, you can toggle it back on using this switch.
Backend Layouts were initially introduced in order to customize the view of
the Page module in TYPO3 Backend for a page, but has then since grown also in
Frontend rendering to select for example Fluid template files via TypoScript for a page,
commonly used via data:pagelayout.
Note that this option has largely been superseded by site configuration since TYPO3 v10 and will only
work in the Backend for a "NullSite". For instance, a global sysfolder in the page tree without an
attached site configuration. Once a page tree has a site configuration, the default language label is
set from the site configuration's language settings and this option will have no effect at all.
If set, translations of content elements are bound to the default record in the display. This means that
within each column with content elements any translation found for exactly the shown default content
element will be shown in the language column next to.
This display mode should be used depending on how the frontend is configured to display localization.
The frontend must display localized pages by selecting the default content elements and for each
one overlay with a possible translation if found.
If activated, only columns will be shown in the backend that the editor is
allowed to access. All columns with access restriction are hidden in that case.
By default columns with restricted access are rendered with a message
telling that the user doesn't have access. This may be useless and
distracting or look repelling. Instead, all columns an editor doesn't have
access to can be hidden:
EXT:site_package/Configuration/page.tsconfig
mod.web_layout.hideRestrictedCols = 1
Copied!
Attention
This setting will break your layout if you are using backend layouts.
Disable elements of the "Function selector" in the document header of the module.
The function keys are numerical:
Columns
1
Languages
2
Warning
Blinding Function Menu items is not hardcore access control! All it
does is hide the possibility of accessing that module functionality
from the interface. It might be possible for users to hack their way
around it and access the functionality anyways. You should use the
option of blinding elements mostly to remove otherwise distracting options.
Example: Disable "Languages" from the function menu¶
EXT:site_package/Configuration/page.tsconfig
# Disables "Languages" from function menu
mod.web_layout.menu.functions {
2 = 0
}
It is possible to render previews of your own content elements in the page module.
By referencing a Fluid template you can create a visual representation of your content element,
making it easier for an editor to understand what is going on on the page.
Backend layouts were initially introduced in order to customize the view of
the Page module in TYPO3 Backend for a page, but has then since grown also in
Frontend rendering to select for example Fluid template files via TypoScript for a page,
commonly used via data:pagelayout.
A page module with a backend layout that has 3 content areas.
Backend layouts are organized in rows and columns. Content areas can span
multiple rows and or columns. They cannot be nested. For nested layouts in the
backend use an extension like
b13/container
.
If this list is set, then only tables listed here will have a link to "create new" in the page and sub pages.
This also affects the "Create new record" content element wizard.
Technically records can be created (e.g. by copying/moving), so this is not a security feature.
The point is to reduce the number of options for new records visually.
Example: Only allow records of type pages or sys_category in the new record wizard¶
EXT:site_package/Configuration/page.tsconfig
mod.web_list {
# Only pages and sys_category table elements will be linked to in the new record wizard
allowedNewTables = pages, sys_category
}
Copied!
The New record screen after modifying the allowed elements
Defines the default delimiter for CSV downloads (Microsoft Excel expects
; to be set). The value set will be displayed as default delimiter in the
download dialog in the list module.
Example: Use semicolon as delimiter CSV downloads¶
If this list is set, then the tables listed here won't have a link to "create new record" in the page
and sub pages. This also affects the "Create new record" content element wizard.
If set, then the links on the table titles which shows a single table
listing will not be available - including sorting links on columns
titles, because these links jumps to the table-only view.
The column selector is enabled by default and can be disabled with this
option. The column selector is displayed at the top of each record list in
the List module. It can be used to compare different fields of
the listed records.
A new function has been introduced that makes it possible to select the data columns
to be exported from a list of configurable presets.
This property adds presets of preselected fields to the download area in
the Web > List backend module.
Those presets can be configured via page TSconfig, and can also be
overridden via user TSconfig (for example, to expand certain presets
only to specific users).
Each entry of mod.web_list.downloadPresets
defines the table name on the first level, followed by
any number of presets.
Each preset contains a label (the displayed name of the preset,
which can be a locallang key), a comma-separated list of each column that
should be included in the export as columns and optionally
an identifier. In case identifier is not provided,
the identifier is generated as hash of the label and
columns.
Since any table can be configured for a preset, any extension
can deliver a defined set of presets through the
EXT:my_extension/Configuration/page.tsconfig file and
their table name(s).
Additionally, the list of presets can be manipulated via the PSR-14 event
BeforeRecordDownloadPresetsAreDisplayedEvent.
This can be manipulated with user TSconfig by adding the page.
prefix. User TSconfig is loaded after page TSconfig, so you can overwrite
the existing default settings using the same TypoScript path.
Determines whether the checkbox "Show clipboard" in the list module is
shown or hidden. If it is hidden, you can predefine it to be always
activated or always deactivated.
The following values are possible:
activated
The option is activated and the checkbox is hidden.
deactivated
The option is deactivated and the checkbox is hidden.
selectable
The checkbox is shown so that the option can be selected by the user.
20 Set the default maximum number of items to show per table. The number must be between 5 and 10000`. If below or above this range, the nearest valid number will be used.
Set the default maximum number of items to show in single table view.
The number must be between 5 and 10000. If below or above this range,
the nearest valid number will be used.
If set, the default view will not show the single records inside a
table anymore, but only the available tables and the number of records
in these tables. The individual records will only be listed in the
single table view, that means when a table has been clicked. This is
very practical for pages containing many records from many tables!
Example: Only list records of tables in single-table mode¶
EXT:site_package/Configuration/page.tsconfig
mod.web_list {
listOnlyInSingleTableView = 1
}
The result will be that records from tables are only listed in the single-table mode:
Copied!
The list module after activating the single-table mode
If set, the Download and Export buttons are hidden
in the list module. This applies to
the Export button located at the top left for t3d exports, the
Download button directly on the table
listing for csv download and the Download button in the tables
single view.
This option is for example important to disable batch
download of sensitive data via CSV or t3d exports.
The list module with export buttons after activating the single-table mode
The list module without export buttons after activating the single-table mode
Note
This option only hides the buttons in the list module. Bulk export of
data is still possible via the context menu of the page tree.
If set to false, the column selector in the title row of the specified
table gets hidden. If the column selctors have been disabled globally
this option can be used to enable it for a specific table.
This option allows to define one of the available level options
as the default level to use.
When searching for records in the Web > List module as well as
the database browser, it is possible to select the search levels (page tree
levels to respect in the search).
An editor is therefore able to select between the current page, a couple of
defined levels (e.g. 1, 2, 3) as well as the special "infinite levels".
Those options can already be extended using the TSconfig option
searchLevel.items.
Example: Set the default search level to "infinite levels"¶
New content elements added via TCA to the
items of field CType
of table tt_content are automatically added to the New Content Element
Wizard. The following page TSconfig can be used to override values set via
TCA.
In the New Content Element Wizard, content element types are grouped
together by type. Each such group can be configured independently. The
four default groups are: default, special, forms and plugins.
Changed in version 13.0
The group common was renamed to default. A permanent migration is in
place.
The configuration of the New Content Element Wizard has been
changed to automatically registering the groups and elements
from the TCA configuration.
The previously used option to show / hide elements
mod.wizards.newContentElement.wizardItems.<group>.show is
not evaluated anymore.
All configured groups and elements are automatically shown. Removing these
groups and elements from the New Content Element Wizard can be done via
the option removeItems and
[group].removeItems
options.
# Add a new element (header) to the "common" group
mod.wizards.newContentElement.wizardItems.common.elements.header {
iconIdentifier = content-header
title = Header
description = Adds a header element only
tt_content_defValues {
CType = header
}
}
mod.wizards.newContentElement.wizardItems.common.show := addToList(header)
Copied!
Example: Create a new group and add an element to it¶
EXT:site_package/Configuration/page.tsconfig
# Create a new group and add a (pre-filled) element to it
mod.wizards.newContentElement.wizardItems.myGroup {
header = LLL:EXT:cms/layout/locallang.xlf:advancedFunctions
elements.customText {
iconIdentifier = content-text
title = Introductory text for national startpage
description = Use this element for all national startpages
tt_content_defValues {
CType = text
bodytext (
<h2>Section Header</h2>
<p class="bodytext">Lorem ipsum dolor sit amet, consectetur, sadipisci velit ...</p>
)
header = Section Header
header_layout = 100
}
}
}
mod.wizards.newContentElement.wizardItems.myGroup.show = customText
Copied!
With the second example, the bottom of the new content element wizard shows:
Define an alternate order for the groups of records in the new records
wizard. Pages and content elements will always be on top, but the
order of other record groups can be changed.
Records are grouped by extension keys, plus the special key "system"
for records provided by the TYPO3 Core.
Example: Place the tt_news group at the top of the new record dialog¶
Place the tt_news group at the top (after pages and content
elements), other groups follow unchanged:
EXT:site_package/Configuration/page.tsconfig
mod.wizards.newRecord.order = tt_news
Copied!
The position of News changed after modifying the New record screen
Use the following sub-properties to show or hide the specified links.
Setting any of these properties to 0 will hide the corresponding link,
but setting to 1 will leave it visible.
show.pageAfter
Show or hide the link to create new pages after the selected page.
show.pageInside
Show or hide the link to create new pages inside the selected page.
show.pageSelectPosition
Show or hide the link to create new pages at a selected position.
Example: Hide the "Page (inside)" link in the "New Record" dialog¶
The RTE prefix key is used for configuration of the Rich Text Editor.
Please refer to the RTE chapter in Core API document
for more general information on RTE configuration and data processing.
The order in which the configuration for the RTE is loaded is (the first one which
is set will be used, see example below):
preset defined for a specific field via page TSconfig
general preset defined via page TSconfig (RTE.default.preset)
default (the preset "default", e.g. as defined by EXT:rte_ckeditor or overridden
in ext_localconf.php)
The full property path building is a bit more complex than for other
property segments. The goal is that global options can be set that can
also be overridden in more specific situations:
Configure all RTE for all tables, fields and types:
RTE.default
Configure RTE for a specific field in a table
RTE.config.[tableName].[fieldName]
Configure RTE for a specific field in a table for a specific record type
RTE.config.[tableName].[fieldName].types.[type]
Configuring RTE via page TSconfig is general and not specific to a
particular rich-text editor. However, TYPO3 comes with EXT:rte_ckeditor, so this one
will usually be used. This page covers only the general configuration, for
more information about configuring EXT:rte_ckeditor, see the
rte_ckeditor configuration.
# Disable all RTEs
RTE.default.disabled = 1
# Enable RTE for the tt_content bodytext field only
RTE.config.tt_content.bodytext.disabled = 0
Copied!
EXT:site_package/Configuration/page.tsconfig
# Disable all RTEs
RTE.default.disabled = 1
# Enable RTE for the tt_content bodytext field only
RTE.config.tt_content.bodytext.disabled = 0
# But disable RTE for tt_content bodytext again if the record type is "text"
RTE.config.tt_content.bodytext.types.text.disabled = 1
Refer to the description of the order above for details of which setting has priority over which.
Summary:
Setting the preset via page TSconfig for a specific field overrides all,
else
TCA richtextConfiguration (for a specific field) overrides the page TSconfig
default preset (RTE.default.preset)
EXT:site_package/Configuration/page.tsconfig
# set a default preset to use as fallback
RTE.default.preset = custom_preset_default
# Override preset for field "description" in table "tt_address"
RTE.config.tt_address.description.preset = custom_preset_fancy
If set, the editor is disabled. This option is evaluated in \TYPO3\CMS\Backend\Form\FormEngine
where it determines whether the RTE is rendered or not. Note that a backend user can also ultimately
disable RTE's in his user settings.
If set, a class must be selected for any link of the given type.
Therefore, the empty option is removed from the class selector.
Possible types are: page, file, url, email, folder, telephone.
The configuration contentsLangDirection of the ckeditor is used to define the
direction of the content. It is filled by the direction defined in the site
language of the current element.
As fallback the following page TsConfig configuration can be used:
EXT:my_sitepackage/Configuration/page.tsconfig
# always use right to left
RTE.config.contentsLanguageDirection = rtl
# except for the following language:[siteLanguage("locale") == "en_US"]
RTE.config.contentsLanguageDirection = ltr
[END]
The proc section allows customization of the server processing of the content, see
the transformation section of the RTE chapter in
the core API document for more general information on server processing.
The proc properties are in \TYPO3\CMS\Core\Html\RteHtmlParser and
are universal for all RTEs. The main objective of these options is to allow for minor
configuration of the transformations. For instance you may disable the mapping between
<b>-<strong> and <i>-<em> tags which is done by the ts_transform transformation.
Notice how many properties relate to specific transformations only! Also notice that the meta-transformations
ts_css imply other transformations.
This means that options limited to ts_transform will also work for ts_css of course.
Allowed general class names when content is stored in database. Could be a list matching the
number of defined classes you have. Class names are case insensitive.
This might be a really good idea to do, because when pasting in content from MS word for
instance there are a lot of <SPAN> and <P> tags which may have class names in. So by
setting a list of allowed classes, such foreign class names are removed.
If a class name is not found in this list, the default is to remove the class.
Comma-separated list of uppercase tags (e.g. P,HR) that overrides the list of HTML
elements that will be treated as block elements by the RTE transformations.
These are additional options to the HTML parser calls which strips of tags when the content is prepared
from the RTE to the database, saving a record. It is possible to configure additional rules like which other
tags to preserve, which attributes to preserve, which values are allowed as attributes of a certain tag etc.
An HTML sanitizer is available to sanitize and remove XSS from markup. It
strips tags, attributes and values that are not explicitly allowed.
Sanitization for persisting data is disabled by default and can be enabled
globally by using the corresponding feature flag in the configuration
filesconfig/system/settings.php or
config/system/additional.php:
It can then be disabled per use case with a custom processing instruction:
EXT:site_package/Configuration/Processing.yaml
processing:allowTags:# ...HTMLparser_db:# ...# disable individually per use casehtmlSanitize:false# This is the default configuration,# the feature flag has to be enabledhtmlSanitize:# use default builder as configured in# $GLOBALS['TYPO3_CONF_VARS']['SYS']['htmlSanitizer']build:default
These are additional options to the HTML parser calls which strips of tags when the content is prepared
from the database to the RTE rendering. It is possible to configure additional rules like which other
tags to preserve, which attributes to preserve, which values are allowed as attributes of a certain tag etc.
Allows detailed configuration of how editing forms are rendered for a page
tree branch and for individual tables if you like. You can enable and
disable options, blind options in selector boxes etc.
See the core API document section FormEngine for more
details on how records are rendered in the backend.
The properties listed below apply to various contexts which are explained per
property. The full property path thus depends on the property and where it should
apply. In general, a more specific property path overrides a less specific one:
Some properties apply to single fields, those can be usually set per table or
per table and record type. This leads to the property paths
TCEFORM.[tableName].[fieldName].[propertyName] to configure the field for all types
and TCEFORM.[tableName].[fieldName].types.[typeName] to configure a field for a specific
type, see the TCA type section for details on types.
While all that property path munging looks messy at first, it should become more
clear when reading through the single properties below and looking at the examples.
Other properties also apply to FlexForm fields, in this case the full property
path including the data structure key has to be set:
# TCEFORM.[tableName].[fieldName].[dataStructureKey].[flexSheet].[flexFieldName with escaped dots].[propertyName]
TCEFORM.tt_content.pi_flexform.sfregister_create.sDEF.settings\.fields\.selected.addItems.ZZZ = ZZZ
Copied!
The sheet name (sDEF) must be given only if the FlexForm has a sheet.
The [dataStructureKey] represents the key of a FlexForm in
$GLOBALS['TCA'][<tableName>]['columns'][<field>]['config']['ds']. This key will be split into up to
two parts. By default the first part will be used as identifier of the FlexForm in TSconfig. The second part
will override the identifier if it is not empty, list or *. For example the identifier of the key
myext_pi1,list will be myext_pi1 and of the key *,my_CType it will be my_CType. See section
Pointing to a data structure of the TCA reference for details.
The flexFieldName is the name of the property in the FlexForm. If it contains
dots ('.'), these must be escaped with backslash.
Some properties apply to whole FlexForm sheets, their property path is
TCEFORM.[tableName].[fieldName].[dataStructureKey].[flexSheet].[propertyName].
Change the list of items in TCA type=select fields. Using this property,
items can be added to the list. Note that the added elements might be removed if the selector represents
records: If the select box is a relation to another table. In that case only existing records
will be preserved.
The subkey icon will allow to add your own icons to new values.
New in version 12.1
The subkey group can be used to insert a new element into an
existing select item group by settings the value to the group identifier.
The grouping is usually displayed in select fields with groups available.
Do not add page types this way (using TCEFORM.pages.doktype.addItems), instead the proper
PHP API should be used to do this, see Core APIs for details.
TCEFORM.tt_content.header_layout {
# Add another header_layout option:
addItems.1525215969 = Another header layout
# Add another one with localized label, icon and group
addItems.1525216023 = LLL:EXT:my_ext/Resources/Private/Language/locallang.xlf:header_layout
addItems.1525216023.icon = EXT:my_ext/icon.png
addItems.1525216023.group = special
}
Instead of adding files by path, icon identifiers should be used.
This property allows you to enter alternative labels for the items in the list. For a single checkbox or radio
button, use default, for multiple checkboxes and radiobuttons, use an integer for their position starting at 0.
TCEFORM.pages.doktype {
# Set a different item label
altLabels.1 = STANDARD Page Type
altLabels.254 = Folder (for various elements)
# Sets the default label for Recycler via "locallang":
altLabels.255 = LLL:EXT:my_ext/Resources/Private/Language/locallang_tca.xlf:recycler
}
Copied!
The Page types with modified labels
Note
If the item has an empty value, the syntax is slightly different and an additional dot must be provided,
like on this example:
This option allows to provide a value for dynamic SQL-WHERE parameters. The
value is defined for a specific field of a table. For usage with flexform
fields, the entire path to a sub-field must be provided.
This example might be used for a record in an extension. It refers to a
table called tx_myext_table and the field myfield. Here the marker will
be substituted by the value 22.
This example might be used for a record in an extension. It refers to a
table called tx_myext_table and the field myfield. Here the marker will
be substituted by the list of integers.
This example might be used for a record in an extension. It refers to a
table called tx_myext_table and the field myfield. Here the marker will
be substituted by the given value.
Assign a color palette to a specific field of a
table, for all fields within a table or a global configuration affecting all
color pickers within FormEngine. If no palette
is defined, FormEngine falls back to all configured colors.
# Assign a palette to a specific field
TCEFORM.tx_myext_table.myfield.colorPalette = messages
# Assign a palette to all color pickers used in a table
TCEFORM.tx_myext_table.colorPalette = key_colors
# Assign global palette
TCEFORM.colorPalette = main
This setting allows to override TCA field configuration. This will influence configuration settings in
$GLOBALS['TCA'][<tableName>]['columns'][<fieldName>]['config'][<key>], see
TCA reference for details.
Not all configuration options can be overridden, the properties are restricted and depend on the
field type. The array
typo3/sysext/backend/Classes/Form/Utility/FormEngineUtility.php->$allowOverrideMatrix
within FormEngine code defines details:
The reason that not all properties can be changed is that
internally, the DataHandler performs database
operations which require finalized TCA definitions
that are accessed without this TSconfig getting interpreted. This mismatch
would then lead to inconsistencies.
An input or text TCA field can not enable the
RTE via the
config.enableRichtext option due to similar reasons in respect
to the DataHandler.
Also, if for example the max definition of a field is made
larger than the TCA definition of that field, you may need to to change
the file ext_tables.sql (see ext_tables.sql)
to adjust column definitions, especially when using the
Auto-generated structure.
The property config is available for these levels:
No current TYPO3 version allows to override the configuration of
Flex form fields, even though this was previously documented here.
This may change in future versions.
The treeConfig sub properties of TCEFORM.config are dedicated to the TCA config type
select with renderType=selectTree. A couple of
treeConfig properties can be overriden on page TSconfig level, see their detailed description
in the TCA reference:
No current TYPO3 version allows to override the configuration of
Flex form fields, even though this was previously documented here.
This may change in future versions.
If set, the field is not displayed in the backend form of the record.
However, the field can still be set by other means. For example if
this property is set:
TCEFORM.tt_content.colPos.disabled = 1 the Column field
will not be displayed in the content elements form. The
content element can still be moved to another column which internally also
sets the field colPos. Fields with the TSconfig property
TCEFORM.<table>.<field>.disabled therefore show the same
behaviour as fields of the TCA type passthrough.
table level, example:
TCEFORM.tt_content.header.disabled
table and record type level, example:
TCEFORM.tt_content.header.types.textpic.disabled
Flex form sheet level. If set, the entire tab is not rendered, example:
This property applies only to items in TCA type=select fields.
If a selector box value is not available among the options in the box, the default behavior
of TYPO3 is to preserve the value and to show a label which warns about this special state:
A missing selector box value is indicated by a warning message
If disableNoMatchingValueElement is set, the element "INVALID VALUE" will not be added to the list.
The fileFolderConfig TCA configuration can be overridden with page
TSconfig, allowing administrators to use different folders or different file
extensions, per site.
The same sub properties as in the fileFolderConfig TCA configuration are
available:
This property applies only to items in TCA type=select fields. The properties of
this key is passed on to the itemsProcFunc in the
parameter array by the key "TSconfig".
This allows you to enter alternative labels for any field. The value can be a LLL: reference
to a localization file, the system will then look up the selected backend user language and tries
to fetch the localized string if available. However, it is also possible to override these by
appending the language key and hard setting a value, for example label.de = Neuer Feldname.
Example: Rename the first tab of the FlexForm plugin¶
EXT:site_package/Configuration/page.tsconfig
TCEFORM.tt_content.pi_flexform.myext_pi1.sDEF {
# Rename the first tab of the FlexForm plug-in configuration
sheetTitle = LLL:my_ext/Resource/Private/Language/locallang.xlf:tt_content.pi_flexform.myext_pi1.sDEF
}
Comma-separated list of fields the suggest wizard should also search in. By default the wizard looks only in the
fields listed in the label and label_alt
of TCA ctrl properties.
Add a CSS class to every list item of the result list.
EXT:site_package/Configuration/page.tsconfig
TCEFORM.suggest.pages {
# Configure all suggest wizards which list records from table "pages"# to add the CSS class "pages" to every list item of the result list.
cssClass = pages
}
Limit the search to certain pages (and their subpages). When pidList is empty all pages will be included
in the search as long as the backend user is allowed to see them.
Example: Limit suggest search to records on certain pages¶
EXT:site_package/Configuration/page.tsconfig
TCEFORM.suggest.default {
# sets the pidList for a suggest fields in all tables
pidList = 1,2,3,45
}
TCEFORM.pages.storage_pid.suggest.default {
# Configure the suggest wizard for the field "storage_pid" in table "pages"# to search only for pages with doktype=1
searchCondition = doktype=1
}
TCEFORM.pages.storage_pid.suggest.default {
# Configure the suggest wizard for the field "storage_pid" in table "pages" to search only for whole phrases
searchWholePhrase = 1
}
This allows you to have the frontend cache for additional pages cleared when saving
to some page or branch of the page tree.
It it possible to trigger clearing of all caches or just the pages cache. It is also
possible to target precise pages either by referring to their ID numbers or to tags
that are attached to them.
Example: Clear the cache for certain pages when a record is changed¶
EXT:site_package/Configuration/page.tsconfig
TCEMAIN {
# Clear the cache for page uid 12 and 23 when saving a record in this page
clearCacheCmd = 12, 23
# Clear all frontent page caches of pages
clearCacheCmd = pages
# Clear ALL caches
clearCacheCmd = all
# Clear cache for all pages tagged with tag "pagetag1"
clearCacheCmd = cacheTag:pagetag1
}
Copied!
Note
In order for the pages and all commands to work for non-admin users,
make sure to set options.clearCache.pages = 1 or options.clearCache.all = 1 accordingly
in the user TSconfig.
Example: Do not hide pages when they are copy-pasted¶
EXT:site_package/Configuration/page.tsconfig
TCEMAIN.table.pages {
# Pages will *not* have "(copy)" appended:
disablePrependAtCopy = 1
# Pages will *not* be hidden upon copy:
disableHideAtCopy = 1
}
Copied!
These settings adjust that a page which is copied will neither have "(copy X)" appended nor be hidden.
The last page in this tree, labeled "Test", is used as original to be copied. The first sub page was
copied using the settings from the above example: It is labeled "Test" and is visible exactly like
the original page. The page "Test (copy 2)" in the middle was in contrast copied in default mode:
The page is hidden and the "(copy X)" suffix is added, if another page with the same named existed already.
Hidden page with added suffix after copying its original page
Example: Apply disableHideAtCopy as default to all tables¶
The word "prepend" is misleading. The "(copy)" label is actually appended to the record title.
Example: Do not append the "(copy)" label to newly copied pages¶
EXT:site_package/Configuration/page.tsconfig
TCEMAIN.table.pages {
# Pages will *not* have "(copy)" appended:
disablePrependAtCopy = 1
# Pages will *not* be hidden upon copy:
disableHideAtCopy = 1
}
Copied!
These settings adjust that a page which is copied will neither have "(copy X)" appended nor be hidden.
The last page in this tree, labeled "Test", is used as original to be copied. The first sub page was
copied using the settings from the above example: It is labeled "Test" and is visible exactly like
the original page. The page "Test (copy 2)" in the middle was in contrast copied in default mode:
The page is hidden and the "(copy X)" suffix is added, if another page with the same named existed already.
Hidden page with added suffix after copying its original page
Example: Apply disablePrependAtCopy as default to all tables¶
The keys in this array
uniquely identify the type of link and are used in the TYPO3 link format,
for example t3://record?identifier=my_content&uid=123. Therefore the key
must never be changed or all existing links in the content will stop working.
handler
Fully qualified name of the class containing the backend link handler.
configuration
Configuration for the link handler, depends on the handler.
For TYPO3\CMS\Backend\LinkHandler\RecordLinkHandlerconfiguration.table must be defined.
scanBefore / scanAfter
Define the order in which handlers are queried when determining
the responsible tab for editing an existing link.
displayBefore / displayAfter
Define the order of how the various tabs are displayed in the
link browser.
Changed in version 12.0
Due to the integration of EXT:recordlist into EXT:backend the namespace of
LinkHandlers has changed from TYPO3\CMS\Recordlist\LinkHandler to
TYPO3\CMS\Backend\LinkHandler.
For TYPO3 v12 the moved classes are available as an alias under the old
namespace to allow extensions to be compatible with TYPO3 v11 and v12.
Example: Display an additional tab in the linkbrowser¶
The following page TSconfig display an additional tab with the label as
title in the linkbrowser. It then saves the link in the format
t3://record?identifier=my_content&uid=123. To render the link in the
frontend you need to define the same key in the TypoScript setup
config.recordLinks.
The value copyFromParent can be set for each of the
page TSconfig TCEMAIN.permissions.* sub keys. If this value is
set, the page access permissions are copied from the parent page.
By default all new pages created by users will inherit the group of the parent
page. Members of this group get all permissions. Users not in the group get no
permissions.
When an administrator creates a new page she can use the module
System > Access to set a different owner group for this new page.
All subpages created to this new page will now automatically have the new pages
group. The administrator does not have to set custom TSconfig to achieve this.
This behaviour is similar to the "group sticky bit" in Unix for directories.
Default permissions for everybody who is not the owner user or member of
the owning group, key list: show, edit, delete, new, editcontent.
Alternatively, it is allowed to set an integer between 0 and 31, indicating
which bits corresponding to the key list should be set: show = 1,
edit = 2, delete = 4, new = 8, editcontent = 16.
It also possible to set the value
copyFromParent to inherit
the value from the parent page.
Example: Set permissions defaults so that everybody can see the page¶
EXT:site_package/Configuration/page.tsconfig
TCEMAIN.permissions {
# Everybody can at least see the page, normally everybody can do nothing
everybody = show
}
Copied!
The page "Community" was created with the settings from the example
above. Compared to the two other pages created with default
permissions you can see the effect: "Everybody" has read access:
Page with altered permissions for backend users, groups and everybody
Default permissions for group members, key list: show, edit, new,
editcontent.
Alternatively, it is allowed to set an integer between 0 and 31, indicating
which bits corresponding to the key list should be set: show = 1,
edit = 2, delete = 4, new = 8, editcontent = 16.
It also possible to set the value
copyFromParent to inherit
the value from the parent page.
Example: Set permission defaults so that the group can do anything but delete a page¶
EXT:site_package/Configuration/page.tsconfig
TCEMAIN.permissions {
# Group can do anything, normally "delete" is disabled
group = 31
}
Copied!
The page "Community" was created with the settings from the example
above. Compared to the two other pages created with default
permissions you can see the effect: The Backend Group can now also
delete the page by default:
Page with altered permissions for backend users, groups and everybody
By default the owner group of a newly created page is set to the main group
of the backend user creating the page.
By setting the value of this property to
copyFromParent the owner
group is copied from the newly created pages parent page.
The owner group of a newly created page can be hardcoded by setting this
property to a positive integer greater then zero.
Example: Set default user group for permissions on new pages¶
EXT:site_package/Configuration/page.tsconfig
TCEMAIN {
# Owner be_groups UID for new pages
permissions.groupid = 3
}
Copied!
In this instance, backend group with UID 3 is "test_group". With the configuration
above a new page would be created with this group setting instead of the default,
even if a user who is not member of that group creates the page:
Alternatively, it is allowed to set an integer between 0 and 31, indicating
which bits corresponding to the key list should be set: show = 1,
edit = 2, delete = 4, new = 8, editcontent = 16.
It also possible to set the value
copyFromParent to inherit
the value from the parent page.
Example: Set permission defaults so that the pages owner can do anything¶
EXT:site_package/Configuration/page.tsconfig
TCEMAIN.permissions {
# User can do anything, this is identical to the default value
user = 31
}
By default the owner of a newly created page is the user that created or
copied the page.
By setting the value of this property to
copyFromParent the owner
group is copied from the newly created pages parent page.
When this property is set to a positive integer the owner of new pages is
hardcoded to the user of that uid.
Example: Set default user for permissions on new pages¶
EXT:site_package/Configuration/page.tsconfig
TCEMAIN {
# Owner be_users UID for new pages
permissions.userid = 2
}
Copied!
In this instance, backend user with UID 2 is "test". With the configuration
above a new page would be created with this owner setting instead of the default,
even if another user creates the page:
Configure preview link generated for the save+view button and other frontend view related buttons
in the backend. This allows to have different preview URLs depending on the record type. A common
use case is to have previews for blog or news records, and this feature allows you to define a different
preview page for content elements as well, which might be handy if those are stored in a sysfolder.
The previewPageId is the uid of the page to use for preview. If this setting is omitted the
current page will be used. If the current page is not a normal page, the root page will be chosen.
The disableButtonForDokType setting allows you to disable the preview button for a given list
of doktypes. If none are configured, this defaults to: 199, 254, 255 (Spacer,
Folder and Recycler).
The useDefaultLanguageRecord defaults to 1 and ensures that translated records will use the
uid of the default record for the preview link. You may disable this, if your extension can deal
with the uid of translated records.
The fieldToParameterMap is a mapping which allows you to select fields of the record to be
included as GET-parameters in the preview link. The key specifies the field name and the value specifies
the GET-parameter name.
Finally additionalGetParameters allow you to add arbitrary GET-parameters and even override others.
If the plugin on your target page shows a list of records by default you will also need something like
tx_myext_pi1.action = show to ensure the record details are displayed.
The core automatically sets the "no_cache" and the "L" parameter. The language matches the language of
the current record. You may override each parameter by using the additionalGetParameters configuration
option.
Note
Make sure not to set options.saveDocView.<table name> = 0, otherwise the save+view button
will not be displayed when editing records of your table.
Attention
The configuration has to be defined for the page containing the records and previewPageId
(for example sysfolder holding the records is located outside of your root)
Processing options for tables. The table name is added, for instance TCEMAIN.table.pages.disablePrependAtCopy = 1
or TCEMAIN.table.tt_content.disablePrependAtCopy = 1.
It is also possible to set a default value for all tables, for example
TCEMAIN.default.disablePrependAtCopy = 1.
Defines the string that will be prepended to some field values if you copy an element to another
language version. This applies to all fields where the TCA columns property
l10n_mode is set to prefixLangTitle.
The special string "%s" will be replaced with the language title.
You can globally disable the prepending of the string by setting translateToMessage to
an empty string. You can disable the message to a certain field by setting the l10n_mode
to an empty string.
Example: Set a German prefix for newly translated records¶
PageTSconfig
TCEMAIN {
translateToMessage = Bitte in "%s" übersetzen:
}
All Fluid templates rendered by backend controllers can be overridden with own
templates on a per-file basis. The feature is available for basically all core
backend modules, as well as the backend main frame templates. Exceptions are
email templates and templates of the install tool.
Caution
While this feature is powerful and allows overriding nearly any backend
template, it should be used with care: Fluid templates of the Core
extensions are not considered API. The Core development needs the freedom to
add, change and delete Fluid templates any time, even for bugfix releases.
Template overrides are similar to an XCLASS in PHP - the Core can not
guarantee integrity on this level across versions.
The various combinations are best explained by example:
The linkvalidator extension (its composer name is typo3/cms-linkvalidator)
comes with a backend module in the Web main section. The page tree
is displayed for this module and linkvalidator has two main views and templates:
Resources/Private/Templates/Backend/Report.html for the
Report view and another for the Check link view. To
override the Backend/Report.html file with a custom template, this
definition can be added to the Configuration/page.tsconfig file of an
extension:
EXT:site_package/Configuration/page.tsconfig
# Left pattern (before equal sign): templates."composer-name"."something-unique"# Right pattern (after equal sign): "overriding-extension-composer-name":"entry-path"
templates.typo3/cms-linkvalidator {
1643293191 = my-vendor/my-extension:Resources/Private/TemplateOverrides
}
Copied!
If the target extension, identified by its composer name
my-vendor/my-extension, provides the
Resources/Private/TemplateOverrides/Templates/Backend/Report.html file,
this file is used instead of the default template file from the
linkvalidator extension.
All core extensions follow the general structure for templates, layouts and
partials file. If an extension needs to override a partial that
is located in Resources/Private/Partials/SomeName/SomePartial.html, and
an override has been specified like above to
my-vendor/my-extension:Resources/Private/TemplateOverrides, the system
looks for the
Resources/Private/TemplateOverrides/Partials/SomeName/SomePartial.html
file. Similar is the case for layouts.
Note
The path part of the override definition can be set the way an integrator
prefers, Resources/Private/TemplateOverrides is just an idea here and
hopefully not a bad one, further details rely on additional needs. For
instance, it is probably a good idea to include the composer or extension
name of the source extension into the path (linkvalidator in our example) -
or when using overrides based on page or group IDs, to include them in the
path.
The sub-path of the source extension is automatically added by the
system when it is searching for override files. If a layout file is located
at Resources/Private/Layouts/ExtraLarge/Main.html and an override
definition uses the Resources/Private/TemplateOverrides path, the
system will look up
Resources/Private/TemplateOverrides/Layouts/ExtraLarge/Main.html.
Template overriding is based on the existence of files: Two files are never
merged. An override definition either takes effect because it actually provides
a file at the correct position with the correct file name, or it does not and
the default is used. This can become impractical for large template files. In
such cases it might be an option to request a split of a large template file
into smaller partial files so an extension can override a specific partial only.
Attention
When multiple override paths are defined and more than one of them contains
overrides for a specific template, the override definition with the highest
numerical value wins:
Due to the nature of TSconfig and its two types page TSconfig and user TSconfig,
various combinations are possible:
Define "global" overrides with page TSconfig in
Configuration/page.tsconfig of an extension. This works for all
modules, regardless of whether the module renders a page tree or not.
Define page level overrides via the TSconfig field of page
records. As always with page TSconfig, subpages and subtrees inherit these
settings from their parent pages.
Define overrides on user or (better) group level. As always, user TSconfig can
override page TSconfig by prefixing any setting available as page TSconfig with
page. in user TSconfig. A user TSconfig template override starts
with page.templates. instead of templates..
Extensions with backend modules that use the simplified backend module template
API automatically enable the general backend template override feature.
Extension authors do not need to further prepare their extensions to enable
template overrides by other extensions.
The tx_ prefix key is not used in the Core itself, and is just a
reserved space for extensions to never collide with core options, a
use case could be tx_news for the news extension. Extension developers
should create a key like that: tx_[extension key with no underscore]
Specifies a URL to redirect to after login is performed in the backend login form. This
has been used in the past to redirect a backend user to the frontend to use frontend editing.
Require multi-factor authentication for a user. This overrules the global configuration
and can therefore also be used to unset the requirement by using 0 as value.
Disable multi-factor authentication providers for the current user or group.
It overrules the configuration from the Backend usergroup "Access List". This
means, if a provider is allowed in "Access List" but disallowed with TSconfig,
it will be disallowed for the user or user group.
Example: Disable a multi-factor authentication provider¶
The user will see these additional languages when localizing stuff in
TCEforms. The list are IDs of site languages, as defined in the
languageId property of the
site configuration.
Set groups of bookmarks that can be accessed by the user. This affects the
bookmarks toolbar item in the top right of the backend.
By default, 5 default groups will be defined globally (shared, can
only be set by admins) and also for each user (personal bookmarks):
Pages
Records
Files
Tools
Miscellaneous
Set 0 to disable one of these group IDs, 1 to enable it (this is the
default) or "string" to change the label accordingly.
Example:
EXT:site_package/Configuration/user.tsconfig
bookmarkGroups {
1 = 1
2 = My Group
3 = 0
4 =
}
Copied!
Bookmark group 1 is loaded with the default label (Pages), group 2 is
loaded and labeled as "My Group" and groups 3 and 4 are disabled.
Group 5 has not been set, so it will be displayed by default, just
like group 1.
New in version 11.0
Custom language labels can also be used instead of a fixed label:
This will allow a non-admin user to clear frontend and page-related caches,
plus some backend-related caches (that is everything including templates);
if it is explicitly set to 0 for an admin user, it will remove the clear all
option on toolbar for that user.
List of context menu ("clickmenu") items to
disable.
Context menu of the page tree
The [tableName] refers to the type of the record (database
table name) the context menu is shown for, for example, pages,
sys_file, tt_content, etc.
The optional key [.context] refers to the place from which the
context menu is triggered. The Core uses just one context called tree for
context menus triggered from page tree and folder tree. This way you can
disable certain options for one context, but keep them for another.
Items to disable for "page" type are:
view
edit
new
info
copy
copyRelease
cut
cutRelease
pasteAfter
pasteInto
newWizard
pagesSort
pagesNewMultiple
openListModule
mountAsTreeRoot
hideInMenus
showInMenus
permissions
enable
disable
delete
history
clearCache
Items to disable for "sys_file" type (that is files/folders) are:
edit
rename
upload
new
info
copy
copyRelease
cut
cutRelease
pasteInto
delete
When the system extension Import/Export (EXT:impexp) is installed then two
more options become available:
exportT3d
importT3d
Example:
EXT:site_package/Configuration/user.tsconfig
# Remove "New" and "Create New wizard" for pages context menu (list module)
options.contextMenu.table.pages.disableItems = new,newWizard
# Remove "New" and "Create New wizard" in page tree context menu
options.contextMenu.table.pages.tree.disableItems = new,newWizard
# Remove the "More options" item in the page tree context menu and all its subelements
options.contextMenu.table.pages.tree.disableItems = newWizard, pagesSort, pagesNewMultiple, openListModule, mountAsTreeRoot, exportT3d, importT3d, hideInMenus, showInMenus, permissions
The option options.defaultResourcesViewMode has
been introduced, which allows to define the initial display mode. Valid
values are therefore list and tiles, e.g.:
The listing of resources in the TYPO3 Backend, e.g. in the
File > Filelist module or the FileBrowser can be changed
between list and tiles. TYPO3 serves by default tiles, if the user
has not already made a choice.
When a user uploads files they are stored in the default upload folder
of the first file storage that user may access. The folder is used for
uploads in the TCEforms fields. In general, this will be
fileadmin/user_upload/.
With this property it is possible to set a specific upload folder.
The syntax is "storage_uid:file_path".
Note
It is also possible to set a default upload folder for a page via
page TSconfig.
Note, it is possible to set this for single tables using
options.disableDelete.<tableName>. Any value set for a single
table will override the default value set for disableDelete.
Determines whether the checkbox Show clipboard in the file list
module is shown or hidden. If it is hidden, you can predefine it to be
always activated or always deactivated.
The following values are possible:
activated
The option is activated and the checkbox is hidden.
deactivated
The option is deactivated and the checkbox is hidden.
selectable
The checkbox is shown so that the option can be selected by the user.
The column selector is enabled by default and can be disabled with this
option. The column selector is displayed at the top of each file list.
It can be used to manage the fields displayed for each file / folder,
while containing convenience actions such as "filter", "check all / none"
and "toggle selection".
The fields to be selected are a combination of special fields, such as
references or read/write permissions, the corresponding sys_file
record fields, as well as all available sys_file_metadata fields.
Example:
EXT:site_package/Configuration/user.tsconfig
# Disable the column selector
file_list.displayColumnSelector = 0
Determines whether the checkbox Display thumbnails in the
file list module is shown or hidden. If it is hidden, you can predefine it
to be always activated or always deactivated.
The following values are possible:
activated
The option is activated and the checkbox is hidden.
deactivated
The option is deactivated and the checkbox is hidden.
selectable
The checkbox is shown so that the option can be selected by the user.
Option to add more primary actions to the list view.
The list of actions to be displayed can be given in the TSConfig of
the backend user. The actions that can be added are
Sets alternative filemounts for use in any folder tree, including in the
File > List module, in the element browser and in file
selectors.
Each item consists of storage UID followed by a colon
and the folder name inside that storage. Separate multiple items by
a comma.
For backwards compatibility, defining only a folder name but no
storage uid and colon prepended is still supported. Folders
without a storage UID prepended are assumed to be located in the default
storage, which by default is the fileadmin/ folder. If a folder
you specify does not exist it will not get mounted.
Settings this option is effective in
workspaces too.
The alternative file mounts are added to the existing ones defined in
the user or group configuration.
In TYPO3 versions before 12.0 the hideModules option was
appended with the module group. This changed with the introduction of the
new module registration API
in TYPO3 v12. If you are using an older version of TYPO3 please use the
version switcher on the top left of this document to go to the respective
version.
Configure which module groups or modules should be hidden from the main menu.
Attention
It is not an access restriction but makes defined modules invisible.
This means that in principle these modules can still be accessed if the
rights allow this.
Hint
A list of all available module groups and modules can be found in in the
backend module System > Configuration > Backend Modules. The
system extension "lowlevel" has to be available for accessing this list.
Example:
EXT:site_package/Configuration/user.tsconfig
# Hide only module groups "file" and "help"
options.hideModules = file, help
# Hide additional modules "info" and "ts" from the "web" group
options.hideModules := addToList(web_info, web_ts)
# Hide only module BeLogLog from "system" group
options.hideModules = system_BelogLog
This setting hides records in the backend user interface. It is not an
access restriction but makes defined records invisible. That means in
principle those records can still be edited if the user rights allow.
This makes sense if only a specialized module should be used to edit those
otherwise hidden records.
This option is currently implemented for the pages table only and has an
effect in the following places:
The import/export module of EXT:impexp is disabled by default for
non-admin users. Enable this option, if non-admin users need to use the
module and export data. This should only be enabled for trustworthy
backend users, as it might impose a security risk.
The import/export module of EXT:impexp is disabled by default for
non-admin users. Enable this option, if non-admin users need to use the
module and import data. This should only be enabled for trustworthy
backend users, as it might impose a security risk.
In order to replace the Web > Page module within a third-party
extension, such as TemplaVoila, it is possible to create a custom module entry
in an extension's Configuration/Backend/Modules.php with the following
entry:
Sets alternative webmounts for use in the element browser. You
separate page IDs by a comma. Non-existing page IDs are ignored. If
you insert a non-integer it will evaluate to "0" (zero) and the root
of the page tree is mounted. Effective in
workspaces too.
This option allows administrators to add additional mount points
in the RTE and the wizard element browser instead of replacing
the configured database mount points of the user when using the
existing user TSconfig option.
This setting has been deprecated and will be removed in TYPO3 v14 due to its
lack of accessibility. It is being replaced with a
new label system for tree nodes.
In TYPO3 v13 the setting will be migrated to the new label system. Since the
use case is unknown, the generated label will be "Color: <value>". This
information will be displayed on all affected nodes.
If set, the node top panel feature can be configured by a comma-separated
list. Each number stands for a doktype ID
that should be added to the node top panel.
If set, the domain name will be appended to the page title for
pages that have Is root of web site? checked in the page properties.
Useful if there are several domains in one page tree.
If set, the navigation title is displayed in the page navigation tree
instead of the normal page title. The page title is shown in a
tooltip if the mouse hovers the navigation title.
If set, a button Save and create new will appear in TCEFORMs.
Note, it is possible to set this for single tables using
options.saveDocNew.[tableName].
Any value set for a single table will override the default value set for
saveDocNew.
Example:
In this example the button is disabled for all tables, except
tt_content where it will appear, and in addition create the records
in the top of the page (default is after instead of top).
EXT:site_package/Configuration/user.tsconfig
options.saveDocNew = 0
options.saveDocNew.tt_content = top
If set, a button Save and view will appear in TCEFORMs.
Note, it is possible to set this for single tables using
options.saveDocView.[tableName].
Any value set for a single table will override the default value set for
saveDocView.
If set, a button Duplicate will appear in TCEFORMs.
Note, that it is possible to set this for single tables using
options.showDuplicate.[tableName].
Any value set for a single table will override the default value set for
showDuplicate.
Shows link to the history for the record in TCEFORMs.
Note, it is possible to set this for single tables using
options.showHistory.[tableName].
Any value set for a single table will override the default value set for
showHistory.
Override any page TSconfig property on a user or group basis by prefixing
the according property path with page.. Find more information about this
in the Using and setting section.
Set permissions on a user or group basis. This is especially useful for access permissions on files and
folders as part of the Digital assets management (FAL) of the core.
Read more about FAL access permissions in the permission chapter
of the core API document, but find some examples below:
EXT:site_package/Configuration/user.tsconfig
# Allow to create and upload files on all storages
permissions.file.default.addFile = 1
# Allow to add new folders if user has write permissions on parent folder
permissions.file.default.addFolder = 1
# Allow to edit contents of files on FAL storage with uid 1
permissions.file.storage.1.writeFile = 1
Default values and override values for the User Settings module.
The User > User settings module may only represent a subset of the options from the table below.
Default values and overriding values in the User > User settings module
Properties from the list below are available the different prefixes setup.default and setup.override,
and there is another prefix to hide single fields:
This sets default values of the property. A user may override these
using its User Settings module. This affects only new users who did
not login yet. It is not usually not possible to set new defaults for users
who already logged in at least once. The only way to apply new defaults to
existing users is by Reset Backend User Preferences in the
Admin tools > Maintenance section of the install tool.
EXT:site_package/Configuration/user.tsconfig
[backend.user.isAdmin]# Some settings an administrator might find helpful
setup.default {
recursiveDelete = 1
copyLevels = 99
moduleData {
# Defaulting some options of the Template/TypoScript backend module
web_ts {
# Pre-select 'Object browser' instead of 'Constant editor'
function = TYPO3\CMS\Tstemplate\Controller\TypoScriptTemplateObjectBrowserModuleFunctionController
# Pre-select 'Setup' instead of 'Constants'
ts_browser_type = setup
# The other settings
ts_browser_const = subst
ts_browser_fixedLgd = 0
ts_browser_showComments = 1
}
}
}
[END]
This forces values for the properties of the list below, a user can not override these
setting in its User settings module. So, overriding values will be impossible for the
user to change himself and no matter what the current value is, the overriding
value will overrule it.
Attention
There is a tricky aspect to these setup.override: If first you have set a
value by setup.override and then remove it again, you will experience
that the value persists to exist. This is because it is saved in the
backend user's profile. Therefore, if you have once set a value, do
not remove it again but rather set it blank if you want to disable
the effect again!
On top of being able to set default values or override them, it is also possible to
hide fields in the User Settings module, using setup.fields.[fieldName].disabled = 1.
You can find the names of the fields in the Configuration module by browsing the "User Settings" array, example:
EXT:site_package/Configuration/user.tsconfig
# Do not show the 'emailMeAtLogin' field to the user in "User Settings" module
setup.fields.emailMeAtLogin.disabled = 1
# And force the value of this field to be set to 1
setup.override.emailMeAtLogin = 1
Value from previous record based on 'useColumnsForDefaultValues'
However the order for default values used by \TYPO3\CMS\Core\DataHandling\DataHandler if a certain
field is not granted access to for user will be:
Value from $GLOBALS['TCA']
Value from User TSconfig (these settings)
So these values will be authoritative if the user has no access to the field anyway.
Example:
EXT:site_package/Configuration/user.tsconfig
# Show newly created pages by default
TCAdefaults.pages.hidden = 0
Copied!
Attention
This example will not work when creating the page from the context menu
since this is triggered by the values listed in the ctrl section of
typo3/sysext/core/Configuration/TCA/pages.php:
If 'hidden' is in the list, it gets overridden with the "neighbor" record value (see
\TYPO3\CMS\Backend\Form\FormDataProvider\DatabaseRowInitializeNew::setDefaultsFromNeighborRow)
and as the value is set - usually to '0' - it will not be overridden
again. To make it work as expected, that value must be overridden. This
can be done for example in the Configuration/TCA/Overrides folder
of an extension:
The tx_ prefix key is not used in the core itself, and is just a
reserved space for extensions to never collide with core options, a
use case could be tx_news for the news extension. Extension developers
should create a key like that: tx_[extension key with no underscore]