2010-10-06 17 views
7

Tôi có một mẫu đặt phòng được xây dựng bằng cách sử dụng các tùy chọn được truy xuất qua API của bên thứ ba và do cần phải cập nhật thông tin, kết quả từ API không thể được lưu trong bộ nhớ cache (ít nhất là không lâu).Tôi có thể ngừng Drupal tạo lại biểu mẫu khi được gửi không?

Sự cố tôi gặp phải là tôi đã nhận thấy khi biểu mẫu được gửi Drupal đang gọi lại hàm _form của tôi đang kích hoạt lại các cuộc gọi API và tôi muốn ngừng thực hiện việc đó để thử và giảm số lượng cuộc gọi API được thực hiện. Rõ ràng nếu việc xác nhận không thành công, nó cần phải vẽ lại biểu mẫu và các cuộc gọi API sẽ cần phải được thực hiện lại nhưng tôi tự hỏi liệu có cách nào để ngăn chặn nó thực hiện điều này khi biểu mẫu xác nhận để tôi có thể dừng nó hay không. thực hiện nhiều cuộc gọi không cần thiết tới API.

Cảm ơn bạn đã được trợ giúp.

Trả lời

3

Bạn có thể lưu trữ/lưu trữ giá trị trả về từ API trong $ form_state ['storage'] hay không, vì vậy ít nhất nếu _form được gọi mỗi khi bạn có thể kiểm tra bộ nhớ trước khi thực hiện lại cuộc gọi API.

+1

+1 - Tôi đã đăng một câu trả lời khác với chi tiết hơn một chút, nhưng đây là cách tiếp cận đúng cho vấn đề. –

0

Điều đầu tiên, nếu xác thực không thành công, Drupal có một bản sao của biểu mẫu, vì vậy chức năng biểu mẫu của bạn sẽ không thực sự được gọi.

Bây giờ đến giải pháp.

  • Bạn có thể chuyển hướng đến một trang mới trong gửi biểu mẫu của bạn, hãy tránh việc thu hồi biểu mẫu.
  • Thay vì gọi trực tiếp biểu mẫu của bạn trong định nghĩa menu của bạn, hãy thực hiện cuộc gọi lại gọi biểu mẫu. Sau đó bạn có thể kiểm tra xem biểu mẫu đã được gửi hay chưa và chỉ gọi chức năng biểu mẫu của bạn khi cần.

Nếu bạn lo lắng về các cuộc gọi API, bạn cũng có thể lưu vào bộ nhớ cache trong 5-10 phút để làm cho hai đề xuất của tôi trở nên lỗi thời.

4

Bạn không thể tránh việc tạo lại biểu mẫu, nếu biểu mẫu được xử lý bởi Drupal. Nó là một phần trung tâm của Drupals form processing workflow: Mọi hình thức là ít nhất là xây dựng hai lần, một lần cho đầu ra ban đầu và ít nhất một lần nữa khi bài đăng từ khách hàng đến. Nó thậm chí có thể nhiều hơn thế, tùy thuộc vào những gì biểu mẫu sau đó, ví dụ khi tái xuất hiện khi có bất kỳ lỗi xác nhận nào xảy ra (Thông thường một phiên bản được lưu vào bộ nhớ cache sẽ được sử dụng bởi lúc đó, nhưng điều đó phụ thuộc vào biểu mẫu cụ thể).

Những gì bạn cần làm là làm theo lời đề nghị của Simons - trong lần gọi đầu tiên đến chức năng trình tạo biểu mẫu của bạn, thực hiện cuộc gọi API của bạn và lưu trữ kết quả trong $form_state['storage']['yourIdentifier'] ('yourIdentifier' là một số chuỗi không được xử lý biểu mẫu chuẩn) tên mô-đun của bạn). Trên mọi cuộc gọi đến chức năng trình tạo biểu mẫu của bạn, bạn kiểm tra xem kết quả đó đã có trong $form_state['storage'] hay không. Nếu có, bạn chỉ cần sử dụng chúng, bỏ qua các cuộc gọi API.

Điều này sẽ tránh các cuộc gọi API trùng lặp và cho phép bạn kiểm soát nhiều hơn cách/thời điểm thực hiện (ví dụ: bạn cũng có thể xóa kết quả trong quá trình xác thực, nếu điều kiện đặc biệt yêu cầu tìm nạp lại từ API bên ngoài).

+0

Cảm ơn bạn đã phản hồi, tôi đã thực hiện công việc này nhưng có một chút rắc rối. Tôi đang đặt $ form_state trong chức năng biểu mẫu của tôi nhưng khi tôi gửi biểu mẫu, nó luôn trả về giá trị rỗng. Có bất kỳ ví dụ nào ở đây giải thích cách hoạt động này chi tiết hơn không? Tôi đã xem xét những cái trên trang web Drupal nhưng chúng không hữu ích – pogo

+0

@pogo: Thật khó để nói những gì sai mà không thấy chức năng tạo biểu mẫu của bạn, nhưng một lỗi phổ biến là sử dụng chữ ký hàm sai (http://drupal.org/node/794694#comment-2949122). Có lẽ bạn có thể chỉnh sửa câu hỏi của mình để chứa mã bạn sử dụng cho đến thời điểm này? –

0

Drupal không thể thực hiện việc này? "Không thể" không có trong từ vựng của tôi!

Tôi đã gặp vấn đề tương tự, nhưng tôi không thể để nó đánh bại tôi.Đây là cách tôi đã vượt qua nó:

Trong hình thức xử lý, sau khi tôi chèn các chi tiết vào cơ sở dữ liệu (hoặc email hoặc bất cứ điều gì), tôi đặt 2 thông điệp tình trạng drupal như thế này

function process_form($form){ 
    $success = do_email($form); 
    if ($success){ 
    drupal_set_message("Success"); 
    drupal_set_message("Your form worked!"); 
    } 
} 

Và theo hình thức máy phát điện tôi đọc và xóa các tin nhắn, xóa hình thức và đầu ra thông báo trạng thái như đánh dấu:

function form_generator($form_state,$parameters){ 
    $form = array(); 
    ...// This is where I make the regular form 
    $messages = drupal_get_messages(); // this gets the messages and clears them 
    if (isset($messages["status"])){ 
    if (isset($messages['status'][0]) && isset($messages['status'][1])){ 
     if ($messages['status'][0]=="Success"){ 
     $form = array(); // This clears the form I've just made 
     $form['final_message']= array(
      '#type' => 'markup', 
      '#markup' => $messages['status'][1], 
     ); 
     } 
    } 
    } 
} 

này không xóa hình thức lần đầu tiên nó được hiển thị do $ thông điệp không được thiết lập và khi bạn gặp phải xác nhận lỗi họ vẫn sẽ xuất hiện.

Thanh ma thuật Drupal theo cách của chúng tôi, nhưng ý chí của trình coder PHP mạnh hơn.

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