2012-07-22 33 views
5

Một số biểu mẫu nhất định quá phức tạp để chúng vừa với một trang. Ví dụ, nếu một biểu mẫu liên quan đến số lượng lớn dữ liệu có cấu trúc, chẳng hạn như chọn vị trí trên bản đồ, lập lịch sự kiện trong tiện ích con lịch hoặc có một số phần nhất định của biểu mẫu thay đổi tùy thuộc vào đầu vào trước đó, nó có giá trị để có thể chia nhỏ một biểu mẫu nhất định trên nhiều trang. Điều này rất dễ làm với các trang web động và Javascript, đơn giản là tạo một tiện ích tab với các trang khác nhau và biểu mẫu được gửi thực tế sẽ chứa toàn bộ tiện ích tab và tất cả các trường nhập của nó, cho một POST yêu cầu cho toàn bộ hoạt động.Các mẫu Yesod có lưu lượng trang

Đôi khi, tuy nhiên, phải mất một thời gian dài để tạo ra các trường nhập nhất định; họ thậm chí có thể được tính toán chuyên sâu ngay cả sau khi trang đã được tạo ra, đánh thuế trình duyệt của người dùng máy tính cấp thấp. Ngoài ra, nó trở nên khó khăn hoặc không thể tạo ra các hình thức thích ứng với bản thân dựa trên đầu vào trước đó.

Do đó, cần phải chia nhỏ một biểu mẫu nhất định cho nhiều yêu cầu trang đầy đủ.

Điều này có thể chứng minh là khó khăn, đặc biệt là kể từ trang đầu tiên của biểu mẫu sẽ POST đến /location/a, sẽ chuyển hướng đến /location/b và yêu cầu GET của khách hàng. Việc chuyển dữ liệu biểu mẫu được lưu trữ từ POST /location/a đến GET /location/b là nơi gặp khó khăn.

Erwin Vervaet, tác giả của Spring Web Flow (Một tiểu dự án của khung công tác Spring, được biết đến với khả năng tiêm phụ thuộc của nó) một khi đã viết a blog article thể hiện chức năng này trong khuôn khổ nói trên và so sánh nó với Khung Web nâng similar functionality. Sau đó, ông trình bày một thách thức đối với các khung công tác web khác, được mô tả chi tiết hơn trong a later article.

Yesod sẽ đối mặt với vấn đề này như thế nào, đặc biệt là xem xét tính chất dựa trên REST không trạng thái của nó?

Trả lời

3

Thứ nhất, chưa có giải pháp được tạo sẵn nào cho sự tồn tại này (ít nhất tôi biết ít nhất). Và tôi không quen với cách các khung công tác khác đề cập đến giải quyết vấn đề. Vì vậy, những gì tôi nói ở đây là khá nhiều phỏng đoán. Tôi khá chắc chắn nó sẽ làm việc, tuy nhiên.

Điểm mấu chốt của vấn đề ở đây là mã hóa các tham số POST của trang A thành yêu cầu GET cho trang B. Cách đơn giản nhất để làm điều đó là gắn các tham số POST của trang A vào biến phiên. Tuy nhiên, làm như vậy sẽ phá vỡ chuyển hướng khá kỹ lưỡng: quay lại/chuyển tiếp sẽ không hoạt động ở tất cả như mô tả.

Vì vậy, chúng tôi quay lại REST: chúng tôi cần mã hóa các tham số POST vào chính yêu cầu đó. Điều đó thực sự có nghĩa là đưa thông tin vào đường dẫn được yêu cầu hoặc chuỗi truy vấn. Và chuỗi truy vấn có thể có ý nghĩa nhất.

Tôi muốn quan tâm đến việc đưa các tham số POST thô vào chuỗi truy vấn, vì điều đó sẽ cho phép bất kỳ máy chủ proxy nào dễ dàng lấy nội dung. Vì vậy, tôi muốn tận dụng mật mã hiện có từ khách hàng. Nói cách khác, chúng tôi sẽ dán một phiên bản được mã hóa, đã ký tên của biểu mẫu gửi trước đó vào tham số chuỗi truy vấn.

Để làm cho nó cụ thể hơn một chút:

  • tài đi vào trang A qua GET.
  • Người dùng gửi trang A qua POST.
  • Máy chủ xác thực việc gửi biểu mẫu, nhận giá trị, tuần tự hóa, mã hóa/băm.
  • Người dùng được chuyển hướng đến trang B dưới dạng GET, với thông số chuỗi truy vấn chứa giá trị được mã hóa/băm từ trang A.
  • Tiếp tục quá trình này nhiều lần như mong muốn.
  • Trên trang cuối cùng, bạn có thể giải mã tham số chuỗi truy vấn và có tất cả các lần gửi biểu mẫu.

Dường như đây sẽ là gói tiện ích thú vị để viết nếu có ai quan tâm.

+1

Giải pháp này sẽ yêu cầu viết nhiều biểu mẫu "thủ công", một cho mỗi trang, đóng gói và bỏ gói các giá trị và gửi đi (ví dụ cho trường hợp người dùng ở trên trang 2, đã nhập nội dung trên Trang 1 và nhấn một liên kết ngược dựa trên HTML, liên kết 'GET/page1' phải bao gồm trạng thái biểu mẫu ** được cập nhật ** tốt hơn ** sans tham gia Javascript **). Không có nhiều ma thuật trong gói 'yesod-form', nơi có một hàm tạo' AForm' rõ ràng theo dõi các trang và phân tích cú pháp tham số, và một số phép thuật 'FormFooPage <#> R', giải pháp này có vẻ" không thể thực hiện được ". – dflemstr

+1

Nếu cần thiết, tất nhiên, tôi sẽ thực hiện việc triển khai này vì ý tưởng rất khả thi, nhưng Yesod sẽ không thể giúp tôi trong trường hợp đó, ngay cả khi kết xuất biểu mẫu. – dflemstr

+0

Tôi đã không thảo luận làm thế nào để tạo ra một API thân thiện, thân thiện với người dùng trong số này, chỉ cách thức các internals hoạt động. Tôi sẽ tưởng tượng rằng, ở mức độ cao, chúng tôi sẽ có thứ gì đó để bạn có thể cung cấp một loạt các biểu mẫu riêng lẻ mà bạn muốn chạy, và Yesod sẽ tự động xử lý việc lưu trữ sách cho bạn, cuối cùng cung cấp cho bạn một bộ kết quả. Đó chắc chắn là một câu hỏi thú vị, nhưng tôi nghĩ rằng danh sách gửi thư có thể tốt hơn cho việc băm nhỏ chi tiết hơn 600 nhận xét nhân vật :). –

Các vấn đề liên quan