Rendern eines View ohne zugehörige Action, z.B. für ein E-Mail-Template:
$configuration = $this->configurationManager->getConfiguration(\TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface::CONFIGURATION_TYPE_FRAMEWORK); $view = $this->objectManager->get(\TYPO3\CMS\Fluid\View\StandaloneView::class); $view->getRequest()->setControllerExtensionName($this->extensionName); $view->setFormat('txt'); $view->setLayoutRootPaths($configuration['view']['layoutRootPaths']); $view->setPartialRootPaths($configuration['view']['partialRootPaths']); $view->setTemplateRootPaths($configuration['view']['templateRootPaths']); $view->setTemplate('Mail/MyTemplate'); $view->assign('myParam', $myParam); $result = $view->render(); |
Die Funktion setControllerExtensionName() ist dafür zuständig, dass die Sprachen aus der locallang.xml ausgelesen werden können.
Funktioniert auch im TYPO3 BE, dann muss man aber module.tx_myext.view.templateRootPaths (und die anderen Pfade) über ext_typoscript_setup.txt (damit es auf der obersten Ebene verfügbar ist) setzen.
TODO: Seit TYPO3 v12 hat das StandaloneView kein $request Object mehr: https://docs.typo3.org/c/typo3/cms-core/main/en-us/Changelog/12.0/Breaking-98377-FluidStandaloneViewDoesNotCreateAnExtbaseRequestAnymore.html
Dieses wird aber benötigt, um z.B. die „locale“ zu haben, so dass z.B. das Datum in der richtigen Sprache angezeigt wird (TODO: und auch um Texte in die richtige Sprache zu übersetzen?).
Lösung:
private static function getRequest(): ServerRequestInterface { return $GLOBALS['TYPO3_REQUEST']; } $view = GeneralUtility::makeInstance(StandaloneView::class); $view->setRequest(self::getRequest()); |
Alternative, bei nur einem Template, das ggf. in fileadmin liegt:
$templateRootPath = \TYPO3\CMS\Core\Utility\GeneralUtility::getFileAbsFileName($configuration['view']['templateRootPath']); $view->setTemplatePathAndFilename($templateRootPath . 'Mail/MyTemplate.txt'); |
Dieser Code ersetzt die Zeilen 5 bis 8 im ersten Snippet.
hier das ganze mit namespaces:
$standaloneView = $this->objectManager->get('TYPO3\\CMS\\Fluid\\View\\StandaloneView');
$extbaseFrameworkConfiguration = $this->configurationManager->getConfiguration(\TYPO3\CMS\Extbase\Configuration\ConfigurationManagerInterface::CONFIGURATION_TYPE_FRAMEWORK);
$templateRootPath = \TYPO3\CMS\Core\Utility\GeneralUtility::getFileAbsFileName($extbaseFrameworkConfiguration['view']['templateRootPath']);
$templatePathAndFilename = $templateRootPath . 'StandAloneViews/StandAloneView.html';
$extensionName = $this->request->getControllerExtensionName();
$standaloneView->getRequest()->setControllerExtensionName($extensionName);
$standaloneView->setTemplatePathAndFilename($templatePathAndFilename);
$standaloneView->assignMultiple(array(
'foo' => 'bar',
'foo2' => 'bar2'
));
$result = $standaloneView->render();
Danke, mittlerweile habe ich den ganzen Code im Blog auf Namespaces umgestellt.