Formularfelder über GET-Parameter in der URL vorbelegen

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 auslesen

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 lauten.

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 Formularfeld «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.

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.

Wichtig ist nur, dass das Formularfeld den gleichen Namen wie der Parameter in der URL hat. Um den Standardwert für das Feld «vorname» zu füllen, muss der URL-Paramter vorname verwendet werden.

Beispiel: <a href="zielseite?vorname=Christian">

Extended Form Fields

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.

Standardwert bei Selectmenü, Checkbox und Radiobutton?

Die vorgestellte Variante mit PHP-Script funktioniert hervorragend bei Textfeldern. Wenn du allerdings für andere Formularelemente wie Select-Menü, Checkbox und Radiobutton dynamisch einen Standardwert vorgeben möchtest, dann empfehle ich dir die Erweiterung inspiredminds/contao-extended-form-fields oder e-spin/form-scr-default-bundle.

Feature-Wunsch 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 Contao-Core haben willst, dann gib im GitHub-Ticket einen Kommentar und Daumen nach oben.

Möchtest du über neue Artikel informiert werden?

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 ist der Initiator und Dozent der Contao Academy. Er bringt über 15 Jahre Praxiswissen in der professionellen Umsetzung von Contao-Websites mit. Zudem ist er Teil des Teams von trakked.io. Er liebt es, sich neues Wissen anzueignen und es weiterzugeben. Abseits des Bildschirms verbringt er am liebsten Zeit mit seiner Familie und in der Natur.

Folge Christian jetzt bei LinkedIn.

Christian Feneberg

8 Kommentare

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.

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.

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.

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}}

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.

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[nbsp]Philippe, ich hab es mir notiert. Wird allerdings noch bist Oktober dauern.

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.

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.

[nbsp]

Einen Kommentar schreiben

Bitte addieren Sie 6 und 5.