Hallo ExtBaseler,
in einem Minishop habe ich ein Backend-Module, in der es eine Liste der Bestellungen gibt, eine Detailansicht und in der Detailansicht die Möglichkeit eine Status-Email an den Kunden zu senden (Bestellbestätigung, ...). Die Status-Email-Geschichte ist sozusagen eine Sub-Action der Detail-Action.
Die Emails werden erstmal per Fluid gerendert und dem Redakteur im Backend in einem Formular zum Ändern präsentiert. Nach dem Klick auf "senden" wird t3lib_mail_message angeschmissen und die E-Mail gesendet.
So, nun das Problem, welches ich nicht lösen kann...:
Für das Backend brauche ich Templates und Layouts, die nicht im normalen Pfad (typo3conf/ext/my_ext/Resources/...) zu finden sind. Die E-Mail-Texte müssen z. B. an die momentane Installation angepasst sein.
Dazu ändere ich die Pfade in "view":
plugin.tx_myext {
view {
templateRootPath = fileadmin/plugins/my_ext/Templates/
partialRootPath = fileadmin/plugins/my_ext/Partials/
layoutRootPath = fileadmin/plugins/my_ext/Layouts/
}
}
module.tx_myext_m1 {
view < plugin.tx_myext.view
}
Die Module-Konfiguration hole ich mir dann in der initializeAction im Backend-Controller:
protected function initializeAction() {
$this->orderRepository = t3lib_div::makeInstance('Tx_MyExt_Domain_Repository_OrderRepository');
// get Module-Configuration (p.e. for subaction "newMail" )
// TODO: Is there a better way than fetching the whole configuration?
$BeConfManager = new Tx_Extbase_Configuration_BackendConfigurationManager;
$tmpConf = $BeConfManager->getTypoScriptSetup();
$tmpConf =& Tx_Extbase_Utility_TypoScript::convertTypoScriptArrayToPlainArray($tmpConf);
$this->moduleConfiguration = $tmpConf['module']['tx_myext_m1'];
}
Wenn ich diese Pfade nun in den Backend-Controller-Actions setze, werden diese auch benutzt (das habe ich getestet, indem ich ein "neues" Partial im Backend-Module-Fluid-Template ausgebe):
$this->view->setTemplateRootPath(t3lib_div::getFileAbsFileName($this->moduleConfiguration['view']['templateRootPath']));
$this->view->setLayoutRootPath(t3lib_div::getFileAbsFileName($this->moduleConfiguration['view']['layoutRootPath']));
$this->view->setPartialRootPath(t3lib_div::getFileAbsFileName($this->moduleConfiguration['view']['partialRootPath']));
$this->view->assign('orders', $orders);
Für die E-Mails brauche ich einen eigenen Fluid-Renderer. Hier wird aber nur die "neue" Template-Datei benutzt und nicht die Layouts aus dem neuen Pfad - das ist der Knackpunkt:
protected function getFluidRenderer($file) {
// create another instance of Fluid
$renderer = t3lib_div::makeInstance('Tx_Fluid_View_TemplateView');
// set the controller context
$controllerContext = $this->buildControllerContext();
$controllerContext->setRequest($this->request);
$renderer->setControllerContext($controllerContext);
// set the template
$this->view->setTemplateRootPath(t3lib_div::getFileAbsFileName($this->moduleConfiguration['view']['templateRootPath']));
$this->view->setLayoutRootPath(t3lib_div::getFileAbsFileName($this->moduleConfiguration['view']['layoutRootPath']));
$this->view->setPartialRootPath(t3lib_div::getFileAbsFileName($this->moduleConfiguration['view']['partialRootPath']));
$renderer->setTemplatePathAndFilename(t3lib_div::getFileAbsFileName($this->moduleConfiguration['view']['templateRootPath']) . $file);
// and return the new Fluid instance
return $renderer;
}
Beim Mail-Versenden ist der Aufruf ist wie folgt:
/*
In $args['html'] steht der HTML-Inhalt aus dem Formular im Backend.
Dieser soll als HTML-Part in der E-Mail versendet werden.
Es ist aber nur der <body> ohne <html> und <head>.
Deswegen will ich das mit einem "Layout" wrappen.
*/
$args = $this->request->getArguments();
// wrap the html-mail with header and body
$renderer = $this->getFluidRenderer('Email/stateHtmlWrap.html');
$renderer->assign('body', $args['html']);
$bodyHtml = $renderer->render();
Es wird die "neue" "Email/stateHtmlWrap.html"-Datei verwendet:
<f:layout name="Email" />
{namespace tx = Tx_MyExt_ViewHelpers}
<f:section name="main">
<tx:raw value="{body}" />
</f:section>
Diese soll das "neue" layout "Email" benutzen - benutzt aber das "alte" aus "typo3conf/ext/my_ext/Resources...". Und da liegt der Hund begraben.
Hat wer eine Idee was ich falsch mache? Warum werden die Pfad-Definitionen in der eigenen Fluid-Renderer-Methode ignoriert? Bei den Actions ist das doch ähnlich.
... und sorry, dass ich so ausschweifend das Problem schildere - irgendwie kann ich es nicht kurz fassen 😉
Vielen Dank für Antworten.
LG sun