Zum Inhalt springen

Backend-Module Eigener Fluid Renderer und Templates/Partials/Layouts

Erstellt am 22. März 2011 · 1 Antwort · letzte Antwort am 22. März 2011

Tags: Frage

sunixzs ·

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

sunixzs ·

Ich bin so blöd 😉

In der Fluid-Renderer-Methode hatte ich Code aus der Action kopiert.

Richtig müsste es so aussehen:

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
	$renderer->setTemplateRootPath(t3lib_div::getFileAbsFileName($this->moduleConfiguration['view']['templateRootPath']));
	$renderer->setLayoutRootPath(t3lib_div::getFileAbsFileName($this->moduleConfiguration['view']['layoutRootPath']));
	$renderer->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;
}