2012-07-22 4 views
5

Некоторые формы слишком сложны, чтобы их можно было разместить на одной странице. Если, например, форма включает в себя большое количество структурированных данных, таких как выбор местоположений на карте, планирование событий в виджетах календаря или изменение определенных частей формы в зависимости от более раннего ввода, это имеет значение, чтобы иметь возможность разбить определенную форму на нескольких страницах.Формат Yesod со страничным потоком

Это легко сделать с динамическими веб-страницами и Javascript, так как можно просто создать виджет с разными страницами, а фактическая поданная форма будет содержать весь виджет вкладки и все его поля ввода, что даст один POST запрос на всю операцию.

Иногда, однако, для создания определенных полей ввода требуется много времени; они могут даже быть интенсивно вычислительными, даже после того, как страница была сгенерирована, облагая налогом браузер младшего компьютерного пользователя. Кроме того, становится трудно или невозможно создавать формы, которые адаптируются на основе более раннего ввода.

Поэтому возникает необходимость разделить определенную форму на несколько запросов полной страницы.

Это может оказаться трудным, особенно после первой странице формы будет POST к /location/a, который будет выдавать редирект на /location/b и запрошена GET клиентом. Трудность заключается в передаче данных хранимой формы от POST /location/a до GET /location/b.

Erwin Vervaet, создатель Spring Web Flow (подпроект Spring Framework, в основном известный своими возможностями впрыска зависимостей), однажды написал a blog article, демонстрируя эту функциональность в указанной структуре, а также сравнивая ее с платформой Lift Web Framework, которая реализовала similar functionality. Затем он представляет проблему для других веб-фреймворков, которая далее описана в a later article.

Как бы Йесод столкнулся с этой проблемой, особенно учитывая ее беззастенчивый характер на основе REST?

ответ

3

Во-первых, до сих пор нет готового решения для этого, что я знаю как минимум. И я не знаком с тем, как другие упомянутые рамки решают проблему. Так что я говорю здесь, это довольно много догадок. Однако я уверен, что это сработает.

Суть проблемы здесь заключается в кодировании параметров POST страницы A в запрос GET для страницы B. Простейшим способом сделать это будет привязать параметры POST страницы A к переменной сеанса. Тем не менее, это очень сильно нарушит навигацию: back/forward не будет работать вообще, как описано.

Итак, мы возвращаемся к REST: нам нужно кодировать параметры POST в самом запросе. Это действительно означает, что нужно помещать информацию в запрошенный путь или в строку запроса. И строка запроса, вероятно, имеет наибольший смысл.

Я был бы заинтересован в том, чтобы поместить необработанные параметры POST в строку запроса, поскольку это позволит любому прокси-серверу легко отслеживать содержимое. Поэтому я хотел бы использовать существующую криптографию от клиентов. Другими словами, мы будем придерживаться подписанной, зашифрованной версии предыдущего представления формы в параметре строки запроса.

Чтобы сделать его немного более конкретны:

  • Пользователь переходит на страницу А через GET.
  • Пользователь отправляет страницу A через POST.
  • Сервер проверяет отправку формы, получает значение, сериализует его, шифрует/хеширует.
  • Пользователь перенаправляется на страницу B как GET с параметром строки запроса, содержащим зашифрованное/хешированное значение со страницы A.
  • Продолжайте этот процесс столько раз, сколько необходимо.
  • На последней странице вы можете расшифровать параметр строки запроса и получить все формы.

Это похоже на забавный дополнительный пакет для написания, если кому-то это интересно.

+1

Это решение потребует написания множества «ручных» форм, по одному на каждую страницу, которое упаковывает и распаковывает значения и отправляет их (например, для ситуации, когда пользователь находится на странице 2, введя данные на странице 1 и нажимает обратную ссылку на основе HTML, ссылка 'GET/page1' должна включать ** обновленное ** состояние формы предпочтительно ** без участия Javascript **). Без тонны магии в пакете 'yesod-form', где был явный конструктор' AForm', отслеживающий страницы и парсинг параметров, и некоторые магические 'FormFooPage <#> R', это решение кажется« нереализуемым ». – dflemstr

+1

Если это необходимо, я, конечно же, буду выполнять эту реализацию, поскольку идея очень возможна, но Yesod не сможет мне вообще помочь, даже при рендеринге полей. – dflemstr

+0

Я не обсуждал, как сделать из этого приятный, удобный API, как работают внутренние элементы. Я бы предположил, что на высоком уровне у нас будет кое-что, где вы могли бы обеспечить кортеж отдельных форм, которые вы хотите запустить, и Yesod автоматически обрабатывал бы бухгалтерский учет для вас, в конечном итоге предоставляя вам набор результатов. Это определенно интересный вопрос, но я думаю, что список рассылки может быть лучше для хэширования деталей, чем с комментариями в 600 символов :). –

Смежные вопросы