Ajax Loginbox
Armin Bartsch, Dienstag, 10. März 2009
Login ohne Reload einer Seite
Der Gedanke der Ajax-Loginbox ist, einen Login ohne einen reload einer Seite zu ermöglichen und Usern ihren Login-Status unter der Nutzung der Extension Static File Cache (nc_staticfilecache) mitzuteilen.
Der Login-Status wird nach dem vollständigen Laden der Seite ermittelt, indem eine Abfrage gesendet wird, die von TYPO3 bearbeitet und ein Ergebnis zurückgesendet wird.
Mit wenigen Schritten ist eine Ajax-Loginbox zu realisieren. Bitte lesen Sie erst die ganze Beschreibung durch, bevor Sie Änderungen an Ihrer Arbeitsumgebung vornehmen!
Ich gehe davon aus, dass die Extensionen New front end login box (newloginbox) MD5 FE Password (kb_md5fepw) installiert sind und die Funktionalität gegeben ist. Zusätzlich kann die Extension Static File Cache (nc_staticfilecache) installiert sein.
Template der Hauptvorlage
In den Quelltext des Template/Quelltext muss ein Bereich angelegt werden, in den die Rückgabe des Ajax eingefügt werden soll.
<div id="log_res"><p> Der Login-Status kann nur bei aktiviertem JavaScript ermittelt werden. <p></div><div id="log_res"><p> Der Login-Status kann nur bei aktiviertem JavaScript ermittelt werden.
<p></div>
Inhalte in dem Bereich id="log_res" werden nach den Funktionsaufrufen gelöscht! Ich empfehle einen Hinweis in diesem Bereich, dass das JavaScript aktiviert sein muss, um den Login-Status abfragen zu können!
JavaScript – Ajax - mootools
Zum Einsatz kommt hier das Framework mootools. Eingebunden wird die Funktion superchallenge_pass(), die für die Ext. kb_md5fepw benötigt wird.
mootools
mootools ist ein freies JavaScript-Framework, das eine Vielzahl von Klassen beinhaltet, die je nach Bedarf zusammengestellt werden können. Weite Information finden Sie unter http://mootools.net/ .
Unter http://mootools.net/download stehen die jeweils aktuellen Klassen als Download zur Verfügung. Für die Ajax-Loginbox müssen Window: Window.DomReady und Remote: Ajax aktiviert werden. Die restlichen benötigten Klassen werden dann automatisch eingebunden.
Das Einbinden der mootools.js unter TYPO3 erfolgt per TypoScript.
seite.includeJS.file1 = fileadmin/js/mootools.jsseite.includeJS.file1 = fileadmin/js/mootools.js
Zusatz JavaScript
Das folgende JavaScript muss noch in den Quelltext eingebunden werden, damit eine Anforderung gesendet und das Ergebnis in den Quelltext geschrieben werden kann.
// Variablen Anpassungen
var txt_benuterstatus = '<p>Benutzerstatus wird abgerufen</p>';
var div_in_form = 'log_res';
var id_form = 'myForm';
var login_url = 'http://typo3.intervation.de/index.php?id=353&type=109';
var class_login = 'ajax-loading';
/*
+++++++++++++++++++++++++++++++++
Ab hier keine Anpassungen mehr nötig
+++++++++++++++++++++++++++++++++
*/
// Funktion Notwendig wegen kb_md5fepw
// Function wurde einfach kopiert
function superchallenge_pass(form) {
var pass = form.pass.value;
if (pass) {
form.pass.value = MD5(form.user.value + ":" + MD5(pass) + ":" + form.challenge.value);
}
}
window.addEvent('domready', function(){
aktive();
});
window.onload = function() {
ak();
}
// Nachladen der Loginbox wenn ganze Seite geladen wurde
function ak() {
$(div_in_form).setHTML(txt_benuterstatus);
var log = $(div_in_form).addClass(class_login);
new Ajax(login_url, {
method: "get",
update: $(div_in_form),
onComplete: function() {
log.removeClass(class_login);
aktive();
}
}).request();
}
function aktive() {
if($(id_form)) {
$(id_form).addEvent('submit', function(e) {
new Event(e).stop();
var log = $(div_in_form).addClass(class_login);
$(id_form).setProperties({'action': login_url });
// Kann auskommentriert werden, wenn kein
// onSubmit="superchallenge_pass(this); return true;" im Quelltext
// wird normalerweise eingebunden durch onSubmit="###ON_SUBMIT###"
// in der newloginbox-Vorlage
/*
if(document.getElementsByName("logintype")[0].value == 'login') {
superchallenge_pass($(id_form));
}
*/
this.send({
update: log,
onComplete: function() {
log.removeClass(class_login);
aktive();
}
});
});
}
};// Variablen Anpassungen
var txt_benuterstatus = '<p>Benutzerstatus wird abgerufen</p>';
var div_in_form = 'log_res';
var id_form = 'myForm';
var login_url = 'http://typo3.intervation.de/index.php?id=353&type=109';
var class_login = 'ajax-loading';
/*
+++++++++++++++++++++++++++++++++
Ab hier keine Anpassungen mehr nötig
+++++++++++++++++++++++++++++++++
*/
// Funktion Notwendig wegen kb_md5fepw
// Function wurde einfach kopiert
function superchallenge_pass(form) {
var pass = form.pass.value;
if (pass) {
form.pass.value = MD5(form.user.value + ":" + MD5(pass) + ":" + form.challenge.value);
}
}
window.addEvent('domready', function(){
aktive();
});
window.onload = function() {
ak();
}
// Nachladen der Loginbox wenn ganze Seite geladen wurde
function ak() {
$(div_in_form).setHTML(txt_benuterstatus);
var log = $(div_in_form).addClass(class_login);
new Ajax(login_url, {
method: "get",
update: $(div_in_form),
onComplete: function() {
log.removeClass(class_login);
aktive();
}
}).request();
}
function aktive() {
if($(id_form)) {
$(id_form).addEvent('submit', function(e) {
new Event(e).stop();
var log = $(div_in_form).addClass(class_login);
$(id_form).setProperties({'action': login_url });
// Kann auskommentriert werden, wenn kein
// onSubmit="superchallenge_pass(this); return true;" im Quelltext
// wird normalerweise eingebunden durch onSubmit="###ON_SUBMIT###"
// in der newloginbox-Vorlage
/*
if(document.getElementsByName("logintype")[0].value == 'login') {
superchallenge_pass($(id_form));
}
*/
this.send({
update: log,
onComplete: function() {
log.removeClass(class_login);
aktive();
}
});
});
}
};
md5.js
Die Datei md5.js muss per TypoScript eingebunden werden.
seite.headerData.523 = TEXT
seite.headerData.523.value = <script type="text/javascript" src="typo3/md5.js"></script>
seite.headerData.523 = TEXT
seite.headerData.523.value = <script type="text/javascript" src="typo3/md5.js"></script>
Möchte man die Datei md5.js mit includeJS einbinden, ist darauf zu achten, dass md5.js erst in ein anderes Verzeichnis kopiert werden muss, da includeJS keine Dateien aus dem Verzeichnis typo3 laden kann!
PHP-Anpassungen
Leider ist es nötig, Änderungen direkt im Scoure der Extension kb_md5fepw vorzunehmen. Da es sich um geringfügige Änderungen handelt, habe ich auf das Erstellen einer weiteren Extension verzichtet.
In der Datei EXT:kb_md5fepw/pi1/ class.tx_kbmd5fepw_newloginbox.php sind folgende Zeilen in Kommentare umzuwandeln:
//$GLOBALS['TSFE']->JSCode .= $js;
//$GLOBALS['TSFE']->additionalHeaderData['tx_kbmd5fepw_newloginbox'] = '<script type="text/javascript" src="typo3/md5.js"></script>';
//$GLOBALS['TSFE']->JSCode .= $js;
//$GLOBALS['TSFE']->additionalHeaderData['tx_kbmd5fepw_newloginbox'] = '<script type="text/javascript" src="typo3/md5.js"></script>';
Fehlermeldungen in der Ausgabe der Ajax-Loginbox werden somit unterbunden.
TypoScript Ajax-Loginbox
Damit die Rückgabe von TYPO3 nur den notwendigen Quelltext enthält und unnötige Rendering-Prozesse nicht geladen bzw. ausgeführt werden, ist es ratsam, eine neue Seite anzulegen. Die Seite sollte unterhalb eines Storange-Folder liegen oder zumindest so eingerichtet sein, dass ein „normaler“ Zugriff nicht möglich ist (Nicht im Menue etc.)
Die Seite erhält ein Template, in dem die Vererbung von Setup und Constant unterbunden wird.
Für das setup des Templates sind nur wenige Angaben erforderlich:
login_ajax = PAGE
login_ajax {
typeNum = 109
config {
disableAllHeaderCode = 1
no_cache = 1
additionalHeaders = Content-Type:text/html;charset=utf-8|Expires: Mon, 26 Jul 1997 05:00:00 GMT|Last-Modified: 1999 GMT|Cache-Control: no-cache|Pragma: no-cache|Cache-Control: post-check=0, pre-check=0, FALSE
}
10 < plugin.tx_newloginbox_pi1
10 {
storagePid = 187
detailsPage =
showForgotPassword =
email_from =
email_fromName =
replyTo =
templateFile = EXT:newloginbox/res/newloginbox_00.html
// Allowed Referrer-Redirect-Domains:
domains =
}
}login_ajax = PAGE
login_ajax {
typeNum = 109
config {
disableAllHeaderCode = 1
no_cache = 1
additionalHeaders = Content-Type:text/html;charset=utf-8|Expires: Mon, 26 Jul 1997 05:00:00 GMT|Last-Modified: 1999 GMT|Cache-Control: no-cache|Pragma: no-cache|Cache-Control: post-check=0, pre-check=0, FALSE
}
10 < plugin.tx_newloginbox_pi1
10 {
storagePid = 187
detailsPage =
showForgotPassword =
email_from =
email_fromName =
replyTo =
templateFile = EXT:newloginbox/res/newloginbox_00.html
// Allowed Referrer-Redirect-Domains:
domains =
}
}
Es ist auch möglich, in einem bereits vorhanden Template einen neuen typeNum zu erstellen, dies ist aber nicht zu empfehlen!
Anpassungen "Template Newloginbox"
In dem TemplateFile der Newloginbox sind nur wenige Änderungen nötig.
id
Jedem Formular im TemplateFile der Newloginbox muss die id id="myForm" zugeordnet werden.
Rückgabe Quelltext
Die Workparts im TemplateFile der Newloginbox müssen so angepasst werden, dass nur der Quelltext zurückgegeben wird der für die Loginbox erforderlich ist!
CSS
Wärend das Ladevorgangs wird dem id="log_res" eine weitere Klasse zugeordnet die mit CSS angesprochen werden kann. Somit kann während der Ladezeit z.B. eine Einblendung eine "Wartegrafik" erreicht werden.
#log_res.ajax-loading {
background: url(../image/spinner.gif) no-repeat left top;
}#log_res.ajax-loading {
background: url(../image/spinner.gif) no-repeat left top;
}
Sonstiger Hinweis
Die hier vorgestellte Ajax-Loginbox funktioniert nur mit JavaScript. Der Grund liegt unter anderem darin, dass die Extension kb_md5fepw zur Verschlüsselung der Zugangsdaten JavaScript benötigt.
Ohne den Einsatz der Extension kb_md5fepw könnte der Login auch so gestaltete werden, dass bei deaktiviertem JavaScript ein Neuladen der Seite erfolgen würde. Nur bei aktiviertem JavaScript greift die Ajax-Loginbox.
Häufige Frage
- Test
- test2
- Funktioniert die Ajax-Loginbox nur mit JavaScript?
- Die hier vorgestellte Ajax-Loginbox funktioniert nur mit JavaScript. Der Grund liegt unter anderem darin, dass die Extension kb_md5fepw zur Verschlüsselung der Zugangsdaten JavaScript benötigt.
Ohne den Einsatz der Extension kb_md5fepw könnte der Login auch so gestaltete werden, dass bei deaktiviertem JavaScript ein Neuladen der Seite erfolgen würde. Nur bei aktiviertem JavaScript greift die Ajax-Loginbox.