Customization Examples

Many extracts can be found throughout the manual, but this section provides more complete examples.

Example 1: Extending the fe_users table

The "examples" extension adds two fields to the "fe_users" table. Here's the complete code, taken from file Configuration/TCA/Overrides/fe_users.php:

<?php
defined('TYPO3') or die();

// Add some fields to fe_users table to show TCA fields definitions
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTCAcolumns('fe_users',
   [
      'tx_examples_options' => [
         'exclude' => 0,
         'label' => 'LLL:EXT:examples/Resources/Private/Language/locallang_db.xlf:fe_users.tx_examples_options',
         'config' => [
            'type' => 'select',
            'renderType' => 'selectSingle',
            'items' => [
               ['',0,],
               ['LLL:EXT:examples/Resources/Private/Language/locallang_db.xlf:fe_users.tx_examples_options.I.0',1,],
               ['LLL:EXT:examples/Resources/Private/Language/locallang_db.xlf:fe_users.tx_examples_options.I.1',2,],
               ['LLL:EXT:examples/Resources/Private/Language/locallang_db.xlf:fe_users.tx_examples_options.I.2','--div--',],
               ['LLL:EXT:examples/Resources/Private/Language/locallang_db.xlf:fe_users.tx_examples_options.I.3',3,],
            ],
            'size' => 1,
            'maxitems' => 1,
         ],
      ],
      'tx_examples_special' => [
         'exclude' => 0,
         'label' => 'LLL:EXT:examples/Resources/Private/Language/locallang_db.xlf:fe_users.tx_examples_special',
         'config' => [
            'type' => 'user',
            // renderType needs to be registered in ext_localconf.php
            'renderType' => 'specialField',
            'parameters' => [
               'size' => '30',
               'color' => '#F49700',
            ],
         ],
      ],
   ]
);
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addToAllTCAtypes(
   'fe_users',
   'tx_examples_options, tx_examples_special'
);
Copied!

Read why the check for the TYPO3 constant is necessary.

In this example the first method call adds fields using ExtensionManagementUtility::addTCAcolumns(). This ensures that the fields are registered in $GLOBALS['TCA']. Parameters:

  1. Name of the table to which the fields should be added.
  2. An array of the fields to be added. Each field is represented in the TCA syntax for columns.

Since the fields are only registered but not used anywhere, the fields are afterwards added to the "types" definition of the fe_users table by calling ExtensionManagementUtility::addToAllTCAtypes(). Parameters:

  1. Name of the table to which the fields should be added.
  2. Comma-separated string of fields, the same syntax used in the showitem property of types in TCA.
  3. Optional: record types of the table where the fields should be added, see types in TCA for details.
  4. Optional: position ('before' or 'after') in relation to an existing field (after:myfield) or palette (after:palette:mypalette).

So you could do this:

EXT:some_extension/Configuration/TCA/Overrides/fe_users.php
<?php

declare(strict_types=1);

call_user_func(static function () {
    \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addToAllTCAtypes(
        'fe_users',
        'tx_myextension_options, tx_myextension_special',
        '',
        'after:password',
    );
});
Copied!

If the fourth parameter (position) is omitted or the specified field is not found, new fields are added at the bottom of the form. If the table uses tabs, new fields are added at the bottom of the Extended tab. This tab is created automatically if it does not exist.

These method calls do not create the corresponding fields in the database. The new fields must also be defined in the ext_tables.sql file of the extension:

EXT:some_extension/ext_tables.sql
CREATE TABLE fe_users (
	tx_examples_options int(11) DEFAULT '0' NOT NULL,
	tx_examples_special varchar(255) DEFAULT '' NOT NULL
);
Copied!

The following screen shot shows the placement of the two new fields when editing a "fe_users" record:

The new fields added at the bottom of the "Extended" tab

The next example shows how to place a field more precisely.

Example 2: Extending the tt_content Table

In the second example, we will add a "No print" field to all content element types. First of all, we add its SQL definition in ext_tables.sql:

EXT:some_extension/ext_tables.sql
CREATE TABLE tt_content (
	tx_examples_noprint tinyint(4) DEFAULT '0' NOT NULL
);
Copied!

Then we add it to the $GLOBALS['TCA'] in Configuration/TCA/Overrides/tt_content.php:

EXT:some_extension/Configuration/TCA/Overrides/tt_content.php
  \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addTCAcolumns(
     'tt_content',
     [
        'tx_examples_noprint' => [
           'exclude' => 0,
           'label' => 'LLL:EXT:examples/Resources/Private/Language/locallang_db.xlf:tt_content.tx_examples_noprint',
           'config' => [
              'type' => 'check',
              'renderType' => 'checkboxToggle',
              'items' => [
                 [
                    0 => '',
                    1 => ''
                 ]
              ],
           ],
        ],
     ]
  );
\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addFieldsToPalette(
     'tt_content',
     'access',
     'tx_examples_noprint',
     'before:editlock'
  );
Copied!

The code is mostly the same as in the first example, but the last method call is different and requires an explanation. The tables pages and tt_content use palettes extensively. This increases flexibility.

Therefore we call ExtensionManagementUtility::addFieldsToPalette() instead of ExtensionManagementUtility::addToAllTCAtypes(). We need to specify the palette's key as the second argument (access). Precise placement of the new field is achieved with the fourth parameter (before:editlock). This will place the "no print" field right before the Restrict editing by non-Admins field, instead of putting it in the Extended tab.

The result is the following:

The new field added next to an existing one