Zum Inhalt springen

ViewHelper wird gecached und somit funktionsunfähig

Erstellt am 22. August 2014 · 2 Antworten · letzte Antwort am 23. August 2014

Tags: Extbase, ViewHelper, Frage

philippjay ·

Hallo allesamt!

Heute habe ich mich ein wenig mit der Aufgabe beschäftigt das FE-Login Formular in einer Modal-Box unterzubringen. Das heißt aber, dass nach einem Fehler oder bei der Passwort-Vergessen Funktion die Modal-Box automatisch wieder aufgerufen werden muss.

Hierfür habe ich mir fix einen ViewHelper zusammengebastelt, der mir austüftelt ob die Modal-Box angezeigt werden soll oder nicht.

class ShowLoginModalViewHelper extends \TYPO3\CMS\Fluid\Core\ViewHelper\AbstractConditionViewHelper {

	/**
	 * @return string
	 */
	public function render() {
		$id = \TYPO3\CMS\Core\Utility\GeneralUtility::_GP( 'id' );
		$felogin = \TYPO3\CMS\Core\Utility\GeneralUtility::_GP( 'tx_felogin_pi1' );
		$logintype = \TYPO3\CMS\Core\Utility\GeneralUtility::_GP( 'logintype' );

		if ( ( !empty( $felogin ) && $felogin['forgot'] == 1 ) || ( $id == 1 && !empty( $logintype ) && $logintype == 'login' ) )
			return $this->renderThenChild();
		else
			return $this->renderElseChild();
	}
}

Wenn die Bedingungen zutreffen und $this->renderThenChild() ausgeführt wird, wird ein Javascript Snippet eingefügt, das nach Laden der Seite die Modal-Box öffnet.

<!-- Login Form Modal -->
<sf:showLoginModal>
<f:then>
	<!-- Modal Auto Open -->
	<script>
		$(window).load(function(){
			$('#login').modal('show');
		});
	</script>
</f:then>
<f:else>
	<!-- Modal Closed -->
</f:else>
</sf:showLoginModal>
<div class="modal fade" id="login" tabindex="-1" role="dialog" aria-labelledby="Login Form">
	<div class="modal-dialog">
		<div class="modal-content">
			<div class="modal-header">
				<button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>
			</div>
			<v:content.render contentUids="{0: settings.uid.loginform}" />
		</div>
		<!-- /.modal-content -->
	</div>
	<!-- /.modal-dialog -->
</div>
<!-- /.modal -->

Funktioniert auch alles wunderbar solange der Cache auf der Seite deaktiviert ist.

Sobald ich den Haken für's Deaktivieren des Caches entferne und alles ausprobiere, funktioniert die Evaluierung nicht mehr und die Modal-Box öffnet sich nicht mehr automatisch.

Hat jemand eine Idee wie man entweder das Problem mit dem Cache löst?
Oder gibt es gar noch einen besseren Weg das FE-Login Formular in einer Modal-Box zu handeln?

TYPO3: 6.2.4

Vielen Dank und schönes Wochenende!

Grüße,
Philipp

jenses ·

Du kannst hier mal einige Lösungsvorschläge nachlesen:
http://forum.typo3.org/index.php/t/191504/

Alternativ könntest du auf deine f:then-Geschichte komplett verzichten
und ein Javascript IMMER einbinden.
Das Öffnen/Nicht-Öffnen der Modalbox machst du abhängig von einer Variablen,
die du per AJAX-Call von Seite ID=123XXX holst (eId oder besser und einfacher pagetype).
Auf der ungecachten Seite 123XXX baust du ein kleines User-Script/Mini-Extension ein,
die den Login-Status abfragt und einen entsprechenden Wert ausgibt.

philippjay ·

Hallo jenses,

danke für deine Antwort!

Einmal kurz zum Verständnis:
Wenn ich das richtig verstehe kann ich ein USER_INT oder ein COA_INT Objekt verwenden, was aber zumindest im Falle von USER_INT das komplette Provider Plugin aus dem Cache nehmen würde?
Via COA_INT könnte man einen Teil ungecached einbinden, wäre aber umständlich umzusetzen.

Mir gefällt deine Idee mit dem AJAX Call! Ich werd das so einmal versuchen.

Vielen Dank!