Dynamische Formular-Hooks für GravityForms

Ich nutze wirklich sehr gerne GravityForm, wenn ich sehr dynamische Formulare erstellen muss. Der Formular-Builder ist sehr umfangreich und bietet viele Möglichkeiten. Manchmal muss man dann aber doch ein wenig eigenen Code schreiben und sich per Hook in die Formular-Abarbeitung einhängen. In diesem Blogbeitrag möchte ich euch zeigen, wie das auch über mehrer Installation eines Formulars hinweg funktioniert.

Verwendung eines Hooks für alle Instanzen

Nehmen wir als Beispiel mal den Hook gform_pre_submission. Wenn ihr euch hier einhängen wollt, dann funktioniert das, wie bei jedem anderen Hook in WordPress auch:

function my_pre_submission( $form ) {
    $_POST['input_1'] = 'updates value for field with ID 1';
}
add_action( 'gform_pre_submission', 'my_pre_submission' );

Dieser Code-Schnippsel würde den Wert jedes Formular-Feldes mit der ID 1 in jedem Formular überschreiben. Das ist sicher nicht, was ihr normalerweise wollt.

Verwendung eines Hooks nur für ein Formular

Wenn ich den Wert eines Feldes ändern wollt, dann in der Regel nur für ein spezifisches Formular. Dies kann recht einfach erreicht werden, indem ihr die Formular-ID an das Ende des Hooks anhängt:

function my_pre_submission( $form ) {
    $_POST['input_1'] = 'updates value for field with ID 1';
}
add_action( 'gform_pre_submission_1', 'my_pre_submission' );

Nun wird nur noch das Feld für das Formular mit der ID 1 überschrieben, sobald es übermittelt wurde. Das ist eine gute Lösung, bis zu dem Zeitpunkt, an dem ihr die Export/Import Funktion verwendet.

Umgang mit Formularen mit verschiedenen IDs

Sagen wir einmal, ihr habt ein Formular in einem Projekt erstellt und möchtet dieses nun in einem anderen verwenden. Hierzu könnt ihr dann einfach die Funktion für den Export und Import verwenden, was das Formular mit allen Einstellungen (aber ohne die Einträge) kopiert. Aber wenn das neue Projekt bereits Formulare hat, dann kann es passieren, dass das Formular hier eine andere ID bekommt. Das gleicht passiert auch recht schnell, wenn ihr in einer Entwicklungsumgebung ein Formular erstellt und es dann auf eine Live-Seite importiert oder aber wenn ihr nicht alleine neue Formulare erstellt.

In diesen Fällen müsst ihr dann die neue Formular-ID rausfinden und den Wert entsprechend in allen Hooks anpassen. Aber was ist, wenn ihr den Code in einer Versionsverwaltung habt und nicht einfach einen neuen statischen Wert verwenden könnt?

Verwendung einer Konstanten für die Formular-ID

In einem Projekt hatte ich genau dieses Problem und mich dazu entschieden, die ID des Formulars einfach in einer Konstanten zu speichern. Alle Hooks sehen dann in etwa wie folgt aus:

function my_pre_submission_contact( $form ) {
    $_POST['input_1'] = 'updates value for field with ID 1';
}
add_action( 'gform_pre_submission_' . PREFIX_CONTACT_FORM_ID, 'my_pre_submission_contact' );

function my_pre_submission_form_event( $form ) {
    $_POST['input_1'] = 'updates value for field with ID 1';
}
add_action( 'gform_pre_submission_' . PREFIX_EVENT_FORM_ID, 'my_pre_submission_form_event' );

Das ist natürlich nicht der echt Code, aber ich denke, ihr versteht den Ansatz damit. Ich habe also eine Konstante pro Formular (und hierbei den Formularnamen und nicht dessen ID verwendet). Damit kann dann die ID je nach System dynamisch gesetzt werden.

Setzen eines Standard-Werts für die Konstante im Plugin (oder Theme)

Ich speichere solchen Code normalerweise in einem Plugin. In der Hauptdatei dieses Plugins setze ich dann einen Standardwert, der dem System entspricht, auf dem ich das Formular zuerst verwendet/erstellt habe:

if ( ! defined( 'PREFIX_CONTACT_FORM_ID' ) ) {
	define( 'PREFIX_CONTACT_FORM_ID', 1 );
}
if ( ! defined( 'PREFIX_EVENT_FORM_ID' ) ) {
	define( 'PREFIX_EVENT_FORM_ID', 2 );
}

Mit der ! defined() Prüfung kann ich feststellen, ob die Konstante schon zuvor an andere Stelle gesetzt wurde und ansonsten den Standardwert setzen. Im zweiten Projekt kann ich daher dann in der wp-config.php Datei die anderen IDs setzen:

define( 'PREFIX_CONTACT_FORM_ID', 4 );
define( 'PREFIX_EVENT_FORM_ID', 5 );

Fazit

Obwohl GravityForms wirklich sehr viele Hooks anbietet und diese wirklich einfach genutzt werden können, kann es aufgrund der statischen IDs in den Namen schnell zu Problemen führen. Die Verwendung von dynaischem ID-Werten in Konstanten ermöglicht es euch, den selben Code in mehreren Projekten zu verwenden.

Das Gleiche gilt selbstverständlich auch für alle anderen Hooks von GravityForms, bei denen eine ID ans Ende des Hooks gehängt werden können, um nur bestimmt Formulare, Felder, etc. anzupassen.

Veröffentlicht von

Bernhard ist fest angestellter Webentwickler, entwickelt in seiner Freizeit Plugin, schreibt in seinem Blog über WordPress und andere Themen, treibt sich gerne bei den WP Meetups in Berlin und Potsdam herum und läuft nach Feierabend den ein oder anderen Halbmarathon.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.