Breaking: #98281 - Make AbstractPlugin @internal

See forge#98281

Description

Extending the class \TYPO3\CMS\Frontend\Plugin\AbstractPlugin is not a recommended way of developing Frontend plugins anymore. This class is not maintained anymore and may be removed in future versions without further notice.

The TypoScript property plugin.tx_myextension_pi1._DEFAULT_PI_VARS has only been used in the class AbstractPlugin. It is therefore not public API anymore.

Impact

Plugins based on \TYPO3\CMS\Frontend\Plugin\AbstractPlugin will continue to function. However, there will be warnings about using internal code displayed in most IDEs.

_DEFAULT_PI_VARS has been removed from syntax highlighting as it is not public API anymore.

Affected installations

All extensions having classes that extend \TYPO3\CMS\Frontend\Plugin\AbstractPlugin are affected.

Migration

Remove the dependency of \TYPO3\CMS\Frontend\Plugin\AbstractPlugin. If functionality of this class is still used, copy it into your plugin.

Example

Class before migration:

EXT:gh_randomcontent/Classes/Plugin/RandomContent.php
class RandomContent extends AbstractPlugin
{
    public function main(string $content, array $conf): string
    {
        $this->conf = $conf;

        // Init FlexForm configuration for plugin
        $this->pi_initPIflexForm();
        if ($this->pi_getFFvalue(
            $this->cObj->data['pi_flexform'],
            'which_pages', 'sDEF')
        ) {
            $this->conf['pages'] = $this->pi_getFFvalue(
                $this->cObj->data['pi_flexform'],
                'which_pages', 'sDEF'
            );
        }
        // ...
    }
}
Copied!

Class after migration:

EXT:gh_randomcontent/Classes/Plugin/RandomContent.php
class RandomContent
{
    /**
     * The back-reference to the mother cObj object set at call time
     */
    public $cObj;

    /**
     * This setter is called when the plugin is called from UserContentObject (USER)
     * via ContentObjectRenderer->callUserFunction().
     *
     * @param ContentObjectRenderer $cObj
     */
    public function setContentObjectRenderer(ContentObjectRenderer $cObj): void
    {
        $this->cObj = $cObj;
    }

    public function main(string $content, array $conf): string
    {
        $this->conf = $conf;

        $this->pi_initPIflexForm(); // Init FlexForm configuration for plugin
        if ($this->pi_getFFvalue($this->cObj->data['pi_flexform'],
            'which_pages', 'sDEF')) {
            $this->conf['pages'] = $this->pi_getFFvalue(
                $this->cObj->data['pi_flexform'],
                'which_pages',
                'sDEF'
            );
        }
        // ...
    }

    /**
     * Converts $this->cObj->data['pi_flexform'] from XML string to FlexForm array.
     *
     * @param string $field Field name to convert
     */
    public function pi_initPIflexForm($field = 'pi_flexform')
    {
        // ...
    }

    public function pi_getFFvalue(
        $T3FlexForm_array,
        $fieldName,
        $sheet = 'sDEF',
        $lang = 'lDEF',
        $value = 'vDEF'
    ) {
        // ...
    }
}
Copied!

It is also possible to migrate to an Extbase plugin using a controller. See the Extbase documentation, chapter "Frontend Plugins".