2012-07-22 10 views
5

Niektóre formularze są zbyt skomplikowane, aby zmieściły się na jednej stronie. Jeśli na przykład formularz zawiera duże ilości uporządkowanych danych, takich jak wybieranie lokalizacji na mapie, planowanie wydarzeń w widżecie kalendarza lub zmiana niektórych części formularza w zależności od wcześniejszych danych wejściowych, warto mieć możliwość rozbić pewną formę na wiele stron.Formularze Yesod ze strumieniem strony

Jest to łatwe do zrobienia dzięki dynamicznym stronom internetowym i skryptom JavaScript, ponieważ wystarczy utworzyć widżet karty z różnymi stronami, a faktyczny przesłany formularz będzie zawierał cały widget karty i wszystkie jego pola wejściowe, generując pojedyncze: POST wniosek o całą operację.

Czasami jednak generowanie pewnych pól wejściowych zajmuje dużo czasu; mogą nawet być intensywne obliczeniowo nawet po wygenerowaniu strony, obciążając przeglądarkę użytkownika komputera niższego rzędu. Dodatkowo staje się trudne lub niemożliwe tworzenie formularzy, które dostosowują się do wcześniejszych danych wejściowych.

Dlatego konieczne jest podzielenie określonego formularza na wiele pełnych żądań stron.

ten może okazać się trudne, zwłaszcza, że ​​na pierwszej stronie formularza POST do /location/a, który wystawi przekierowanie do /location/b i zażądał jako GET przez klienta. Przekazywanie przechowywanych danych formularzy z POST /location/a do GET /location/b jest tam, gdzie leży trudność.

Erwin Vervaet, twórca Spring Web Flow (podprojekt wiosennej struktury, znany głównie ze swoich możliwości wtłaczania zależności), raz napisał a blog article demonstrując tę ​​funkcjonalność we wspomnianym frameworku, a także porównując go z Lift Web Framework, który zaimplementował similar functionality. Następnie przedstawia wyzwanie dla innych frameworków internetowych, które są dalej opisane w a later article.

Jak Yesod zmierzyłby się z tym problemem, zwłaszcza biorąc pod uwagę jego bezpaństwowy charakter oparty na REST?

Odpowiedz

3

Po pierwsze, nie istnieje jeszcze gotowe rozwiązanie tego problemu (przynajmniej o tym wiem). I nie wiem, w jaki sposób inne wspomniane frameworki rozwiązują problem. Więc to, co tu mówię, jest dość przypuszczające. Jestem jednak prawie pewien, że to zadziała.

Istotą problemu jest kodowanie parametrów POST strony A do żądania GET dla strony B. Najprostszym sposobem na to byłoby przyklejenie parametrów POST strony A do zmiennej sesji. Jednak spowoduje to dość poważne zerwanie nawigacji: wstecz/do przodu w ogóle nie będzie działało zgodnie z opisem.

Powróciliśmy więc do REST: musimy zakodować parametry POST w samym żądaniu. To naprawdę oznacza umieszczenie informacji w żądanej ścieżce lub ciągu zapytania. A ciąg zapytania prawdopodobnie ma największy sens.

Byłbym zaniepokojony umieszczeniem surowych parametrów POST w ciągu zapytania, ponieważ pozwoliłoby to serwerowi proxy łatwo odczytać zawartość. Chciałbym wykorzystać istniejącą kryptografię z sesji klienckiej. Innymi słowy, przykleimy podpisaną, zaszyfrowaną wersję poprzedniego formularza w parametrze ciągu zapytania.

Aby uczynić go nieco bardziej konkretne:

  • użytkownik przechodzi do strony A poprzez GET.
  • Użytkownik wysyła stronę A za pośrednictwem POST.
  • Serwer sprawdza poprawność przesłania formularza, pobiera wartość, serializuje go, szyfruje/haszy.
  • Użytkownik jest przekierowywany do strony B jako GET, z parametrem ciągu zapytania zawierającego zaszyfrowaną/zakodowaną wartość ze strony A.
  • Kontynuuj ten proces tyle razy, ile potrzeba.
  • Na ostatniej stronie możliwe jest odszyfrowanie parametru ciągu zapytania i przesłanie wszystkich formularzy.

Wygląda na to, że byłoby fajnym dodatkiem do pakietu, jeśli ktoś jest zainteresowany.

+1

To rozwiązanie wymagałoby napisania wielu "ręcznych" formularzy, po jednym dla każdej strony, które pakują i rozpakowują wartości i wywołują je (na przykład w sytuacji, gdy użytkownik jest na stronie, po wprowadzeniu danych na stronie 1, oraz naciśnie link oparty na HTML, link 'GET/page1' musi zawierać ** zaktualizowany ** stan formularza najlepiej ** sans JavaScript-zaangażowanie **). Bez tony magii w pakiecie 'yesod-form', w którym był jawny konstruktor' AForm' śledzący strony i parsowanie parametrów oraz jakiś magiczny 'FormFooPage <#> R's, to rozwiązanie wydaje się" nie do zaimplementowania ". – dflemstr

+1

Jeśli to konieczne, oczywiście ręcznie wykonam tę implementację, ponieważ pomysł jest bardzo wykonalny, ale Yesod nie będzie w stanie mi w ogóle pomóc w tym przypadku, nawet przy renderowaniu pola formularza. – dflemstr

+0

Nie rozmawiałem o tym, jak stworzyć przyjemny, przyjazny dla użytkownika interfejs API, o tym, jak będą działać wewnętrzne elementy. Mogę sobie wyobrazić, że na wysokim poziomie będziemy mieć coś, w czym moglibyśmy podać krotkę pojedynczych formularzy, które chcielibyście uruchomić, i Yesod automatycznie obsłużyłby księgę dla was, dostarczając w efekcie krotki wyników. Jest to z pewnością interesujące pytanie, ale myślę, że lista mailingowa może być lepsza do ujednolicenia szczegółów niż 600 znaków komentarza :). –