Formularfelder über GET-Parameter in der URL vorbelegen
- 3.5
- 4.4
- 4.9
- 4.13
- 5.3
GET und POST-Werte in Contao
Um GET und POST-Werte in Contao auszulesen, können wir das Contao-Framework nutzen.
Contao 4
<?php echo \Input::get('name_get_variable'); ?>
<?php echo \Input::post('name_post_variable'); ?>
Contao 5
<?php echo \Contao\Input::get('name_get_variable'); ?>
<?php echo \Contao\Input::post('name_post_variable'); ?>
Beispiel - Seminartermin übertragen
Nehmen wir an, du bietest Seminare an und möchtest beim Klick auf den Anmelde-Link, das entsprechende Feld im Formular automatisch ausfüllen lassen.
1. PHP-Script anlegen
Zunächst legen wir ein kleines PHP-Script in unserem Templates-Ordner an. Darin legen wir fest, welche Variable wir auslesen wollen. In unserem Fall soll das Feld "seminartermin" heißen.
get_seminartermin.php
# Contao 4
<?php echo \Input::get('seminartermin'); ?>
# Contao 5
<?php echo \Contao\Input::get('seminartermin'); ?>
2. Formular anpassen
Damit der Wert im Formular ausgegeben wird, müssen wir das soeben angelegte Script dem Formularfeld zuordnen. Dazu fügen wir mit Hilfe des File-Inserttags die PHP-Datei ein.
Wir tragen also bei unserem Feld "seminartermin" unter Standard-Wert folgendes ein:
{{file::get_seminartermin.php}}
3. Parameter an URL anhängen
Damit nun der Termin an das Formular übertragen wird, müssen wir diesen nun an die URL anhängen.
D.h. unsere Links sollte dann so aussehen:
<a href="zielseite?seminartermin=08.05.2018">
Wenn nun auf diesen Link geklickt wird, dann wird über den GET-Parameter das aktuelle Datum übertragen und beim Formular automatisch ausgefüllt.
Erweiterte Variante mit Parametern
Du möchtest mehrere Formularfelder vorbelegen und nicht jedes Mal eine eigene Datei anlegen? Auch das ist einfach möglich.
Das Prinzip ist ähnlich, allerdings musst du in deinem PHP-Script eine Variable anstelle des konkreten Feldes verwenden.
Wir legen uns dazu z.B. eine neue Datei get_parameters.php mit folgendem Inhalt an:
# Contao 4
<?php echo \Input::get(\Input::get('g')); ?>
# Contao 5
<?php echo \Contao\Input::get(\Contao\Input::get('g')); ?>
Standard-Wert vorbelegen
Wollen wir jetzt den Seminartermin (Feld = seminartermin) und den Namen des Seminars (Feld = seminarname) an das Formular übergeben, tragen wir folgende Standardwerte ein:
- Feld "seminartermin": {{file::get_parameters.php?g=seminartermin}}
- Feld "seminarname": {{file::get_parameters.php?g=seminarname}}
Wobei g unsere Variable für das Formularfeld ist.
Unser Link sollte jetzt so aussehen:
<a href="zielseite?seminarname=Contao&seminartermin=08.05.2021">
Vielen Dank an Steffen, der uns auf diese erweiterte Lösung aus dem Contao-Forum aufmerksam gemacht hat.
Empfehlung Videokurs
Eine ausführliche Anleitung mit Schritt für Schritt Video, findest du in diesem Video-Kurs.
Contao Erweiterung Extened Form Fields
Wenn du jetzt nicht selbst das Template und die entsprechenden Standardwerte abfragen möchtest, kannst du auch die Erweiterung Extended Form Fields verwenden. Hier lassen sich die Query-Parameter ganz bequem über einen Klick übernehmen.
Neues Feature für den Contao Core
Da diese Anforderung immer häufiger wurde, gibt es inzwischen ein GitHub-Ticket. Wenn du dieses Feature "Set default values for form fields via URL parameters" im Core haben willst, dann gibt auf GitHub einen Kommentar und Daumen nach oben.
Über den Autor
Christian Feneberg ist der Gründer der Contao-Academy und erstellt seit 2010 Websites mit Contao. Außerdem ist er im Team von trakked.io. und regelmäßig auf YouTube in der Contao Show zu sehen. Neben Contao begeistert er sich für Online-Marketing, Unternehmertum und Persönlichkeitsentwicklung.
8 Kommentare
Daniel |
Danke für die einfach Anleitung – das geht prima für einfache Datenübergaben. Cool wäre noch gleich ein JS dass die Felder dann auf readonly setzt … was empfiehlst du?
Antwort von Christian Feneberg
Hallo Daniel,
es kommt darauf an, ob du das Feld auch manuell füllen willst.
Wenn du das Formular nur mit Parameter aufrufst, dann könntest du das Feld bereits im Template auf "readonly" setzen.
Oder du machst es per Javascript. Eine wirkliche Empfehlung kann ich dir da nicht geben.
Rene |
Interessant wäre noch die Möglichkeit ein Select vorzubelegen also auf selected zu setzen.
<a href="zielseite?seminartermin=B">
<select name="seminartermin">
<option value="A">Seminartermin A</option>
<option value="B">Seminartermin B</option>
<option value="C">Seminartermin C</option>
</select>
Antwort von Christian Feneberg
Hallo Rene,
das lässt sich am besten mit ein wenig Javascript lösen.
Ich kann dazu gerne mal ein Beispiel erstellen.
Philippe |
Lieber Christian,
Ich hätte das selbe Anliegen wie Rene und müsste ein select vorbelegen. Könntest du so freundlich sein tatsächlich mal ein Beispiel zu erstellen?
Danke und schöne Grüße
Antwort von Christian Feneberg
Hallo Philippe, ich hab es mir notiert. Wird allerdings noch bist Oktober dauern.
Gerold |
Da ich in einem alten Contao gerade kein Inputvar zur Verfügung hatte, brachte dieser Beitrag schnell die Lösung! Danke!
Antwort von Christian Feneberg
Danke für dein Feedback. Freut mich, wenn ich helfen konnte.
Christian Michael |
Danke Christian für die gute Anleitung, ich schlage das immer wieder gerne hier nach ;-) ...
Wichtig ist noch, dass das PHP-Script direkt im Ordner /templates liegen muss - in einem Unterordner wie beispielsweise /templates/subfolder kommt sonst nichts im Feld an.
Antwort von Christian Feneberg
Hallo Christian,
wenn du einen Unterordner nutzten willst, dann musst du das dazusätzlich mit angeben. Also {{file::unterordner/dateiname.php}}
Steffen |
Das ganze lässt sich noch ausbauen, damit man verschiedene Parameter übergeben kann. Zusätzlicher Bonus: Mit einer universell verwendbaren Variante muss man nicht für jeden Parameter ein eigenes Template anlegen.
So übergibt bei mir die URL sowohl den Kurs, als auch den Termin:
meinedomain.de/kursanmeldung.html?kurs=Yoga%201&date=07.04.-11.04.2021
Damit das funktioniert, wird an input::get kein fester Wert wie im den obigen Beispiel übergeben, sondern eine Variable ('g'). Das sieht in meinem PHP-Template myGetVar.php so aus:
<?php echo \Input::get(\Input::get('g')); ?>
Jetzt kann ich beim Aufruf dem Skript beliebige Parameter übergeben oder die verschiedenen Werte des GET getrennt ansprechen. Das funktioniert z.B. aus einem Elementtyp "Text" heraus. Will ich das Datum (bei mir als "date" in der URL übergeben) aus meinen GET-Parametern einfügen, schreibe ich in den Text:
{{file::myGetVar.php?g=date}}
Damit wird an mein Skript der Parameter "date" übergeben, woraufhin mir das Contao Framework den entsprechende Wert für "date" zurück gibt.
Disclaimer: Das ist nicht auf meinem Mist gewachsen, sondern stammt vermutlich aus den Tiefen des Contao Forums (zu lange her, um die Quelle noch zu wissen). Danke an die ursprünglichen Tipp-Geber.
Hjue Fricke |
Ich hab das über einen InsertTag gelöst. Ab 4.9 geht das schön einfach über den Hook "replaceInsertTags".
Hier ein Beispiel, bei dem einzelne Felder eines Kurses (GhCoursesModel) abgefragt werden:
PS: Danke Christian für Deine vielen Tipps.
Antwort von Christian Feneberg
Hallo Hjue, vielen Dank für dein Codebeispiel.
David |
Bei mir funktioniert das in einer 5.3er Installation tatsächlich. Warum weiß ich aber nicht, weil ich dachte, das in Contao 5.3 die Input-Klasse entfernt wurde und durch die Symfony Request-Komponente ersetzt wurde. Stimmt das nicht? Bzw. wäre es sauberer, es auf dem neuen Weg umzusetzen?
Antwort von Christian Feneberg
Hallo SpeGal,
vielen Dank für deinen Hinweis. Der Tippfehler wurde korrigiert.
Aktuell sehe ich im Quellcode keine Anzeichen dafür, dass die Input-Klasse nicht mehr gültig sein sollte. Diese wird auch im Contao-Core mehrfach verwendet und es gibt keine Deprecated-Meldung dazu. Daher sehe ich kein Problem, die Input-Klasse weiterhin zu verwenden.
Wenn du genaueres wissen willst, dann ggf. mal im Slack-Channel von Contao einen Entwickler kontaktieren.
Einen Kommentar schreiben