Contao MetaModels per Formular befüllen: Einen Alias erstellen

26.08.2014, 14:05 von Daniel || 5 Kommentare || Mit anderen teilen

Da das MetaModels-Spendenziel für's Frontend-Editing bisher nur zur Hälfte erfüllt ist, muss man einen kleinen Umweg über ein selbst erstelltes Formular gehen. Besonderes Augenmerk gilt hier dem Alias.

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:

  1. Erstellung eines MetaModels
  2. Festlegen der benötigten Attribute
  3. Formular erstellen (mit oder ohne EFG) und Werte in die MetaModels-Tabelle speichern
  4. 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.

Schlüsselwörter zu diesem Beitrag

« zurück

Hier schreibe ich,

Ich

Daniel Erlinger, als selbstständiger Webdesigner über die Themen Webdesign, Contao, Shopsysteme, Kreatives, Neues und alles, was sonst noch dazu passt.

Vernetzt

Twitter
Mister Wong
Contao Community

Kommentare

11.04.2016 von Heinzelmann

Ist das Script noch aktuell?
Habe es wie folgt abgeändert doch leider wird kein alias generiert :-(
var $timestamp = Date.now(),
$aliasElement = document.querySelector('input[name="alias"]'),
$herstellerElement = document.querySelector('input[name="hersteller"]'),
$modellElement = document.querySelector('input[name="modell"]');

document.getElementById('f1').addEventListener('submit', function(event) {
var $herstellerValue = $herstellerElement.value.toLowerCase().replace(/\s+/g, ''),
$modellValue = $modellElement.value.toLowerCase().replace(/\s+/g, '');

$aliasElement.value = $herstellerValue + '.' + $modellValue + '-' + $timestamp;
});
</script>

Danke+Gruß

11.04.2016 von Daniel

Hallo Heinzelmann,

das ist jetzt ein bisschen wie Rätselraten, aber überprüfe mal folgendes: Hast du in der Konsole geschaut, ob eine Fehlermeldung erscheint? Hat das Formular auch die ID f1?

Daniel

12.04.2016 von Heinzelmann

Ja Folmular hatte die ID f1.
Habe es aber einfacher lösen können: Im "Versteckten Feld" den Standart-Wert mit Inserttags befüllen: { {form::hersteller} }-{ {form::modell} }-{ {date::Ymdi} }. Kommt zu dem selben Ergebnis :-)

12.04.2016 von Daniel

Danke für den Tipp! :)

14.04.2016 von Heinzelmann

Gerne :-) Wäre noch über einen Tipp dankbar, wie man z.B. ein Bild über EFG in Metamodels verfügbar macht. Vllt lässt sich das Tutorial noch dahingehend ergänzen?



Nutze Deinen Gravatar.


Bitte addieren Sie 5 und 5.