✅ WEB- und WordPress-Nachrichten, Themen, Plugins. Hier teilen wir Tipps und beste Website-Lösungen.

Lernprogramm: Erstellen eines erweiterten benutzerdefinierten Gravity Forms-Feldtyps und Umgang mit mehreren Eingabewerten

53

In diesem Tutorial zeige ich Ihnen, wie Sie einen erweiterten benutzerdefinierten Gravity Forms-Feldtyp erstellen. Das Feld hat mehrere Eingaben und erfordert eine spezielle Behandlung, um die übermittelten Werte zu speichern und anzuzeigen.

Was wir machen werden

In diesem Beispiel gehe ich von einem Beispiel eines WordPress-Websitebesitzers aus, der sich mit Mittagessenlieferungen an einem Arbeitsplatz befasst. Der Eigentümer hat ein Formular, in dem die Leute ausfüllen können, welche Art von Mittagessen sie möchten und wie viele für jeden Wochentag. Dies kann als tabellenähnliche Methode zur Eingabe einer Nummer für jeden Kurs an jedem gewünschten Tag gelöst werden.

Lernprogramm: Erstellen eines erweiterten benutzerdefinierten Gravity Forms-Feldtyps und Umgang mit mehreren Eingabewerten

Die Kurse sind in den Feldeinstellungen im Formulareditor editierbar und können jederzeit geändert werden. Und für jede Formularübermittlung erhält der Website-Eigentümer einen vollständigen Überblick über die übermittelten Werte:

Lernprogramm: Erstellen eines erweiterten benutzerdefinierten Gravity Forms-Feldtyps und Umgang mit mehreren Eingabewerten

Offensichtlich ist dies nur ein Beispiel und Sie müssen dies wahrscheinlich an Ihren Fall anpassen. Aber mit diesem Beispielfall lernen wir, wie man mit mehreren Eingaben in einem einzigen Feld umgeht. Es sollte Ihnen einige Ideen geben, wie Sie mit Ihrem eigenen benutzerdefinierten Feldtyp umgehen können.

Bevor Sie mit dem Codieren beginnen

Bevor wir beginnen, brauchen wir einen Ort, an dem wir unseren Code hinzufügen können. Sie können dies in Ihrer Theme- functions.phpoder Ihrer Plugin-Datei hinzufügen.

Die Methode, für die ich mich entschieden habe, ist objektorientiert, was bedeutet, dass eine Klasse erstellt wird, die die Klasse von Gravity Forms erweitert GF_Field. Ich empfehle, die Klasse in einer separaten Datei in Ihrem Projekt abzulegen. Sie sollten auch überprüfen, ob das Gravity Forms-Plugin vorhanden ist, bevor Sie Ihre Klasse einschließen, um einen Absturz Ihrer Website zu verhindern.

Wenn Sie interessiert sind, können Sie sich die Dokumentation von Gravity Forms auf GF_Field ansehen. Sie finden weitere Funktionen und Variablen, die Sie möglicherweise für Ihren Feldtyp benötigen.

Indem wir die GF_FieldKlasse erweitern, können wir einfach die Funktionen überschreiben, die wir ändern müssen. Was die Funktionen betrifft, die wir nicht überschreiben, führt Gravity Forms den in definierten Standardwert aus GF_Field. Im folgenden Tutorial gehen wir jede Funktion, die wir für unser benutzerdefiniertes Feld überschreiben müssen, einzeln durch. Fangen wir ohne weiteres an!

Erstellen eines benutzerdefinierten Feldtyps

Der erste Schritt besteht darin, eine benutzerdefinierte PHP-Klasse zu definieren, die GF_Field. Geben Sie der Klasse einen eindeutigen Namen und stellen Sie sicher, dass sie in Ihrem Projekt enthalten ist. Nach der Klassendefinition führen wir die register()statische Funktion aus, GF_Fieldindem wir eine Instanz unserer Klasse als Parameter übergeben. Dies initialisiert unsere Klasse und registriert den Feldtyp.

Die einzige erforderliche Variable, die Sie in Ihrer Klasse benötigen, ist $type. Die Klassenvariable $typemuss eindeutig sein und ist ein Slug-Name Ihres Feldtyps. In meinem Beispiel habe ich es ‘ food_delivery‘ genannt.

if (class_exists('GF_Field')) { class FoodDelivery extends GF_Field { public $type = 'food_delivery';   // The rest of the code is added here... } GF_Fields::register(new FoodDelivery()); }

Mit diesem winzigen Codestück sollte unser benutzerdefinierter Feldtyp als verfügbare Auswahl im Gravity Forms-Editor hinzugefügt werden. Standardmäßig erscheint es am Ende des Felds „Standardfelder”. Da wir unserem Feld noch keinen richtigen Namen gegeben haben (das ist der nächste Schritt), ist die Schaltfläche mit dem Wert von beschriftet $type.

Lernprogramm: Erstellen eines erweiterten benutzerdefinierten Gravity Forms-Feldtyps und Umgang mit mehreren Eingabewerten

Definieren des Feldnamens

Der nächste Schritt ist einfach; Geben Sie unserem Feld einfach einen besseren Namen. Dazu überschreiben wir die Funktion get_form_editor_field_title(). Alles, was wir tun müssen, ist eine Zeichenfolge mit dem Namen des Felds zurückzugeben.

public function get_form_editor_field_title() { return esc_attr__('Food Delivery', 'txtdomain'); }

Mit dieser Funktion in unserer Klasse wird die Schaltfläche zum Hinzufügen des Felds mit einer viel besseren Beschriftung aktualisiert.

Ändern der Feldkategorie

Dieser Schritt ist optional. Standardmäßig erscheint unser benutzerdefinierter Feldtyp im Feld „Standardfelder”, aber wir können das ändern. Nehmen wir an, wir möchten, dass es stattdessen im Feld „Erweiterte Felder” angezeigt wird.

Um die Kategorie zu ändern, in der das Feld erscheinen soll, überschreiben wir die Funktion get_form_editor_button(). Wir müssen ein assoziatives Array mit zwei Elementen zurückgeben. Als Wert für den Schlüssel ‘ group‘ geben Sie den internen Namen der Kategorie an, in der die Schaltfläche erscheinen soll. Verfügbare Optionen sind hier ‘ standard_fields‘, ‘ advanced_fields‘, ‘ post_fields‘ oder ‘ pricing_fields‘. (Sie können auch Ihre eigene Kategorie erstellen, aber das wird hier nicht behandelt). Das zweite Element im Array benötigt den Schlüssel ‘ text‘ und dafür geben wir einfach den Namen des Feldes zurück, indem wir aufrufen get_form_editor_field_title(). Dies ist die Funktion, die wir gerade oben erstellt haben.

Jetzt wird die Schaltfläche zum Hinzufügen unseres benutzerdefinierten Feldtyps in das Feld „Erweiterte Felder” verschoben.

Feldeinstellungen aktivieren

Wenn Sie versucht haben, den Feldtyp in ein Formular einzufügen, ist Ihnen vielleicht aufgefallen, dass es überhaupt keine Einstellungen gibt. Sie können nicht einmal das Etikett bearbeiten. Das funktioniert so, dass alle Arten von Einstellungen tatsächlich vorhanden sind, sie werden einfach alle mit CSS von Gravity Forms versteckt. Wir müssen individuell definieren, welche Einstellungen wir aktivieren möchten, und Gravity Forms zeigt uns dann die gewählten Einstellungen an.

Wir müssen die Funktion definieren get_form_editor_field_settings()und ein Array aller Einstellungen zurückgeben, die wir für unseren Feldtyp nicht verbergen möchten. Welche Einstellungen Sie hinzufügen möchten, hängt ganz von Ihnen und Ihrem Projekt ab. Denken Sie daran, dass Ihr Feld alle von Ihnen aktivierten Einstellungen unterstützen sollte, andernfalls ist es sinnlos, eine Einstellung dafür anzuzeigen.

Ich habe unten eine kurze Übersicht über die Namen der Einstellungen erstellt. Dies ist bei weitem keine vollständige Liste – denn es gibt viele Einstellungen, die so ziemlich nur für ganz bestimmte Feldtypen sinnvoll sind. Zum Beispiel Telefonformat, Datums-/Uhrzeitformat und eine ganze Reihe von Einstellungen, die sich auf Post-Felder und Preisfelder beziehen.

Registerkarte Allgemein

  • Feldbezeichnung:label_setting
  • Feld Beschreibung:description_setting
  • Auswahlmöglichkeiten:choices_setting
  • Erforderlich:rules_setting
  • Keine Duplikate:duplicate_setting
  • Spalten aktivieren:columns_setting
  • Aktivieren Sie die Auswahl „Alle auswählen”:select_all_choices_setting
  • Auswahl „Andere” aktivieren:other_choice_setting

Registerkarte Aussehen

  • Platzhalter:placeholder_setting
  • Sichtbarkeit der Feldbeschriftung und Platzierung der Beschreibung:label_placement_setting
  • Benutzerdefinierte Validierungsnachricht:error_message_setting
  • Benutzerdefinierte CSS-Klasse:css_class_setting
  • Feldgröße:size_setting

Registerkarte Erweitert

  • Bezeichnung des Admin-Felds:admin_label_setting
  • Standardwert:default_value_setting
  • Passworteingabe aktivieren:password_field_setting
  • SSL erzwingen:force_ssl_field_setting
  • Sichtweite:visibility_setting
  • Dynamisches Ausfüllen des Felds zulassen:prepopulate_field_setting
  • Bedingte Logik aktivieren:conditional_logic_field_setting
  • Seitenbedingte Logik aktivieren:conditional_logic_page_setting

In unserem Beispiel sind die wichtigsten die Feldbezeichnung, Beschreibung, Auswahlmöglichkeiten und ob das Feld erforderlich ist oder nicht. Wir erlauben auch Einstellungen für CSS-Klassen, benutzerdefinierte Validierungsmeldungen und bedingte Logik.

public function get_form_editor_field_settings() { return [ 'label_setting', 'choices_setting', 'description_setting', 'rules_setting', 'error_message_setting', 'css_class_setting', 'conditional_logic_field_setting' ]; }

Aktualisieren Sie den Formulareditor und Sie sollten nun alle ausgewählten Einstellungen und Registerkarten in unserem Feld sehen. Alle Einstellungen werden von Gravity Forms automatisch gehandhabt und gespeichert.

Fahren Sie fort und fügen Sie der Auswahlliste einige Elemente hinzu, damit wir etwas haben, mit dem wir arbeiten können. Hier ist, was ich als Beispiel eingerichtet habe:

Lernprogramm: Erstellen eines erweiterten benutzerdefinierten Gravity Forms-Feldtyps und Umgang mit mehreren Eingabewerten

Definieren von benutzerdefinierten Standardoptionen

Wenn Sie es gewohnt sind, zB Optionsfelder oder Kontrollkästchen in Gravity Forms zu verwenden, haben Sie wahrscheinlich bemerkt, dass sie mit Auswahlmöglichkeiten wie „Erste Wahl”, „Zweite Wahl”, „Dritte Wahl” versehen sind. Dies ist das Standardverhalten von Gravity Forms, wenn (vorher) keine Auswahlen gespeichert wurden, und dies wird nur bei diesen spezifischen Feldtypen ausgelöst. Aber für unseren benutzerdefinierten Feldtyp werden keine Auswahlmöglichkeiten ausgefüllt. Dies macht es ein wenig umständlich, da Sie die Schaltfläche „+” zum Hinzufügen einer weiteren Auswahl nicht erhalten. Sie müssten die Schaltfläche „Massen hinzufügen/vordefinierte Auswahlen” verwenden, dort einige Auswahlmöglichkeiten hinzufügen, und danach erhalten Sie Zugriff auf die Schaltflächen „+”, um Auswahlmöglichkeiten hinzuzufügen. Es ist jedoch einfach, einige benutzerdefinierte Optionen zu definieren – Sie müssen lediglich eine Klassen-Array-Variable definierenpublic $choicesund Gravity Forms generiert automatisch vordefinierte Auswahlmöglichkeiten in Ihrem Feld, wenn Sie es zu Ihren Formularen hinzufügen.

Hinweis: Dies ist eine Klassenvariable, die Sie oben in der Klasse direkt unter hinzufügen können public $type. Jede Auswahl muss ein Array sein, mit der Auswahl als Wert für die Taste „ text“.

Denken Sie daran, dass die Auswahlmöglichkeiten nicht rückwirkend ausgefüllt werden, wenn Sie das Feld bereits zum Formular hinzugefügt haben. Dies wird nur wirksam, wenn Sie dem Formular ein neues Feld hinzufügen.

Hinweis: In Gravity Forms scheint es möglich zu sein value, jeder Auswahl auch Schlüssel ‘ ‘ hinzuzufügen. Aber ich habe das nicht zum Laufen gebracht – die Werte werden automatisch die gleichen wie der Auswahltext.

Definieren des Feldwerts als Array

Der nächste Schritt ist ziemlich einfach, aber notwendig. Als Standardwerte für Felder in Gravity Forms dienen Strings. Der Wert muss ein Array sein, da wir mit mehreren Eingaben arbeiten. Dazu definieren wir die Funktion is_value_submission_array()und geben zurück true.

public function is_value_submission_array() { return true; }

Dadurch wird sichergestellt, dass wir mit dem eingegebenen Wert unserer mehreren Eingaben richtig arbeiten können.

Rendern der Feldausgabe

Beim Rendern der Feldausgabe sind einige Dinge zu beachten.

Zunächst einmal müssen Sie zwischen zwei Funktionen wählen; get_field_input()oder get_field_content(). Bei der ersten Methode rendert Gravity Forms automatisch das Verpackungslistenelement, die Bezeichnung, die Beschreibung und den Container für die Validierungsfehlermeldung in Ihr Feld, und Sie steuern nur die Ausgabe des inneren Felds. Bei der zweiten Methode passiert nichts davon und Sie haben mehr Kontrolle über die Ausgabe des Felds. Sie müssen jedoch die Beschriftung, Beschreibung und die Fehlermeldungen manuell rendern. Die erste Methode, get_field_input(), ist für die meisten Fälle vollkommen in Ordnung.

Als Zweites gilt es zu beachten, dass die Renderfunktion für das Feld drei verschiedene Stellen betrifft. Die drei sind das Rendern der Feldausgabe im Frontend, die Vorschau für das Feld im Formulareditor und schließlich auch das Feld beim Bearbeiten eines Eintrags. Glücklicherweise bietet Gravity Forms Funktionen, um einfach festzustellen, in welcher Ansicht wir uns befinden. Normalerweise würden Sie das Feld in allen drei Fällen auf die gleiche Weise rendern. Da das Rendern einer großen Tabelle mit vielen Eingaben im Formulareditor jedoch unnötig klobig wird, habe ich mich entschieden, das Feld im Formulareditor anders zu rendern.

Und schließlich müssen wir sicherstellen, dass alle Eingaben ein geeignetes nameAttribut erhalten, damit Gravity Forms seinen Wert bei der Formularübermittlung erfassen kann. Alle Eingaben in Gravity Forms benötigen nameAttribute, die dieser Regel folgen: name="input_{FIELD_ID}"(Mehrfachauswahlfelder verwenden eine zusätzliche ID, aber wir müssen uns in unserem Fall nicht darum kümmern). Wir haben Zugriff auf die Feld-ID, da es sich um eine Klassenvariable handelt (von GF_Field). Aber in unserem Fall haben wir Gravity Forms mitgeteilt, dass der Wert ein Array und kein singulärer Wert ist (vorheriger Schritt), also fügen wir Klammern nach dem Namensattribut hinzu; name="input_{FIELD_ID}[]". Wenn also das Feld in einem Formular die ID 4 hat, sollte das Namensattribut „ input_4[]” sein.

Ich entscheide mich für get_field_input()die Verwendung, die mit drei Parametern geliefert wird. Der erste Parameter ist das Formularobjekt, das wir für unser Beispiel nicht wirklich benötigen. Der zweite Parameter ist der aktuelle Wert. Dies kann entweder der Wert des Felds sein, ab $_POSTdem versucht wurde, das Formular zu senden, aber nicht erfolgreich war. Wir können die zuvor übermittelten Werte beibehalten. Oder wenn die Funktion beim Bearbeiten eines Eintrags ausgeführt wird, ist der Wert der gespeicherte Wert aus der Übermittlung. Auf den Wert gehen wir später noch genauer ein. Und der dritte Parameter ist das Entry-Objekt, das wir für unser Beispiel ebenfalls nicht benötigen.

Beginnen wir mit der Implementierung get_field_input(), die das endgültige Rendering als Zeichenfolge erwartet. Ich entscheide mich sofort dafür, einen leeren String zurückzugeben, wenn wir uns im Formulareditor befinden – weil ich in dieser Ansicht nicht die vollständige Tabelle rendern möchte. Wir können die Methode verwenden $this->is_form_editor(), um zu überprüfen, ob wir uns in der Formularbearbeitung befinden oder nicht. Sie können dies überspringen oder etwas anderes rendern, wenn Sie eine Vorschau des Felds im Formulareditor wünschen.

Der nächste Schritt besteht darin, den HTML-Code für eine Tabelle zu erstellen, die ein Array von Tagen durchläuft, um die Spalten und die Zeilen für jedes Kurselement zu generieren. Da wir jedoch an mehreren Stellen Zugriff auf das Array von Tagen (Tabellenspalten) benötigen, sollten wir es als Klassenvariable definieren, sodass es für alle darin enthaltenen Funktionen zugänglich ist. Ich definiere eine Klassenvariable $delivery_daysmit einem Array der Tage, für die ich die Lieferung anbieten möchte.

class FoodDelivery extends GF_Field { public $type = 'food_delivery';   private $delivery_days = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday'];   public function get_form_editor_field_title() { ... }

Dies ist nur ein Beispiel! Möglicherweise möchten Sie das Array für die Spalten von einer anderen Stelle abrufen, die nicht fest codiert ist.

Kommen wir zurück get_field_input()und bauen unsere Tabelle mit Eingaben auf. Zuerst überschreite ich die Klassenvariable und generiere die Tabellenüberschriften. Dann schleife ich die Auswahlmöglichkeiten durch, die in der Feldeinstellung für Auswahlmöglichkeiten eingegeben wurden. Dies ist über die Klassenvariable (von GF_Field) zugänglich $this->choices. Für jede Auswahl mache ich eine Eingabe mit den richtigen Namensattributen. Wir haben Zugriff auf die ID des Felds über die GF_FieldKlassenvariable $this->id.

Mit diesem Code sollten wir eine schöne Tabelle für unseren Feldtyp im Frontend gerendert bekommen! Offensichtlich liegt der HTML-Code ganz bei Ihnen, dies ist nur ein einfaches Beispiel.

Wir verlassen diese Funktion vorerst, aber wir werden später darauf zurückkommen, um den übermittelten Wert zu verarbeiten!

Wert richtig speichern

Ab sofort speichert Gravity Forms unser Feld als eindimensionales Array, das mit den eingegebenen Werten und leeren Zeichenfolgen gefüllt ist, wo die Eingabe leer war. Es gibt keine Informationen darüber, zu welchem ​​​​Tag oder zu welcher Wahl der Wert gehört, außer dem Index. Wir müssen dieses eindimensionale Array in ein mehrdimensionales assoziatives Array umwandeln, in dem wir den Tag und die Auswahlbezeichnung speichern. Wir können dann einfach auf den gespeicherten Zahlenwert für zB zugreifen $value['Ham sandwich']['Monday']. Nach dieser Array-Transformation müssen wir das Array auch serialisieren, damit Gravity Forms den Wert ordnungsgemäß in der Datenbank speichern kann.

Wir müssen dieses Wertearray an mehreren Stellen transformieren, also werde ich dafür eine separate Funktion definieren. Die Funktion akzeptiert das eindimensionale Array und wandelt es in ein mehrdimensionales Array mit den gespeicherten Werten für Tage und Auswahlen um:

Dadurch werden die Tagesnamen und die Auswahlmöglichkeiten direkt im Feldwert gespeichert. Auf diese Weise ist es möglich, die Auswahl zu einem späteren Zeitpunkt zu ändern, ohne die alten Einträge zu beschädigen.

Wenden wir uns nun dem Überschreiben der Funktion zu, die das Speichern des übermittelten Werts übernimmt. get_value_save_entry(). Es kommt mit fünf Parametern, aber wir brauchen nur den ersten, der der übermittelte Wert ist. Innerhalb der Funktion übergeben wir den Wert an unsere benutzerdefinierte Funktion oben, serialisieren seine Rückgabe und geben schließlich den neuen Wert zurück.

An diesem Punkt wird Gravity Forms unsere Werte erfolgreich so speichern, wie wir es wollen! Der gespeicherte Wert ist jetzt jedoch ein serialisiertes Array, das Gravity Forms gerne direkt ausgibt. Wir müssen Funktionen implementieren, um es von einem hässlichen serialisierten Array in eine hübsche Ausgabe zu verwandeln, wo immer wir es brauchen.

Anzeige des übermittelten Werts

Es gibt drei Stellen, an denen wir die Ausgabe unseres Feldwerts ändern müssen; die Liste der Einträge, die einen einzelnen Eintrag betrachten, und innerhalb der Zusammenführungs-Tags von Gravity Forms. Zusammenführungs-Tags werden am häufigsten in E-Mail-Benachrichtigungen verwendet. Ein Merge-Tag ist beispielsweise {all_fields}ein Merge-Tag, das die vollständigen übermittelten Formularwerte in E-Mails anzeigt.

Da wir dieselbe Ausgabe in drei verschiedenen Fällen rendern, ist es sinnvoll, eine separate Funktion dafür zu erstellen. Ich habe eine benutzerdefinierte Funktion definiert, die den Wert akzeptiert; das unserialisierte mehrdimensionale Array als Parameter. Die Funktion baut dann etwas HTML auf, das das Array auf hübsche Weise anzeigt, und gibt den String zurück. Ich habe mich für eine verschachtelte <ul>Liste entschieden, aber Sie können die Ausgabe beliebig ändern.

Toll, fangen wir mit dem Ersten an: der Liste der Einträge: get_value_entry_list(). Sie können hier die vollständige Ausgabe ausgeben, aber für die Listenansicht kann es ziemlich klobig und lang werden, daher habe ich mich dafür entschieden, einfach einen festen String zurückzugeben, der erklärt, dass der Benutzer in die Eintragsdetails gehen muss, um die vollständige Übersicht zu sehen.

public function get_value_entry_list($value, $entry, $field_id, $columns, $form) { return __('Enter details to see delivery details', 'txtdomain'); }

Dies liegt natürlich ganz bei Ihnen, Sie könnten sich beispielsweise dafür entscheiden, nur die ersten x Zeichen anzuzeigen.

Die zweite Funktion betrifft die Ansicht eines einzelnen Eintrags: get_value_entry_detail():

Wir deserialisieren das Array einfach mit der Funktion von WordPress [maybe_unserialize](https://developer.wordpress.org/reference/functions/maybe_unserialize/)()und geben die Zeichenfolgenausgabe unserer benutzerdefinierten Funktion zurück.

Die letzte Funktion wirkt sich auf die Merge-Tags aus und stellt sicher, dass der Wert unseres Felds auch in E-Mails gut aussieht: get_value_merge_tag().

Beachten Sie, dass wir den Wert in dieser Funktion nicht deserialisieren müssen.

Mit diesen drei Funktionen sollten alle übermittelten Werte überall ziemlich gut aussehen! Zum Beispiel beim Anzeigen eines eingereichten Beitrags:

Lernprogramm: Erstellen eines erweiterten benutzerdefinierten Gravity Forms-Feldtyps und Umgang mit mehreren Eingabewerten

Eine wichtige Sache fehlt jedoch! An diesem Punkt behalten unsere Eingaben nicht die zuvor übermittelten Werte bei, und das ist ziemlich schlecht.

Sorgen Sie dafür, dass unsere Eingaben den zuvor übermittelten Wert beibehalten

Es gibt hauptsächlich zwei Fälle, in denen wir sicherstellen müssen, dass die Eingaben die zuvor übermittelten Werte beibehalten. Der erste Fall tritt auf, wenn eine Formularübermittlung fehlgeschlagen ist (z. B. wenn der Benutzer ein erforderliches Feld vergessen hat). Im Moment verlieren alle unsere Eingaben alle zuvor eingegebenen Werte und der Benutzer muss alle Werte erneut eingeben. Zweitens, wenn der Websitebesitzer einen Eintrag bearbeitet, werden die Eingaben nicht mit den eingereichten Werten aus der Einreichung ausgefüllt – was es ziemlich unmöglich macht, die Werte richtig zu bearbeiten.

Um dies zu beheben, kehren wir zur Funktion zurück get_field_input(). Der zweite Parameter dieser Funktion ist der Wert. Denken Sie jedoch daran, dass diese Funktion sowohl das Frontend-Rendering als auch die Eintragsbearbeitung betrifft. Dies ist wichtig, da der gespeicherte Wert in diesen beiden Fällen unterschiedlich ist. Wenn wir uns am Frontend befinden und die Formularübermittlung bearbeiten, hat der Wert das Format des zuvor erwähnten eindimensionalen Arrays. Und wenn wir einen Eintrag bearbeiten, hat der Wert das Format eines serialisierten mehrdimensionalen Arrays. Daher müssen wir den bereitgestellten Wert richtig übersetzen, get_field_input()um leicht auf die tatsächlichen Werte zugreifen zu können.

Im obigen Code erstellen wir, bevor wir mit der Erstellung des HTML für die Feldausgabe beginnen, eine Variable $table_value, die den korrekt übersetzten Wert enthält. Wir verwenden GF_Fielddie Funktion is_entry_detail()von, um zu überprüfen, ob wir einen Eintrag bearbeiten oder nicht. Und dann ist es für unsere Eingaben einfach, auf die richtigen Werte zuzugreifen und sie als valueAttribute der Eingaben festzulegen:

Mit der obigen Aktualisierung get_field_input()sollten alle unsere benutzerdefinierten Eingaben immer mit dem vorherigen Wert ausgefüllt werden; egal, ob es darum geht, einen Eintrag zu bearbeiten oder eine Formularübermittlung erneut zu versuchen.

An diesem Punkt ist alles zum Rendern und Speichern unserer Werte erledigt und voll funktionsfähig. Aber es gibt noch eine Sache, die wir definitiv beheben müssen.

Machen Sie unsere Feldpass-Validierung „erforderlich”.

Gravity Forms überprüfen, ob der Wert eines Felds leer ist oder nicht. Dies ist häufig erforderlich, wenn das Feld wie erforderlich eingestellt ist. Wenn ein Feld erforderlich ist, können Sie das Formular nicht absenden, wenn es leer ist, richtig? Das Problem für uns ist, dass wir mehrere Eingaben haben und wir zulassen möchten, dass einige davon leer sind. Dies wird zu einem Problem, wenn unser Feld auf erforderlich gesetzt ist. Gravity Forms interpretiert „Ist das leer” leider falsch und verlangt, dass alle Eingaben ausgefüllt werden. Wir müssen also eine Regel hinzufügen, die besagt, dass der Gesamtwert des Felds nicht leer ist, wenn mindestens eine unserer vielen Eingaben ausgefüllt wird.

Die letzte Funktion, die wir in unserer Klasse überschreiben müssen, ist is_value_submission_empty(). Wir erhalten nur die Formular-ID als Parameter für diese Funktion, daher müssen wir den Feldwert mithilfe der Gravity Forms-Funktion extrahieren, um ihn aus dem $_POSTArray abzurufen: rgpost('input_<FIELD ID>'). Die Rückgabe sollte das eindimensionale Array sein, das wir zuvor gesehen haben. Alles, was wir tun müssen, ist, das Array zu durchlaufen und zurückzukehren, falsewenn wir irgendwo einen Wert finden. Andernfalls kehren wir zurück, trueda der Wert des Felds tatsächlich vollständig leer ist.

Wenn die obige Funktion vorhanden ist, schlägt die Übermittlung unseres Felds nicht fehl, wenn es auf erforderlich gesetzt ist und mindestens eine Eingabe ausgefüllt ist.

Fazit und endgültiger Code

Dieses Tutorial hat Ihnen ausführlich gezeigt, wie Sie Ihren eigenen benutzerdefinierten erweiterten Feldtyp für Gravity Forms erstellen. Auch wenn Ihr Projekt anders ist als mein Beispiel, hoffe ich, dass Sie einige Hinweise und Aha’s auf dem Weg haben. Ich finde die Gravity Forms-Dokumentation in einigen Fällen ziemlich mangelhaft, und dies ist das Ergebnis von viel Versuch und Irrtum! Wie auch immer, hoffentlich war dies für Sie von Nutzen!

Als Referenz ist hier der vollständige Code in seiner Gesamtheit:

Aufnahmequelle: awhitepixel.com

Diese Website verwendet Cookies, um Ihre Erfahrung zu verbessern. Wir gehen davon aus, dass Sie damit einverstanden sind, Sie können sich jedoch abmelden, wenn Sie möchten. Annehmen Weiterlesen