Adjusting TCA

Note

The following examples assume general knowledge of the Table Configuration Array (TCA).

You need to store these changes in the sitepackage of your website in Configuration/TCA/Overrides/tt_content.php.

1. Adding fragment fields to additional content elements

The custom fields of EXT:content_slug are added to the TCA palette headers. This palette is used by most of the content elements in the TYPO3 core.

Some extensions might not use this palette, though. Instead, a reduced or custom palette is used to display the header field with some selected fields in the backend.

A good example is EXT:beautyofcode. This useful extension by developer Felix Nagel allows to render code examples with syntax highlighting and line numbers. It uses the reduced palette header (mind the missing s at the end).

Solution A: Replace the palette

One possible way to add the fragment-related fields is to replace the header palette for its CType:

$GLOBALS['TCA']['tt_content']['types']['beautyofcode_contentrenderer']['showitem'] = str_replace(
    '--palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.header;header,',
    '--palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.header;headers,',
    $GLOBALS['TCA']['tt_content']['types']['beautyofcode_contentrenderer']['showitem']
);

Solution B: Replace the showitem section

Note that EXT:beautyofcode also hides the palette appearanceLinks, which contains the field sectionIndex.

So in this case, we can overwrite the entire showitem section to change the header palette and insert the appearanceLinks palette as well:

 1$GLOBALS['TCA']['tt_content']['types']['beautyofcode_contentrenderer']['showitem'] = '
 2    --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xml:palette.general;general,
 3    --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.header;headers,
 4    --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.plugin,
 5        pi_flexform,
 6        bodytext;LLL:EXT:beautyofcode/Resources/Private/Language/locallang_db.xlf:code,
 7    --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.appearance,
 8        --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.frames;frames,
 9        --palette--;;appearanceLinks,
10    --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.access,
11        --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.visibility;visibility,
12        --palette--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:palette.access;access,
13    --div--;LLL:EXT:frontend/Resources/Private/Language/locallang_ttc.xlf:tabs.extended
14';

Solution C: Add the fragment fields to another palette

Some custom content element might use a completely new palette to render the header field with some extras. In this case, you can use the TYPO3 API to add the fields to this palette.

You need to adjust the name of the custom palette (line 3) and set the position to before or after an existing field in this palette (line 5).

1\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addFieldsToPalette(
2    'tt_content', // Table for TYPO3 content elements
3    'custom_palette', // The palette which should contain the fragment fields
4    '--linebreak--, tx_content_slug_fragment, tx_content_slug_link', // The fields, rendered in a new line
5    'after:some_field' // Position of the fragment fields
6);

Warning

While you could add the fragment fields to the existing header palette, be aware of the consequences: this would also add them to CTypes like shortcut and html, which won't render the header in the frontend (by default).

2. Removing the uniqueInPid evaluation

What does the uniqueInPid evaluation even do?

It's a mechanism that prevents duplicate field values on the same page. This is very helpful for our URL fragments, as they need to be unique on each page (otherwise the browser can't distinguish the anchor links).

Why would I even consider to remove it then!?

Imagine a website with translated content on the same page. The uniqueInPid evaluation doesn't distinguish between languages. That means you can't have identical anchor links in e.g. English and German.

In practice this seldom is an issue. But it might become one if you want to use technical terms or brand names as anchors (e.g. https://www.example.org/info/#typo3).

How to remove it from the list of eval functions

Caution

I strongly advise to only remove this evaluation on websites with few and well-trained editors that fully understand the consequences.

The following code removes uniqueInPid from the list of eval functions. You mustn't remove the other two evaluations!

// Original:
$GLOBALS['TCA']['tt_content']['columns']['tx_content_slug_fragment']['config']['eval'] = 'trim,Sebkln\\ContentSlug\\Evaluation\\FragmentEvaluation,uniqueInPid';

// Remove the evaluation for all content elements:
$GLOBALS['TCA']['tt_content']['columns']['tx_content_slug_fragment']['config']['eval'] = 'trim,Sebkln\\ContentSlug\\Evaluation\\FragmentEvaluation';

// Or, maybe better: only remove it for selected content elements:
$GLOBALS['TCA']['tt_content']['types']['beautyofcode_contentrenderer']['columnsOverrides']['tx_content_slug_fragment']['config']['eval'] = 'trim,Sebkln\\ContentSlug\\Evaluation\\FragmentEvaluation';
$GLOBALS['TCA']['tt_content']['types']['textpic']['columnsOverrides']['tx_content_slug_fragment']['config']['eval'] = 'trim,Sebkln\\ContentSlug\\Evaluation\\FragmentEvaluation';