Najprostszym sposobem na to jest użycie $ form_state. W metodzie formBuild () masz przełącznik if / else oparty na czymś podobnym $form_state['step']
i wyświetlasz różne elementy formularza. Następnie masz to samo w wywołaniu zwrotnym przesyłania lub masz wiele wywołań zwrotnych, które robią coś dla obiektu w $ form_state, który budujesz, zmień krok i ustaw $form_state['rebuild']
flagę na PRAWDA.
Istnieje kilka wad tego podejścia, dlatego (między innymi) stworzono kreatora formularzy narzędzi. Może się to skomplikować, jeśli masz wiele kroków i musisz to wszystko zdefiniować w jednej funkcji / klasie i wszystko dzieje się w żądaniach POST.
Kreator formularzy narzędzi to zgrupowanie wielu oddzielnych formularzy i sterowanie nawigacją między nimi. Używasz także pamięci podręcznej obiektu ctools do przechowywania obiektu zamiast $ form_state, ponieważ nie jest on już współużytkowany przez wszystkie formularze.
Mimo, że system nie ma jeszcze istnieją, ctools object cache został przeniesiony do 8.x i nazywa się teraz tempstore użytkownika, dostępny jako usługa: \Drupal::service('user.private_tempstore')
(przed 8.0-beta8 nazywa user.tempstore
). Jest to warstwa na szczycie oczekiwanej składnicy wartości klucza, która wprowadza do niej własność przechowywanych danych. To właśnie napędza dobrze znaną wiadomość w widokach, że inny użytkownik aktualnie edytuje ten widok i jest z tego powodu zablokowany. Kolejną zaletą w porównaniu do użycia $ _SESSION jest to, że twoje dane muszą być ładowane tylko w razie potrzeby, gdy edytujesz 3 widoki, wtedy użycie $ _SESSION oznaczałoby, że musisz je ładować i nosić przy każdym żądaniu strony.
Jeśli nie jest to potrzebne, możesz polegać na sesji lub bezpośrednio umieścić ją w przydatnym magazynie wartości klucza ($ form_state jest tam teraz również przechowywane, a nie pseudo-cache jak w 7.x).
System konfiguracji nie jest jednak dobrze dopasowany. Nie jest to przeznaczone dla treści na użytkownika (lub treści w ogóle), ponieważ tak naprawdę nie skaluje się do przechowywania tysięcy lub dziesiątek tysięcy rekordów i może przyjąć pewne założenia, że wstępnie załaduje wszystko, czego może potrzebować na dane żądanie strony ( jeszcze nie, ale trzeba sprawić, aby tak się stało)
Zwykle wartości formularzy można przechowywać między krokami za pomocą pamięci podręcznej obiektów cTools (podobnie jak formularze Multistep w Drupal 7 ) lub poprzez
$form_state
(zgodnie z tym przewodnikiem ).W Drupal 8 możesz odziedziczyć
FormBase
klasę, aby utworzyć nową klasę wieloetapową.W artykule Jak budować wieloetapowe formularze w Drupal 8 , możesz znaleźć prosty sposób na utworzenie wieloetapowego formularza w Drupal 8.
Przede wszystkim musisz stworzyć klasę podstawową, która będzie odpowiedzialna za wprowadzanie niezbędnych zależności.
Oto kod demonstracyjny (dla
MultistepFormBase.php
pliku):Następnie możesz utworzyć rzeczywistą klasę formularzy w pliku o nazwie
MultistepOneForm.php
:I zaktualizuj plik routingu w module demonstracyjnym (
demo.routing.yml
):Na koniec utwórz drugą formę (
MultistepTwoForm
):źródło
Kreator wieloetapowym , że już wspomniano, jest już zintegrowany z CTools patrz: Kreator Wsparcie dla 8.x-3.x , więc można rozważyć rozszerzenie go
your_module.services.yml
, npnastępnie rozszerz klasę w
src/Controller/MyWizardForm.php
:źródło
Tests/Wizard/CToolsWizard*
plików, w których można znaleźć niektóre testy (nptestWizardSteps
.).