Contao MetaModels per Formular befüllen: Einen Alias erstellen
Eigentlich wollte ich diesen Beitrag dem Erstellen eines geeigneten Formulars im Allgemeinen widmen. Doch dazu gibt es eigentlich nicht viel zu berichten. Die Schritte sind recht übersichtlich:
- Erstellung eines MetaModels
- Festlegen der benötigten Attribute
- Formular erstellen (mit oder ohne EFG) und Werte in die MetaModels-Tabelle speichern
- Formularfelder erstellen und darauf achten, dass der Feldname dem Spaltennamen des MetaModels-Attribut entspricht
Im Groben und Ganzen war's das auch schon. Wenn da nicht der Alias wäre.
Vorüberlegungen: den passenden Alias suchen
Der Alias wird zur eindeutigen Identifizierung des Datensatzes gebraucht. Normalerweise wird er beim Speichern des MetaModels-Datensatzes im Backend generiert. Dieser Fall scheidet jedoch aus, da der Datensatz über das Frontend aus dem Formular kommen soll. Was also tun? Der Alias muss selbst erstellt werden.
Als erstes sollte man sich überlegen, aus welchen Formularfeldern sich der Alias zusammensetzen soll. Je nach Anforderung des Projekts können das ein oder mehrere Felder sein, beispielsweise der Vor- und Nachname einer Person. Das wichtigste Kriterium fehlt aber noch: die Eindeutigkeit.
Wenn ich mich nun für den Vor- und Nachnamen als Aliasbestandteil entschieden habe, dann ist dies nicht eindeutig.
Eine Überlegung wäre, die ID des in der Datenbanktabelle gespeicherten Datensatzes hinzuzufügen. Nehmen wir an, der letzte in der Tabelle gespeicherte Datensatz hat die ID 5. Nun müsste man sich beim Speichern des Formulars diese ID aus der Tabelle holen, um 1 erhöhen, um sie mit den beiden anderen Feldern zu kombinieren. Dieser Weg erscheint mir allerdings zu heikel und kompliziert.
Was also stattdessen nehmen? Der Timestamp wäre eine Lösung. Er ist eindeutig und kompromittiert nicht die Sicherheit der Anwendung.
Einen Alias erstellen
Alles, was man aus MetaModels Sicht braucht, ist ein Attribut mit diesem Namen. Als Zweites erstellt man im Formular ein verstecktes Feld mit dem Namen alias
. Dieses Feld wird in einem weiteren Schritt per Javascript befüllt. Dafür erstellt man ein letztes Formularfeld vom Typ HTML, in welchem man folgenden Code ablegt:
<script>
var $timestamp = Date.now(),
$aliasElement = document.querySelector('input[name="alias"]'),
$foreNameElement = document.querySelector('input[name="forename"]'),
$surNameElement = document.querySelector('input[name="surname"]');
document.getElementById('f1').addEventListener('submit', function(event) {
var $foreNameValue = $foreNameElement.value.toLowerCase().replace(/\s+/g, ''),
$surNameValue = $surNameElement.value.toLowerCase().replace(/\s+/g, '');
$aliasElement.value = $foreNameValue + '.' + $surNameValue + '-' + $timestamp;
});
</script>
Es ist wichtig, dass Script-Tag vorher in den Contao-Einstellungen zu erlauben.
Das Script holt nun beim Abschicken des Formulars die Werte aus den Feldern Vorname und Nachname. Diese beiden Werte werden in Kleinbuchstaben umgewandelt und von Leerzeichen getrennt. Anschließend werden sie mit dem Timestamp kombiniert und als Wert in das alias-Feld geschrieben:
vorname.nachname-1409058151
Somit ist der gespeicherte Datensatz mit einem eindeutigen Alias versehen und kann im Frontend zum Aufruf der Detailseite genutzt werden.