TYPO3 v10 has reached end-of-life as of April 30th 2023 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 v10 here: TYPO3 ELTS.


This class is used as base class for frontend plugins.

Most legacy frontend plugins are extension classes of this one.

This class contains functions which assists these plugins in creating lists, searching, displaying menus, page-browsing (next/previous/1/2/3) and handling links.

Functions are all prefixed pi_ which is reserved for this class. Those functions can be overridden in the extension classes. Therefore plugins based on the AbstractPlugin are also called "pi-based plugins".

The AbstractPlugin still contains hard-coded HTMl in many functions. These can not be used for non-HTML output like JSON or XML feeds.

Changed in version 6.0: The AbstractPlugin class used to be named tslib_pibase before TYPO3 6.0. Therefore the old names "pi_base" or "pi-based plugin" are still used by some people for historic reasons. "pi" is short for plug-in.


There is no predefined entry method, the method to be used as entry-point is defined via TypoScript:

plugin.tx_srfeuserregister_pi1 = USER_INT
plugin.tx_srfeuserregister_pi1 {
   userFunc = SJBR\SrFeuserRegister\Controller\RegisterPluginController->main
   // set some options

      // set some default values

You can use the TypoScript content objects USER for cached plugins or USER_INT when caching should be disabled.

The following keys are reserved when creating pi-based plugins:


Used to define default values that override values not set in the main TypoScript plugin definition.


Used to override translated strings.

AbstractPlugin implementation

An implementing class could look like this:

namespace SJBR\SrFeuserRegister\Controller;

use TYPO3\CMS\Frontend\ContentObject\ContentObjectRenderer;
use TYPO3\CMS\Frontend\Controller\TypoScriptFrontendController;
use TYPO3\CMS\Frontend\Plugin\AbstractPlugin;
// ...

class RegisterPluginController extends AbstractPlugin
    * Content object
    * @var ContentObjectRenderer
   public $cObj;

    * Extension key
    * @var string
   public $extKey = 'sr_feuser_register';

   // ...

    * Plugin entry script
    * @param string $content: rendered content (not used)
    * @param array $conf: the plugin TS configuration
    * @return string the rendered content
   public function main($content, $conf)
      $extensionName = GeneralUtility::underscoredToUpperCamelCase($this->extKey);
      $this->conf =& $conf;

      // do something

      return CssUtility::wrapInBaseClass($this->prefixId, $content);

See extension sr_feuser_register for a complete example.

TCA configuration

use TYPO3\CMS\Core\Utility\ExtensionManagementUtility;
defined('TYPO3_MODE') or die();

$GLOBALS['TCA']['tt_content']['types']['list']['subtypes_excludelist']['sr_feuser_register_pi1'] = 'layout,select_key';
$GLOBALS['TCA']['tt_content']['types']['list']['subtypes_addlist']['sr_feuser_register_pi1'] = 'pi_flexform';
ExtensionManagementUtility::addPiFlexFormValue('sr_feuser_register_pi1', 'FILE:EXT:sr_feuser_register/Configuration/FlexForms/flexform_ds_pi1.xml');
ExtensionManagementUtility::addPlugin(array('LLL:EXT:sr_feuser_register/Resources/Private/Language/locallang_db.xlf:tt_content.list_type', 'sr_feuser_register_pi1'), 'list_type', 'sr_feuser_register');