selectSingle
Single select fields display a select field from which only one value can be chosen.
The according database field is generated automatically.
The renderType selectSingle creates a drop-down box with items to select a single value. Only if size is set to a value greater than one, a box is rendered containing all selectable elements from which one can be chosen.
Table of contents:
Examples for select fields with renderType selectSingle
Simple select drop down with static and database values
The location of a conference
<?php
use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
defined('TYPO3') or die();
ExtensionManagementUtility::addTCAcolumns('tx_myextension_conference', [
'location' => [
'label' => 'my_extension.db:conference.location',
'config' => [
'type' => 'select',
'renderType' => 'selectSingle',
'foreign_table' => 'tx_myextension_location',
'items' => [
['label' => '', 'value' => 0],
],
'fieldWizard' => [
'selectIcons' => [
'disabled' => false,
],
],
'relationship' => 'manyToOne',
// Venues only, not their halls
'foreign_table_where' => 'AND {#tx_myextension_location}.{#parent} = 0 ORDER BY tx_myextension_location.name',
],
],
]);
ExtensionManagementUtility::addToAllTCAtypes(
'tx_myextension_conference',
'location',
'',
'after:conference_date',
);
Select foreign rows with icons
The location of a conference, with the images of the locations
<?php
use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
defined('TYPO3') or die();
ExtensionManagementUtility::addTCAcolumns('tx_myextension_conference', [
'location' => [
'label' => 'my_extension.db:conference.location',
'config' => [
'type' => 'select',
'renderType' => 'selectSingle',
'foreign_table' => 'tx_myextension_location',
'items' => [
['label' => '', 'value' => 0],
],
'fieldWizard' => [
'selectIcons' => [
'disabled' => false,
],
],
'relationship' => 'manyToOne',
// Venues only, not their halls
'foreign_table_where' => 'AND {#tx_myextension_location}.{#parent} = 0 ORDER BY tx_myextension_location.name',
],
],
]);
ExtensionManagementUtility::addToAllTCAtypes(
'tx_myextension_conference',
'location',
'',
'after:conference_date',
);
Select a single value from a list of elements
'size' => 6,
Properties of the TCA column type select with renderType selectSingle
| Name | Type | Scope |
|---|---|---|
| boolean | Proc. | |
| string (keyword) | Display / Proc. | |
| integer | Display | |
| boolean | Proc. | |
| integer | Proc. | |
| string | Display / Proc. | |
| boolean | Display | |
| array | ||
| array | ||
| array | ||
| array | Display | |
| string | Display / Proc. | |
| integer | Display / Proc. | |
| string | Display / Proc. | |
| string (table name) | Display / Proc. | |
| string (column name) | Display / Proc. | |
| plain text label or label reference | Display | |
| string (SQL WHERE) | Display / Proc. | |
| array | Display / Proc. | |
| array | Display / Proc. | |
| array | Display / Proc. | |
| string (class->method reference) | Display / Proc. | |
| integer > 0 | Display / Proc. | |
| integer > 0 | Display | |
| string (table name) | Proc. | |
| array | Display / Proc. | |
| string (field name) | Proc. | |
| array | Proc. | |
| string (SQL WHERE) | Proc. | |
| boolean | Display / Proc. | |
| boolean | Display | |
| string | Proc. | |
| boolean | Display | |
| integer | Display | |
| array | Display |
-
- Type
- boolean
- TCA path
- $GLOBALS['TCA'][$table]['columns'][$field]['config']['allowNonIdValues']
- Scope
- Proc.
- RenderType
- all
Only useful if foreign_table is enabled.
If set, then values which are not integer ids will be allowed. May be needed if you use itemsProcFunc or enter additional items in the items array to produce some string-value elements for the list.
Note
If you mix non-database relations with database relations like this, DO NOT use integers for values and DO NOT use "_" (underscore) in values either! Will not work if you also use "MM" relations!
-
- Type
- string (keyword)
- TCA path
- $GLOBALS['TCA'][$table]['columns'][$field]['config']['authMode']
- Scope
- Display / Proc.
- RenderType
- all
Authorization mode for the selector box. The only possible option is:
- explicitAllow
- All static values from the "items" array of the selector box will be added to a matrix in the backend user configuration where a value must be explicitly selected if a user (other than admin) is allowed to use it!)
-
- Type
- integer
- TCA path
- $GLOBALS['TCA'][$table]['columns'][$field]['config']['autoSizeMax']
- Scope
- Display
The maximum size (height) of the select field.
The size of the select field will be automatically adjusted based on the number of selected items. The select field will never be smaller than the specified size and never larger than the value of
auto.Size Max Note
Only has an effect if maxitems is greater than 1.
-
-
- Type
- boolean
- Default
- false
- TCA path
- $GLOBALS['TCA'][$table]['columns'][$field]['config']['behaviour']['allowLanguageSynchronization']
- Scope
- Proc.
Allows an editor to select in a localized record whether the value is copied over from default or source language record, or if the field has an own value in the localization. If set to true and if the table supports localization and if a localized record is edited, this setting enables FieldWizard LocalizationStateSelector: Two or three radio buttons shown below the field input. The state of this is stored in a json encoded array in the database table called
l10n_. It tells the DataHandler which fields of the localization records should be kept in sync if the underlying default or source record changes.state EXT:my_extension/Configuration/TCA/Overrides/121-tx_myextension_conference-timezone.php<?php use MyVendor\MyExtension\Backend\ItemsProcessor\TimezoneItemsProcessor; use MyVendor\MyExtension\Backend\TimezoneSorter; use TYPO3\CMS\Core\Utility\ExtensionManagementUtility; defined('TYPO3') or die(); ExtensionManagementUtility::addTCAcolumns('tx_myextension_conference', [ 'timezone' => [ 'label' => 'my_extension.db:conference.timezone', 'config' => [ 'type' => 'select', 'renderType' => 'selectSingle', 'items' => [ ['label' => '', 'value' => ''], ], 'itemsProcessors' => [ 100 => [ 'class' => TimezoneItemsProcessor::class, 'parameters' => [ 'regions' => 'Europe,America', ], ], ], 'itemGroups' => [ 'Europe' => 'my_extension.db:conference.timezone.europe', 'America' => 'my_extension.db:conference.timezone.america', ], 'sortItems' => [ 'label' => 'asc', // Then by the offset to UTC, the time zones with the same offset // stay sorted by label 'offset' => TimezoneSorter::class . '->sortByOffset', ], 'dbFieldLength' => 64, 'behaviour' => [ 'allowLanguageSynchronization' => true, ], ], ], ]); ExtensionManagementUtility::addToAllTCAtypes( 'tx_myextension_conference', 'timezone', '', 'after:location', );
-
- Type
- integer
- Default
- 255
- TCA path
- $GLOBALS['TCA'][$table]['columns'][$field]['config']['dbFieldLength']
- Scope
- Proc.
New in version 13.0
As TYPO3 takes care of generating the according database field for
selectfields since TYPO3 v13, a developer can adjust the length of the database field with this option in TCA directly.The TCA config option
dbcontains an integer value that is applied toField Length varcharfields (nottext) and defines the length of the database field. It will not be respected for fields that resolve to an integer type. Developers who wish to optimize field length can usedbforField Length type=selectfields to increase or decrease the default length.
<?php
use MyVendor\MyExtension\Backend\ItemsProcessor\TimezoneItemsProcessor;
use MyVendor\MyExtension\Backend\TimezoneSorter;
use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
defined('TYPO3') or die();
ExtensionManagementUtility::addTCAcolumns('tx_myextension_conference', [
'timezone' => [
'label' => 'my_extension.db:conference.timezone',
'config' => [
'type' => 'select',
'renderType' => 'selectSingle',
'items' => [
['label' => '', 'value' => ''],
],
'itemsProcessors' => [
100 => [
'class' => TimezoneItemsProcessor::class,
'parameters' => [
'regions' => 'Europe,America',
],
],
],
'itemGroups' => [
'Europe' => 'my_extension.db:conference.timezone.europe',
'America' => 'my_extension.db:conference.timezone.america',
],
'sortItems' => [
'label' => 'asc',
// Then by the offset to UTC, the time zones with the same offset
// stay sorted by label
'offset' => TimezoneSorter::class . '->sortByOffset',
],
'dbFieldLength' => 64,
'behaviour' => [
'allowLanguageSynchronization' => true,
],
],
],
]);
ExtensionManagementUtility::addToAllTCAtypes(
'tx_myextension_conference',
'timezone',
'',
'after:location',
);
-
- Type
- string
- TCA path
- $GLOBALS['TCA'][$table]['columns'][$field]['config']['default']
- Scope
- Display / Proc.
- RenderType
- all
Default value set if a new record is created. If empty, the first element in the items array is selected.
-
- Type
- boolean
- TCA path
- $GLOBALS['TCA'][$table]['columns'][$field]['config']['disableNoMatchingValueElement']
- Scope
- Display
- RenderType
- all
If set, then no element is inserted if the current value does not match any of the existing elements. A corresponding options is also found in Page TSconfig.
-
For details see fieldControl.
-
For details see fieldInformation.
-
-
- Type
- array
- TCA path
- $GLOBALS['TCA'][$table]['columns'][$field]['config']['fieldWizard']['defaultLanguageDifferences']
For details see defaultLanguageDifferences.
-
- Type
- array
- TCA path
- $GLOBALS['TCA'][$table]['columns'][$field]['config']['fieldWizard']['localizationStateSelector']
For details see localizationStateSelector.
-
- Type
- array
- TCA path
- $GLOBALS['TCA'][$table]['columns'][$field]['config']['fieldWizard']['otherLanguageContent']
For details see otherLanguageContent.
-
- Type
- array
- TCA path
- $GLOBALS['TCA'][$table]['columns'][$field]['config']['fieldWizard']['selectIcons']
- Scope
- Display
Render thumbnails of icons below the select drop-down. Disabled by default.
-
-
- Type
- string
- TCA path
- $GLOBALS['TCA'][$table]['columns'][$field]['config']['fileFolderConfig']['allowedExtensions']
- Scope
- Display / Proc.
List of file extensions to select. If blank, all files are selected. Specify list in lowercase.
This configuration can be overridden by Page TSconfig.
-
- Type
- integer
- TCA path
- $GLOBALS['TCA'][$table]['columns'][$field]['config']['fileFolderConfig']['depth']
- Scope
- Display / Proc.
- RenderType
- all
Depth of directory recursions. Default is 99. Specify in range from 0-99. 0 (zero) means no recursion into subdirectories. Only useful in combination with property folder.
This configuration can be overridden by Page TSconfig.
-
- Type
- string
- TCA path
- $GLOBALS['TCA'][$table]['columns'][$field]['config']['fileFolderConfig']['folder']
- Scope
- Display / Proc.
Specifying a folder from where files are added to the item array.
Specify the folder relative to the
\TYPO3\. See getPublicPath() . Alternatively use the prefix "EXT:" to point to an extension folder.CMS\ Core\ Core\ Environment:: get Public Path () Files from the folder are selected recursively to the level specified by depth and only files of the extensions defined by allowedExtensions are listed in the select box.
Only the file reference relative to the folder is stored.
If the files are images (gif,png,jpg) they will be configured as icons (third parameter in items array).
This configuration can be overridden by Page TSconfig.
Examples: Select SVGs recursively from a folder
A marker icon from a folder
EXT:my_extension/Configuration/TCA/Overrides/440-tx_myextension_location-marker.php<?php use TYPO3\CMS\Core\Utility\ExtensionManagementUtility; defined('TYPO3') or die(); ExtensionManagementUtility::addTCAcolumns('tx_myextension_location', [ 'marker' => [ 'label' => 'my_extension.db:location.marker', 'config' => [ 'type' => 'select', 'renderType' => 'selectSingle', 'items' => [ ['label' => '', 'value' => ''], ], 'fileFolderConfig' => [ 'folder' => 'EXT:my_extension/Resources/Public/Icons/Markers/', 'allowedExtensions' => 'svg', 'depth' => 0, ], 'fieldWizard' => [ 'selectIcons' => [ 'disabled' => false, ], ], ], ], ]); ExtensionManagementUtility::addToAllTCAtypes( 'tx_myextension_location', 'marker', '', 'after:image', );
-
- Type
- string (table name)
- TCA path
- $GLOBALS['TCA'][$table]['columns'][$field]['config']['foreign_table']
- Scope
- Display / Proc.
- RenderType
- all
The item-array will be filled with records from the table defined here. The table must have a TCA definition.
The uids of the chosen records will be saved in a comma separated list by default.
Use property MM to store the values in an intermediate MM table instead.
The location of a conference, with the images of the locations
<?php
use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
defined('TYPO3') or die();
ExtensionManagementUtility::addTCAcolumns('tx_myextension_conference', [
'location' => [
'label' => 'my_extension.db:conference.location',
'config' => [
'type' => 'select',
'renderType' => 'selectSingle',
'foreign_table' => 'tx_myextension_location',
'items' => [
['label' => '', 'value' => 0],
],
'fieldWizard' => [
'selectIcons' => [
'disabled' => false,
],
],
'relationship' => 'manyToOne',
// Venues only, not their halls
'foreign_table_where' => 'AND {#tx_myextension_location}.{#parent} = 0 ORDER BY tx_myextension_location.name',
],
],
]);
ExtensionManagementUtility::addToAllTCAtypes(
'tx_myextension_conference',
'location',
'',
'after:conference_date',
);
The speakers of a conference
<?php
use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
defined('TYPO3') or die();
ExtensionManagementUtility::addTCAcolumns('tx_myextension_conference', [
'speakers' => [
'label' => 'my_extension.db:conference.speakers',
'config' => [
'type' => 'select',
'renderType' => 'selectMultipleSideBySide',
'foreign_table' => 'tx_myextension_speaker',
'MM' => 'tx_myextension_conference_speaker_mm',
// Speakers in the default language, not their translations
'foreign_table_where' => 'AND {#tx_myextension_speaker}.{#sys_language_uid} IN (-1, 0) ORDER BY tx_myextension_speaker.name',
'size' => 5,
'autoSizeMax' => 20,
'fieldControl' => [
'editPopup' => [
'disabled' => false,
'options' => [
'title' => 'my_extension.db:conference.speakers.edit',
],
],
'addRecord' => [
'disabled' => false,
'options' => [
'title' => 'my_extension.db:conference.speakers.add',
// A new speaker comes first in the list of selected speakers
'setValue' => 'prepend',
],
],
'listModule' => [
'disabled' => false,
'options' => [
'title' => 'my_extension.db:conference.speakers.list',
],
],
],
],
],
]);
ExtensionManagementUtility::addToAllTCAtypes(
'tx_myextension_conference',
'speakers',
'',
'before:--div--;my_extension.db:tab.details',
);
-
- Type
- string (column name)
- TCA path
- $GLOBALS['TCA'][$table]['columns'][$field]['config']['foreign_table_item_group']
- Scope
- Display / Proc.
- RenderType
- all
- Added
- 13.0
This property references a specific field in the foreign table, which holds an item group identifier.
<?php
use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
defined('TYPO3') or die();
ExtensionManagementUtility::addTCAcolumns('tx_myextension_talk', [
'sponsor' => [
'label' => 'my_extension.db:talk.sponsor',
'config' => [
'type' => 'select',
'renderType' => 'selectSingle',
'items' => [
['label' => '', 'value' => 0],
],
'foreign_table' => 'tx_myextension_sponsor',
// The tier of a sponsor is the group of its item
'foreign_table_item_group' => 'tier',
'itemGroups' => [
'gold' => 'my_extension.db:sponsor.tier.gold',
'silver' => 'my_extension.db:sponsor.tier.silver',
'bronze' => 'my_extension.db:sponsor.tier.bronze',
],
'relationship' => 'manyToOne',
],
],
]);
ExtensionManagementUtility::addToAllTCAtypes(
'tx_myextension_talk',
'sponsor',
'',
'after:speaker',
);
-
- Type
- plain text label or label reference
- TCA path
- $GLOBALS['TCA'][$table]['columns'][$field]['config']['foreign_table_prefix']
- Scope
- Display
- RenderType
- all
Label prefix to the title of the records from the foreign-table.
The location of a conference
'foreign_table_prefix' => 'Venue: ',
-
- Type
- string (SQL WHERE)
- TCA path
- $GLOBALS['TCA'][$table]['columns'][$field]['config']['foreign_table_where']
- Scope
- Display / Proc.
- RenderType
- all
The items from foreign_table are selected with this
WHEREclause. TheWHEREclause is effectively appended to the existingWHEREclause (which contains default constraints, such asNOT deleted) and must begin withAND.
The example below uses the special field quoting syntax {#...} around
identifiers to be as DBAL-compatible as possible.
Note that
ORDER BY
and
GROUP BY
should NOT be quoted, since they always receive proper quoting automatically
through the API.
Markers inside the WHERE statement
It is possible to use markers in the WHERE clause:
- ###REC_FIELD_[field name]###
-
Any field of the current record.
Note
The field name part of the marker is not in upper case letters. It must match the exact case used in the database.
So for example
sys_must be referenced usinglanguage_ uid ###REC_FIELD_ sys_ language_ uid### - ###THIS_UID###
- Current element uid (zero if new).
- ###CURRENT_PID###
- The current page id (pid of the record).
###SITEROOT###
- ###PAGE_TSCONFIG_ID###
- A value you can set from Page TSconfig dynamically.
- ###PAGE_TSCONFIG_IDLIST###
- A value you can set from Page TSconfig dynamically.
- ###PAGE_TSCONFIG_STR###
- A value you can set from Page TSconfig dynamically.
- ###SITE:<KEY>.<SUBKEY>###
- A value from the site configuration, for example:
###SITE:ormy Setting. category Pid### ###SITE:. Also values of extension configuration settings are possible. E.g. if there isroot Page Id### settings.defined insitepackage. imprint Page Uid EXT:and set inmy_ sitepackage/ Configuration/ Sets/ Main/ settings. definitions. yaml config/:sites/ mysite/ settings. yaml ###SITE:settings. sitepackage. imprint Page Uid###
The markers are preprocessed so that the value of CURRENT_PID and PAGE_TSCONFIG_ID are always integers (default is zero), PAGE_TSCONFIG_IDLIST will always be a comma-separated list of integers (default is zero) and PAGE_TSCONFIG_STR will be quoted before substitution (default is blank string).
More information about markers set by Page TSconfig can be found in the TSconfig reference.
The location of a conference
<?php
use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
defined('TYPO3') or die();
ExtensionManagementUtility::addTCAcolumns('tx_myextension_conference', [
'location' => [
'label' => 'my_extension.db:conference.location',
'config' => [
'type' => 'select',
'renderType' => 'selectSingle',
'foreign_table' => 'tx_myextension_location',
'items' => [
['label' => '', 'value' => 0],
],
'fieldWizard' => [
'selectIcons' => [
'disabled' => false,
],
],
'relationship' => 'manyToOne',
// Venues only, not their halls
'foreign_table_where' => 'AND {#tx_myextension_location}.{#parent} = 0 ORDER BY tx_myextension_location.name',
],
],
]);
ExtensionManagementUtility::addToAllTCAtypes(
'tx_myextension_conference',
'location',
'',
'after:conference_date',
);
-
- Type
- array
- TCA path
- $GLOBALS['TCA'][$table]['columns'][$field]['config']['itemGroups']
- Scope
- Display / Proc.
- RenderType
- all
Contains an array of key-value pairs. The key contains the id of the item group, the value contains the label of the item group or its language reference.
Only groups containing items will be displayed. In the select field first all items with no group defined are listed then the item groups in the order of their definition, each group with the corresponding items.
Item groups are rendered as
<optgroup>.Item groups can also be defined for items in foreign tables.
See also item group API methods
The audience of a talk in two groups
<?php
use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
defined('TYPO3') or die();
ExtensionManagementUtility::addTCAcolumns('tx_myextension_talk', [
'audience' => [
'label' => 'my_extension.db:talk.audience',
'config' => [
'type' => 'select',
'renderType' => 'selectSingleBox',
'items' => [
['label' => 'my_extension.db:talk.audience.developers', 'value' => 'developers', 'group' => 'technical'],
['label' => 'my_extension.db:talk.audience.integrators', 'value' => 'integrators', 'group' => 'technical'],
['label' => 'my_extension.db:talk.audience.editors', 'value' => 'editors', 'group' => 'business'],
['label' => 'my_extension.db:talk.audience.decision_makers', 'value' => 'decision_makers', 'group' => 'business'],
],
'itemGroups' => [
'technical' => 'my_extension.db:talk.audience.technical',
'business' => 'my_extension.db:talk.audience.business',
],
'behaviour' => [
'allowLanguageSynchronization' => true,
],
],
],
]);
ExtensionManagementUtility::addToAllTCAtypes(
'tx_myextension_talk',
'audience',
'',
'after:spoken_language',
);
The audience of a talk in two groups
<?php
use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
defined('TYPO3') or die();
ExtensionManagementUtility::addTCAcolumns('tx_myextension_talk', [
'audience' => [
'label' => 'my_extension.db:talk.audience',
'config' => [
'type' => 'select',
'renderType' => 'selectSingleBox',
'items' => [
['label' => 'my_extension.db:talk.audience.developers', 'value' => 'developers', 'group' => 'technical'],
['label' => 'my_extension.db:talk.audience.integrators', 'value' => 'integrators', 'group' => 'technical'],
['label' => 'my_extension.db:talk.audience.editors', 'value' => 'editors', 'group' => 'business'],
['label' => 'my_extension.db:talk.audience.decision_makers', 'value' => 'decision_makers', 'group' => 'business'],
],
'itemGroups' => [
'technical' => 'my_extension.db:talk.audience.technical',
'business' => 'my_extension.db:talk.audience.business',
],
'behaviour' => [
'allowLanguageSynchronization' => true,
],
],
],
]);
ExtensionManagementUtility::addToAllTCAtypes(
'tx_myextension_talk',
'audience',
'',
'after:spoken_language',
);
-
- Type
- array
- TCA path
- $GLOBALS['TCA'][$table]['columns'][$field]['config']['items']
- Scope
- Display / Proc.
- RenderType
- all
Contains the elements for the selector box unless the property
foreign_ortable specialhas been set in which case automated values are set in addition to any values listed in this array.Items registered for the field
CTypeof tablett_get automatically added to the New content element wizard. Settings from the items property can be overridden via page TSconfig newContentElement.wizardItems.content See also Add content elements to the Content Element Wizard.
Each element in this array is in itself an associative array.
- label (plain text label or label reference)
- The displayed title.
- value (integer or string)
-
The value stored in the database.
- The special value
--was used to insert a non-selectablediv-- - value that appears as a divider label in the selector box. It is kept for backwards-compatible reasons. Use item groups for custom selects instead.
- The special value
- Values must not contain
,(comma) and|(vertical bar). If you want to useauth, you shouldMode - also refrain from using
:(colon).
- Values must not contain
- icon (EXT: path or icon identifier)
- Optional icon. For custom icons use a path prepended with
EXT:to refer to an image file found inside an extension or use an registered icon identifier. If configured on theforeign_, selicon-field is respected.table - iconOverlay (icon identifier)
New in version 13.4.19
Optional overlay shown on top of the
iconin the New content element wizard. Only used for items of the fieldCTypeof tablett_. This replaces settingcontent iconin page TSconfig newContentElement.wizardItems, which still works.Overlay EXT:my_extension/Configuration/TCA/Overrides/610-tt_content-call_for_papers.php<?php use TYPO3\CMS\Core\Utility\ExtensionManagementUtility; defined('TYPO3') or die(); // Add the content element to the "Type" dropdown, with the predefined // fields on the "General" tab ExtensionManagementUtility::addRecordType( [ 'label' => 'my_extension.db:tt_content.call_for_papers', 'value' => 'myextension_callforpapers', 'icon' => 'content-text', // In the "New content element" wizard, the overlay shows that a call // for papers has a deadline 'iconOverlay' => 'overlay-endtime', 'group' => 'conference', ], '--palette--;;headers, bodytext', );- group (string)
- The key of the item group.
- description (string or array)
- Fifth value is an optional description text. This is only shown when the list is shown
with
render.Type='select Check Box'
Note
When having a zero as
valueand the field is of typeintin the database, make sure to define the default value as well in TCA:(10) 'default' => 0. Otherwise issues may arise, e.g. with MySQL strict mode.
The salutation of a speaker
<?php
use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
defined('TYPO3') or die();
ExtensionManagementUtility::addTCAcolumns('tx_myextension_speaker', [
'salutation' => [
'label' => 'my_extension.db:speaker.salutation',
'config' => [
'type' => 'select',
'renderType' => 'selectSingle',
'items' => [
['label' => '', 'value' => ''],
[
'label' => 'my_extension.db:speaker.salutation.mr',
'value' => 'mr',
],
[
'label' => 'my_extension.db:speaker.salutation.ms',
'value' => 'ms',
],
[
'label' => 'my_extension.db:speaker.salutation.mx',
'value' => 'mx',
],
],
],
],
]);
ExtensionManagementUtility::addToAllTCAtypes(
'tx_myextension_speaker',
'salutation',
'',
'before:name',
);
Each content element type is an item of the field CType of the table
tt_. The API method add adds the item with a label, a
value, and an icon:
<?php
use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
defined('TYPO3') or die();
// Add the content element to the "Type" dropdown, with the predefined
// fields on the "General" tab
ExtensionManagementUtility::addRecordType(
[
'label' => 'my_extension.db:tt_content.call_for_papers',
'value' => 'myextension_callforpapers',
'icon' => 'content-text',
// In the "New content element" wizard, the overlay shows that a call
// for papers has a deadline
'iconOverlay' => 'overlay-endtime',
'group' => 'conference',
],
'--palette--;;headers, bodytext',
);
A select single field of size 6 with 3 item groups and one item without group.
The audience of a talk in two groups
<?php
use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
defined('TYPO3') or die();
ExtensionManagementUtility::addTCAcolumns('tx_myextension_talk', [
'audience' => [
'label' => 'my_extension.db:talk.audience',
'config' => [
'type' => 'select',
'renderType' => 'selectSingleBox',
'items' => [
['label' => 'my_extension.db:talk.audience.developers', 'value' => 'developers', 'group' => 'technical'],
['label' => 'my_extension.db:talk.audience.integrators', 'value' => 'integrators', 'group' => 'technical'],
['label' => 'my_extension.db:talk.audience.editors', 'value' => 'editors', 'group' => 'business'],
['label' => 'my_extension.db:talk.audience.decision_makers', 'value' => 'decision_makers', 'group' => 'business'],
],
'itemGroups' => [
'technical' => 'my_extension.db:talk.audience.technical',
'business' => 'my_extension.db:talk.audience.business',
],
'behaviour' => [
'allowLanguageSynchronization' => true,
],
],
],
]);
ExtensionManagementUtility::addToAllTCAtypes(
'tx_myextension_talk',
'audience',
'',
'after:spoken_language',
);
-
- Type
- array
- TCA path
- $GLOBALS['TCA'][$table]['columns'][$field]['config']['itemsProcessors']
- Scope
- Display / Proc.
- Added
- 14.0
An array indexed numerically. Each entry defines an item processor implementing
Items.Processor Interface Item processors are executed sequentially based on their numerical array key. Each processor can add, modify, or remove items from the
Select, influencing which items are ultimately displayed.Item Collection This option can be combined with itemsProcFunc. If both are configured,
itemsis executed first andProc Func itemsare executed afterwards.Processors EXT:my_extension/Configuration/TCA/Overrides/121-tx_myextension_conference-timezone.php<?php use MyVendor\MyExtension\Backend\ItemsProcessor\TimezoneItemsProcessor; use MyVendor\MyExtension\Backend\TimezoneSorter; use TYPO3\CMS\Core\Utility\ExtensionManagementUtility; defined('TYPO3') or die(); ExtensionManagementUtility::addTCAcolumns('tx_myextension_conference', [ 'timezone' => [ 'label' => 'my_extension.db:conference.timezone', 'config' => [ 'type' => 'select', 'renderType' => 'selectSingle', 'items' => [ ['label' => '', 'value' => ''], ], 'itemsProcessors' => [ 100 => [ 'class' => TimezoneItemsProcessor::class, 'parameters' => [ 'regions' => 'Europe,America', ], ], ], 'itemGroups' => [ 'Europe' => 'my_extension.db:conference.timezone.europe', 'America' => 'my_extension.db:conference.timezone.america', ], 'sortItems' => [ 'label' => 'asc', // Then by the offset to UTC, the time zones with the same offset // stay sorted by label 'offset' => TimezoneSorter::class . '->sortByOffset', ], 'dbFieldLength' => 64, 'behaviour' => [ 'allowLanguageSynchronization' => true, ], ], ], ]); ExtensionManagementUtility::addToAllTCAtypes( 'tx_myextension_conference', 'timezone', '', 'after:location', );For fields of type
select, eachSelectmust be created withItem type: 'select'and must provide alabeland avalue. The value can be an integer or a string. Use the special value'--to insert a divider (that cannot be selected).div--' You can also use any arguments supported by the items array, including
groupto group items andiconto display an icon with the item. Rendering thedescriptionis not supported.EXT:my_extension/Classes/Backend/ItemsProcessor/TimezoneItemsProcessor.php<?php declare(strict_types=1); namespace MyVendor\MyExtension\Backend\ItemsProcessor; use TYPO3\CMS\Core\DataHandling\ItemsProcessorContext; use TYPO3\CMS\Core\DataHandling\ItemsProcessorInterface; use TYPO3\CMS\Core\Schema\Struct\SelectItem; use TYPO3\CMS\Core\Schema\Struct\SelectItemCollection; /** * Offers the time zones of the regions given in the parameter "regions", * grouped by region */ final readonly class TimezoneItemsProcessor implements ItemsProcessorInterface { public function processItems( SelectItemCollection $items, ItemsProcessorContext $context, ): SelectItemCollection { $regions = explode(',', (string)($context->processorParameters['regions'] ?? 'Europe')); foreach (\DateTimeZone::listIdentifiers() as $identifier) { [$region, $city] = array_pad(explode('/', $identifier, 2), 2, ''); if ($city === '' || !in_array($region, $regions, true)) { continue; } $items->add(new SelectItem( type: 'select', label: str_replace('_', ' ', $city), value: $identifier, group: $region, )); } return $items; } }
-
- Type
- string (class->method reference)
- TCA path
- $GLOBALS['TCA'][$table]['columns'][$field]['config']['itemsProcFunc']
- Scope
- Display / Proc.
PHP method which is called to fill or manipulate the items array. See itemsProcFunc about details.
-
- Type
- integer > 0
- TCA path
- $GLOBALS['TCA'][$table]['columns'][$field]['config']['maxitems']
- Scope
- Display / Proc.
Maximum number of child items. Defaults to a high value. JavaScript record validation prevents the record from being saved if the limit is not satisfied.
-
- Type
- integer > 0
- TCA path
- $GLOBALS['TCA'][$table]['columns'][$field]['config']['minitems']
- Scope
- Display
Minimum number of child items. Defaults to 0. JavaScript record validation prevents the record from being saved if the limit is not satisfied.
Note
TCA table column fields that define ['config'] can omit the
specification of the intermediate MM table layout in
ext_tables.sql. The TYPO3 database
analyzer takes care of proper schema definition.
-
- Type
- string (table name)
- TCA path
- $GLOBALS['TCA'][$table]['columns'][$field]['config']['MM']
- Scope
- Proc.
This value contains the name of the table in which to store a MM relation. It is used together with foreign_table.
The database field with a MM property only stores the number of records in the relation.
Please have a look into the additional information in the MM common property description.
The speakers of a conference
<?php
use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
defined('TYPO3') or die();
ExtensionManagementUtility::addTCAcolumns('tx_myextension_conference', [
'speakers' => [
'label' => 'my_extension.db:conference.speakers',
'config' => [
'type' => 'select',
'renderType' => 'selectMultipleSideBySide',
'foreign_table' => 'tx_myextension_speaker',
'MM' => 'tx_myextension_conference_speaker_mm',
// Speakers in the default language, not their translations
'foreign_table_where' => 'AND {#tx_myextension_speaker}.{#sys_language_uid} IN (-1, 0) ORDER BY tx_myextension_speaker.name',
'size' => 5,
'autoSizeMax' => 20,
'fieldControl' => [
'editPopup' => [
'disabled' => false,
'options' => [
'title' => 'my_extension.db:conference.speakers.edit',
],
],
'addRecord' => [
'disabled' => false,
'options' => [
'title' => 'my_extension.db:conference.speakers.add',
// A new speaker comes first in the list of selected speakers
'setValue' => 'prepend',
],
],
'listModule' => [
'disabled' => false,
'options' => [
'title' => 'my_extension.db:conference.speakers.list',
],
],
],
],
],
]);
ExtensionManagementUtility::addToAllTCAtypes(
'tx_myextension_conference',
'speakers',
'',
'before:--div--;my_extension.db:tab.details',
);
-
- Type
- array
- TCA path
- $GLOBALS['TCA'][$table]['columns'][$field]['config']['MM_match_fields']
- Scope
- Display / Proc.
Array of field => value pairs to both insert and match against when writing/reading MM relations.
-
- Type
- string (field name)
- TCA path
- $GLOBALS['TCA'][$table]['columns'][$field]['config']['MM_opposite_field']
- Scope
- Proc.
If you want to make a MM relation editable from the foreign side (bidirectional) of the relation as well, you need to set
MM_on the foreign side to the field name on the local side.opposite_ field For example, if the field
companies.is your local side and you want to make the same relation editable from the foreign side of the relation in a field calledemployees persons., you would need to set theemployers MM_value of the TCA configuration of theopposite_ field persons.field to the string "employees".employers Note
Bidirectional references only get registered once on the native side in
sys_.refindex
-
- Type
- array
- TCA path
- $GLOBALS['TCA'][$table]['columns'][$field]['config']['MM_oppositeUsage']
- Scope
- Proc.
In a MM bidirectional relation using match fields the opposite side needs to know about the match fields for certain operations (for example, when a copy is created in a workspace) so that relations are carried over with the correct information.
MM_is an array which references which fields contain the references to the opposite side, so that they can be queried for match field configuration.opposite Usage
-
- Type
- string (SQL WHERE)
- TCA path
- $GLOBALS['TCA'][$table]['columns'][$field]['config']['MM_table_where']
- Scope
- Proc.
Additional where clause used when reading MM relations.
Example:
{#uid_local} = ###THIS_UID###Copied!The above example uses the special field quoting syntax
{#...}around identifiers to be as DBAL-compatible as possible.
-
- Type
- boolean
- TCA path
- $GLOBALS['TCA'][$table]['columns'][$field]['config']['multiple']
- Scope
- Display / Proc.
Allows the same item more than once in a list.
If used with bidirectional MM relations it must be set for both the native and foreign field configuration.
-
- Type
- boolean
- TCA path
- $GLOBALS['TCA'][$table]['columns'][$field]['config']['readOnly']
- Scope
- Display
Renders the field in a way that the user can see the value but cannot edit it.
Warning
This property affects only the display. It is still possible to write to those fields when using the DataHandler.
-
- Type
- string
- Default
manyifTo One foreign_is settable - TCA path
- $GLOBALS['TCA'][$table]['columns'][$field]['config']['relationship']
- Scope
- Proc.
New in version 13.3
Defines whether the field holds one related record or several, if it relates to records through
foreign_. This decides which value a Record object provides for this field, for example in a Fluid template.table one,To One manyTo One - The field provides a single
Recordobject, ornullif no record is selected.maxitemsis set to1automatically, overriding any other value. oneTo Many - The field provides a
LazyofRecord Collection Recordobjects.
A field with
MMalways provides a collection, whateverrelationshipsays. Any other value, includingmany, throws an exception unlessTo Many MMis set.maxitemsdoes not change the result the other way round: a field withonestill provides a collection, even ifTo Many maxitemsis1.A select field without
foreign_has no relation. It provides an array of the selected values, or the single value fortable render.Type => 'select Single' If
relationshipis not set and the field has aforeign_, TYPO3 sets it totable many, so the field provides a single record. With MM, it is set toTo One manyinstead, and the field provides a collection.To Many
-
- Type
- boolean
- Default
- false
- TCA path
- $GLOBALS['TCA'][$table]['columns'][$field]['config']['showIfEmpty']
- Scope
- Display
Changed in version 14.2
Starting with TYPO3 14.2, relational fields are hidden when no selectable items are available. Option
showwill disable this behaviour.If Empty By default,
selectfields and any render types are hidden when no select items are available. Settingshowto true displays the field even if no options are available.If Empty EXT:my_extension/Configuration/TCA/Overrides/pages.php$GLOBALS['TCA']['pages']['columns']['some_select_field']['config']['showIfEmpty'] = true;Copied!Possible reasons why no select items are available:
- a foreign_table is used and the referenced table has no records or none matching the foreign_table_where.
- a foreign_table is used and the currently logged in user has no permissions for the referenced table or its records.
- All items have been hidden via page TSconfig, for example, removeItems or keepItems are inproperly configured.
- The itemsProcessors or itemsProcFunc had no result.
-
- Type
- integer
- Default
- 1
- TCA path
- $GLOBALS['TCA'][$table]['columns'][$field]['config']['size']
- Scope
- Display
If set to 1 (default), displays a select drop-down, else a select box of given size.
-
- Type
- array
- TCA path
- $GLOBALS['TCA'][$table]['columns'][$field]['config']['sortItems']
- Scope
- Display
- RenderType
- all
The property
sortallows sorting of static select items by their values or labels.Items Built-in orderings are to sort items by their labels or values. It is also possible to define custom sorting via PHP code.
When using grouped select fields with itemGroups, sorting happens on a per-group basis - all items within one group are sorted - as the group ordering is preserved.
The time zone of a conference
<?php
use MyVendor\MyExtension\Backend\ItemsProcessor\TimezoneItemsProcessor;
use MyVendor\MyExtension\Backend\TimezoneSorter;
use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
defined('TYPO3') or die();
ExtensionManagementUtility::addTCAcolumns('tx_myextension_conference', [
'timezone' => [
'label' => 'my_extension.db:conference.timezone',
'config' => [
'type' => 'select',
'renderType' => 'selectSingle',
'items' => [
['label' => '', 'value' => ''],
],
'itemsProcessors' => [
100 => [
'class' => TimezoneItemsProcessor::class,
'parameters' => [
'regions' => 'Europe,America',
],
],
],
'itemGroups' => [
'Europe' => 'my_extension.db:conference.timezone.europe',
'America' => 'my_extension.db:conference.timezone.america',
],
'sortItems' => [
'label' => 'asc',
// Then by the offset to UTC, the time zones with the same offset
// stay sorted by label
'offset' => TimezoneSorter::class . '->sortByOffset',
],
'dbFieldLength' => 64,
'behaviour' => [
'allowLanguageSynchronization' => true,
],
],
],
]);
ExtensionManagementUtility::addToAllTCAtypes(
'tx_myextension_conference',
'timezone',
'',
'after:location',
);
'sortItems' => [
'value' => 'desc',
],
The time zones of a conference are sorted by label first, and then by their
offset to UTC. A key other than label and value names a method in the
form Class:
<?php
use MyVendor\MyExtension\Backend\ItemsProcessor\TimezoneItemsProcessor;
use MyVendor\MyExtension\Backend\TimezoneSorter;
use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
defined('TYPO3') or die();
ExtensionManagementUtility::addTCAcolumns('tx_myextension_conference', [
'timezone' => [
'label' => 'my_extension.db:conference.timezone',
'config' => [
'type' => 'select',
'renderType' => 'selectSingle',
'items' => [
['label' => '', 'value' => ''],
],
'itemsProcessors' => [
100 => [
'class' => TimezoneItemsProcessor::class,
'parameters' => [
'regions' => 'Europe,America',
],
],
],
'itemGroups' => [
'Europe' => 'my_extension.db:conference.timezone.europe',
'America' => 'my_extension.db:conference.timezone.america',
],
'sortItems' => [
'label' => 'asc',
// Then by the offset to UTC, the time zones with the same offset
// stay sorted by label
'offset' => TimezoneSorter::class . '->sortByOffset',
],
'dbFieldLength' => 64,
'behaviour' => [
'allowLanguageSynchronization' => true,
],
],
],
]);
ExtensionManagementUtility::addToAllTCAtypes(
'tx_myextension_conference',
'timezone',
'',
'after:location',
);
The method receives the items as
Select objects by reference.
The orderings run one after the other, and
usort keeps the order
of equal items. Time zones with the same offset therefore stay sorted by
label:
<?php
declare(strict_types=1);
namespace MyVendor\MyExtension\Backend;
use TYPO3\CMS\Core\Schema\Struct\SelectItem;
/**
* Sorts time zones by their current offset to UTC. Time zones with the
* same offset keep their previous order.
*/
final class TimezoneSorter
{
/**
* @param SelectItem[] $items
*/
public function sortByOffset(array &$items): void
{
$now = new \DateTimeImmutable();
usort(
$items,
static fn(SelectItem $a, SelectItem $b): int => self::getOffset($a, $now) <=> self::getOffset($b, $now),
);
}
private static function getOffset(SelectItem $item, \DateTimeImmutable $now): int
{
try {
return (new \DateTimeZone((string)$item->getValue()))->getOffset($now);
} catch (\Exception) {
// The empty item stays first
return PHP_INT_MIN;
}
}
}