Formularfelder über GET-Parameter in der URL vorbelegen

  • 3.5
  • 4.4
  • 4.9
  • 4.13
  • 5.3

Oft ist es hilfreich, wenn Formulare bereits mit situationsabhängigen Werten vorbelegt sind. Wenn z.B. bereits das gewünschte Thema oder der richtige Ansprechpartner ausgefüllt sind - jeweils abhängig von der Seite, von der aus man das Formular aufgerufen hat.

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.

Extended Form Fields

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.

Standardwert bei Selectmenü, Checkbox und Radiobutton?

Die oben vorgestellte Variante funktioniert sehr gut bei Textfeldern. Wenn du für andere Formularelemente wie Selectmenü, Checkbox und Radiobutton dynamisch einen Standardwert vorgeben möchtest, dann empfehle ich dir die Erweiterung e-spin/form-scr-default-bundle.

Damit kannst du diese Formularelemente sehr einfach mit einem Get-Parameter vorbelegen. Weitere Informationen zur Erweiterung findest du auf der Website des Entwicklers.

Hat dir dieser Artikel gefallen?

Willst du in Zukunft keinen Artikel verpassen?
Dann trage hier deine E-Mailadresse ein und klicke auf "Abonnieren". Du erhältst regelmäßig aktuelle Infos über Contao und die Contao-Academy.

Du kannst deine E-Mail-Adresse jederzeit mit nur einem Mausklick aus unserem System löschen. Der Newsletter Versand sowie die individuelle Messung, Speicherung und Auswertung von Öffnungsraten und der Klickraten in Empfängerprofilen erfolgen durch KlickTipp. Ausführliche Hinweise erhältst du in unserer Datenschutzerklärung.

Über den Autor
Christian Feneberg (Gründer Fenepedia)

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.

Folge Christian jetzt auf Twitter, Xing und LinkedIn.

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?

Christian Feneberg 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>

Christian Feneberg 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

Christian Feneberg 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!

Christian Feneberg 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.

Christian Feneberg 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:

<?php
namespace App\EventListener;

use Contao\CoreBundle\ServiceAnnotation\Hook;
use App\Model\GhCoursesModel;

/**
* @Hook("replaceInsertTags")
*/

class InsertCourseTagListener
{
   /**
    * @param string $insertTag (zweiter Parameter nach :: ist das zugehörige Feld)
    * @return false|mixed|null
    */

   public function __invoke(string $insertTag)
   {
       $tag=explode('::',$insertTag);
       if ('getCourse' === $tag[0]) {

           $course = GhCoursesModel::findByPk(\Input::get('kurs'));
           return  $course->{$tag[1]} ?? false;

       }
       return false;
   }
}

PS: Danke Christian für Deine vielen Tipps.

Christian Feneberg 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?

Christian Feneberg 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

Was ist die Summe aus 2 und 7?