Der einfachste Weg, dies zu tun, ist die Verwendung von $ form_state. In Ihrer formBuild () -Methode haben Sie ein if / else oder einen Schalter, der auf so etwas basiert $form_state['step']
und verschiedene Formularelemente anzeigt. Dann haben Sie entweder dasselbe in Ihrem Submit-Callback oder mehrere Submit-Callbacks, die etwas mit einem Objekt in $ form_state tun, das Sie erstellen, den Schritt ändern und das $form_state['rebuild']
Flag auf TRUE setzen.
Dieser Ansatz hat einige Nachteile, weshalb (unter anderem) der ctools-Formularassistent erstellt wurde. Es kann kompliziert werden, wenn Sie mehrere Schritte haben und all dies in einer einzigen Formularfunktion / -klasse definieren müssen und alles in POST-Anforderungen geschieht.
Der ctools-Formularassistent gruppiert mehrere separate Formulare und steuert die Navigation von einem zum anderen. Sie verwenden auch den ctools-Objektcache, um Ihr Objekt anstelle von $ form_state zu speichern, da dies nicht mehr für Ihre Formulare freigegeben ist.
Während das System noch nicht existiert, die CTOOLS Objekt - Cache auf 8.x portiert wurde und nun Benutzer tempstore, als Service genannt: \Drupal::service('user.private_tempstore')
(vor 8,0-beta8 genannt user.tempstore
). Dies ist eine Schicht über dem Speicher für auslauffähige Schlüsselwerte, die den Besitz der darin gespeicherten Daten einführt. Dies ist es, was die bekannte Nachricht in Ansichten antreibt, dass ein anderer Benutzer diese Ansicht gerade bearbeitet und sie aus diesem Grund gesperrt ist. Ein weiterer Vorteil gegenüber der Verwendung von $ _SESSION besteht darin, dass Ihre Daten nur bei Bedarf geladen werden müssen, wenn Sie 3 Ansichten bearbeiten. Wenn Sie dann $ _SESSION bearbeiten, müssen Sie sie bei jeder einzelnen Seitenanforderung laden und herumtragen.
Wenn Sie das nicht benötigen, können Sie sich auf die Sitzung verlassen oder sie auch direkt in einem Speicher für ablaufbare Schlüsselwerte ablegen ($ form_state wird jetzt auch dort gespeichert, kein Pseudo-Cache wie in 7.x).
Das Konfigurationssystem passt jedoch nicht gut zusammen. Dies ist nicht für Inhalte pro Benutzer (oder überhaupt für Inhalte) gedacht, da es nicht wirklich skalierbar ist, um Tausende oder Zehntausende von Datensätzen zu speichern, und möglicherweise einige Annahmen trifft, um alles vorzuladen, was für eine bestimmte Seitenanforderung erforderlich ist ( noch nicht, aber es gibt ein Problem, das dies ermöglicht)
Normalerweise können Sie Formularwerte zwischen Schritten entweder mithilfe des cTools-Objektcaches (ähnlich wie bei mehrstufigen Formularen in Drupal 7 ) oder über
$form_state
(gemäß diesem Lernprogramm ) speichern .In Drupal 8 können Sie eine
FormBase
Klasse erben , um eine neue mehrstufige Klasse zu erstellen.In dem Artikel Wie 8 Multi-Schritt - Formulare in Drupal bauen können Sie einen einfachen Weg zu finden , ein mehrstufiges Formular in Drupal 8 zu erstellen.
Zunächst müssten Sie die Basisklasse erstellen, die für das Einfügen der erforderlichen Abhängigkeiten zuständig ist.
Hier ist der Demo-Code (für
MultistepFormBase.php
Datei):Anschließend können Sie die eigentliche Formularklasse in einer Datei mit dem Namen
MultistepOneForm.php
:Und aktualisieren Sie Ihre Routing-Datei im Demo-Modul (
demo.routing.yml
):Erstellen Sie abschließend das zweite Formular (
MultistepTwoForm
):quelle
Der von Ihnen erwähnte mehrstufige Assistent ist bereits in CTools integriert. Weitere Informationen finden Sie unter: Assistentenunterstützung für 8.x-3.x . Sie können ihn daher möglicherweise erweitern
your_module.services.yml
, zErweitern Sie dann die Klasse in
src/Controller/MyWizardForm.php
:quelle
Tests/Wizard/CToolsWizard*
Sie können gerne eine andere Frage mit einem bestimmten Problem stellen, das Sie haben, oder in Dateien suchen, in denen Sie einige Tests finden können (ztestWizardSteps
. B. ).