Attention
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.
The Backend Template View¶
Warning
Templating in the backend has been redesigned since a couple of major releases ago. This chapter describes the current new way of doing things. It may yet change. Please refer to older versions of this manual if you need a reference to the old way of programming backend modules.
Modern backend modules are written using the Extbase/Fluid combination.
Thus, templates are Fluid-based. On top of that the "backend" system extension
provides a general view class TYPO3\CMS\Backend\View\BackendTemplateView
which provides common features for all backend modules, like the management
of the action menu or the registration of docheader buttons.
This view class gives access to the \TYPO3\CMS\Backend\Template\ModuleTemplate
class which is - more or less - the old backend module template,
cleaned up and refreshed. This class performs a number of basic
operations for backend modules, like loading base JS libraries,
loading stylesheets, managing a flash message queue and - in general -
performing all kind of necessary setups.
To access these resources, the trick is to force your backend
module controller to use the TYPO3\CMS\Backend\View\BackendTemplateView
class by changing the value of the $defaultViewObjectName
member
variable in the controller. Here is an example taken from system extension "beuser":
/**
* Backend module user/group action controller
*/
class BackendUserActionController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionController
{
/**
* Backend Template Container
*
* @var string
*/
protected $defaultViewObjectName = \TYPO3\CMS\Backend\View\BackendTemplateView::class;
// ...
}
After that, you can use the initializeView()
method to
build the general elements of your backend module. Again looking
at the "beuser" extension:
/**
* Set up the doc header properly here
*
* @param ViewInterface $view
* @return void
*/
protected function initializeView(ViewInterface $view)
{
/** @var BackendTemplateView $view */
parent::initializeView($view);
if ($this->actionMethodName == 'indexAction'
|| $this->actionMethodName == 'onlineAction'
|| $this->actionMethodName == 'compareAction') {
$this->generateMenu();
$this->registerDocheaderButtons();
$view->getModuleTemplate()->setFlashMessageQueue($this->controllerContext->getFlashMessageQueue());
}
if ($view instanceof BackendTemplateView) {
$view->getModuleTemplate()->getPageRenderer()->loadRequireJsModule('TYPO3/CMS/Backend/Modal');
}
}
The main actions performed here are the generation of the action menu, the generation of buttons for the Docheader, the initialization of the Flash message queue and the registration of a JS library to be loaded using RequireJS.
Using this BackendTemplateView
class, the Fluid templates for
your module need only take care of the actual content of your module.
As such, the Layout may be as simple as (again from "beuser"):
<f:render section="headline" />
<f:render section="content" />
and the actual Template needs to render the title and the content only. For example, here is an extract of the "Index" action template of the "beuser" extension:
{namespace be = TYPO3\CMS\Backend\ViewHelpers}
{namespace bu = TYPO3\CMS\Beuser\ViewHelpers}
{namespace core = TYPO3\CMS\Core\ViewHelpers}
<f:layout name="Default" />
<f:section name="headline">
<h1><f:translate key="backendUserListing" /></h1>
</f:section>
<f:section name="content">
...
</f:section>
The best resources for learning is to look at existing modules from TYPO3 CMS. With the information given here, you should be able to find your way around the code.