---
title: "ext_tables.php"
manual: "TYPO3 Explained"
version: "12.4"
permalink: "https://docs.typo3.org/permalink/t3coreapi:ext-tables-php@12.4"
source: "ExtensionArchitecture/FileStructure/ExtTables.rst"
rendered: "2026-10-21T15:29:37+00:00"
---

> [!WARNING]
> **Attention**
>
> TYPO3 v12 has reached end-of-life as of April 30th 2026 and
> is no longer being maintained. Use the version switcher on the top
> left of this page to select documentation for a supported version of TYPO3.
>
> Need more time before upgrading?
> You can purchase Extended Long Term Support (ELTS) for TYPO3 v12 here:
> [TYPO3 ELTS](https://typo3.com/services/extended-support-elts).

# `ext_tables.php` {#ext-tables-php}

-   **ext_tables.php**

    -   *Scope:* extension
    -   *Path (Composer):* packages/my_extension/ext_tables.php
    -   *Path (Classic):* typo3conf/ext/my_extension/ext_tables.php

    [`ext_tables.php`](#file-extension-ext-tables-php) is *not* always included in the global scope of the
    frontend context.

    This file is only included when

    -   a TYPO3 Backend or CLI request is happening
    -   or the TYPO3 Frontend is called and a valid backend user is authenticated

    This file usually gets included later within the request and after TCA
    information is loaded, and a backend user is authenticated.

    > [!TIP]
    > **Hint**
    >
    > In many cases, the file [`ext_tables.php`](#file-extension-ext-tables-php) is no longer needed,
    > since `TCA` definitions must be placed in files located at
    > [Configuration/TCA/](https://docs.typo3.org/permalink/t3coreapi:extension-configuration-tca@12.4).

## ext_tables.php must not be used for {#ext-tables-php-not-use}

The [`ext_tables.php`](#file-extension-ext-tables-php) **must not be used** for the following settings:

-   TCA configurations for new tables.
    They should go in [Configuration/TCA/sometable.php](https://docs.typo3.org/permalink/t3coreapi:extension-configuration-tca@12.4).
-   TCA overrides of existing tables. They should go in
    [Configuration/TCA/Overrides/somefile.php](https://docs.typo3.org/permalink/t3coreapi:extension-configuration-tca-overrides@12.4).
-   calling `ExtensionManagementUtility::addToInsertRecords()`
    as this might break the frontend. They should go in
    [Configuration/TCA/Overrides/somefile.php](https://docs.typo3.org/permalink/t3coreapi:extension-configuration-tca-overrides@12.4).
-   calling `ExtensionManagementUtility::addStaticFile()`
    as this might break the frontend. They should go in
    [`Configuration/TCA/Overrides/sys_template.php`](Configuration/TCA/Index.md#file-extension-configuration-tca-tablename-php)
-   <!-- TODO: no Markdown rendering for "versionchanged" -->

    Adding table options via ExtensionManagementUtility::allowTableOnStandardPages()
    Example

You can use the [Check TCA in ext_tables.php](https://docs.typo3.org/permalink/t3coreapi:admin-tools-upgrade-tca-ext-tables@12.4) tool to find extensions
with [`ext_tables.php`](#file-extension-ext-tables-php) files that change the TCA.

## ext_tables.php should be used for {#ext-tables-php-usage}

These are typical functions that should be in [`ext_tables.php`](#file-extension-ext-tables-php):

-   Registering scheduler tasks:
    [Registering a scheduler task](https://docs.typo3.org/permalink/t3coreapi:extension-configuration-files-scheduler@12.4)
-   Registration of [custom page types](https://docs.typo3.org/permalink/t3coreapi:page-types-example@12.4)
-   Extending [Backend user settings](https://docs.typo3.org/permalink/t3coreapi:user-settings-extending@12.4)

Before you use a utility method in [`ext_tables.php`](#file-extension-ext-tables-php), refer to the method's
PHP doc comment. Unless it explicitly states that you can use the method in context
of [`ext_tables.php`](#file-extension-ext-tables-php) they should not be used here.

## Examples {#ext-tables-php-examples}

Put the following in a file called [`ext_tables.php`](#file-extension-ext-tables-php) in the main directory
of your extension. The file does not need to be registered but will be loaded
automatically:

**EXT:site_package/ext_tables.php**

```php
<?php

declare(strict_types=1);

use MyVendor\MyExtension\Backend\MyClass;

defined('TYPO3') or die();

// Add your code here
MyClass::doSomething();

```

Read [why the check for the TYPO3 constant is necessary](https://docs.typo3.org/permalink/t3coreapi:globals-constants-typo3@12.4).

### Registering a scheduler task {#extension-configuration-files-scheduler}

Scheduler tasks get registered in [`ext_tables.php`](#file-extension-ext-tables-php) as well. Note that the system extension "scheduler" has
to be installed for this to work.

**EXT:site_package/ext_tables.php**

```php
<?php

declare(strict_types=1);

use TYPO3\CMS\Scheduler\Task\CachingFrameworkGarbageCollectionAdditionalFieldProvider;
use TYPO3\CMS\Scheduler\Task\CachingFrameworkGarbageCollectionTask;

defined('TYPO3') or die();

$lll = 'LLL:EXT:my_extension/Resources/Private/Language/locallang.xlf:';

// Add caching framework garbage collection task
$GLOBALS['TYPO3_CONF_VARS']['SC_OPTIONS']['scheduler']['tasks']
        [CachingFrameworkGarbageCollectionTask::class] = [
            'extension' => 'my_extension',
            'title' => $lll . 'cachingFrameworkGarbageCollection.name',
            'description' => $lll . 'cachingFrameworkGarbageCollection.description',
            'additionalFields' =>
                CachingFrameworkGarbageCollectionAdditionalFieldProvider::class,
        ];

```

### Registering a backend module {#extension-configuration-files-backend-module}

<!-- TODO: no Markdown rendering for "versionchanged" -->

The usage of ExtensionManagementUtility::registerModule() is
deprecated. In TYPO3 v12 it is not evaluated anymore. Register modules in
Extension folder Configuration/Backend.

If your extension needs to provide compatibility with TYPO3 v11 as well as v12
you can check which version is loaded in the [`ext_tables.php`](#file-extension-ext-tables-php) and call
`ExtensionUtility::registerModule` for v11 to register an Extbase backend
module:

**EXT:my_extension/ext_tables.php**

```php
// use TYPO3\CMS\Extbase\Utility\ExtensionUtility;

ExtensionUtility::registerModule(
   'ExtensionName', // Extension Name in CamelCase
   'web', // the main module
   'mysubmodulekey', // Submodule key
   'bottom', // Position
   [
       'MyController' => 'list,show,new',
   ],
   [
       'access' => 'user,group',
       'icon'   => 'EXT:my_extension/ext_icon.svg',
       'labels' => 'LLL:EXT:my_extension/Resources/Private/Language/locallang_statistics.xlf',
   ]
);
```

### Allowing a tables records to be added to Standard pages {#extension-configuration-files-allow-table-standard}

<!-- TODO: no Markdown rendering for "versionchanged" -->

The usage of ExtensionManagementUtility::allowTableOnStandardPages() is
deprecated. The method will be removed in TYPO3 v13.0. Use TCA ctrl option
ignorePageTypeRestriction
instead.

If your extension needs to provide compatibility with TYPO3 v11 as well as v12
you can check which version is loaded in the [`ext_tables.php`](#file-extension-ext-tables-php) and call
`allowTableOnStandardPages` for v11:

**EXT:site_package/ext_tables.php**

```php
<?php

declare(strict_types=1);

use TYPO3\CMS\Core\Information\Typo3Version;
use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
use TYPO3\CMS\Core\Utility\GeneralUtility;

defined('TYPO3') or die();

$versionInformation = GeneralUtility::makeInstance(Typo3Version::class);

if ($versionInformation->getMajorVersion() < 12) {
    ExtensionManagementUtility::allowTableOnStandardPages(
        'tx_myextension_domain_model_mymodel',
    );
}

```

> [!NOTE]
> Use [ignorePageTypeRestriction](https://docs.typo3.org/m/typo3/reference-tca/12.4/en-us/Ctrl/Index.html#ctrl-security-ignorePageTypeRestriction)
> to achieve the same functionality for TYPO3 v12.
