.. include:: /Includes.rst.txt .. _backend-modules-template: ========================= 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 :php:`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 :php:`\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 :php:`TYPO3\CMS\Backend\View\BackendTemplateView` class by changing the value of the :php:`$defaultViewObjectName` member variable in the controller. Here is an example taken from system extension "beuser": .. code-block:: php /** * 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 :php:`initializeView()` method to build the general elements of your backend module. Again looking at the "beuser" extension: .. code-block:: php /** * 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 :php:`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"): .. code-block:: html 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: .. code-block:: html {namespace be = TYPO3\CMS\Backend\ViewHelpers} {namespace bu = TYPO3\CMS\Beuser\ViewHelpers} {namespace core = TYPO3\CMS\Core\ViewHelpers}

... 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.