$ Form_state được sử dụng để làm gì?


33

Điều gì $form_statethường được sử dụng cho ngữ cảnh của API biểu mẫu nếu nó được sử dụng làm đối số?

Cụ thể, tôi đang tìm một ví dụ về thời điểm nó được sử dụng.

Câu trả lời:


48

$form_statelà một trong những đối số được truyền cho trình xử lý biểu mẫu hoặc trình xử lý xác thực mẫu; Cách sử dụng chính của nó là truy xuất các giá trị được nhập từ người dùng dưới dạng xem nội dung của $form_state['values']), nhưng nó chứa các giá trị khác có thể được sử dụng cho các mục đích khác.
Tài liệu cho drupal_build_form () chứa danh sách các giá trị khác có trong mảng đó, bao gồm các giá trị sau:

  • xây dựng lại: Thông thường, sau khi hoàn tất quá trình xử lý biểu mẫu và trình xử lý trình gửi đã chạy, một biểu mẫu được coi là hoàn thành và drupal_redirect_form () sẽ chuyển hướng người dùng đến một trang mới bằng cách sử dụng yêu cầu GET (do đó, làm mới trình duyệt không gửi lại hình thức). Tuy nhiên, nếu 'xây dựng lại' đã được đặt thành TRUE, thì một bản sao mới của biểu mẫu sẽ ngay lập tức được tạo và gửi đến trình duyệt, thay vì chuyển hướng. Điều này được sử dụng cho các hình thức nhiều bước, chẳng hạn như trình hướng dẫn và biểu mẫu xác nhận. Thông thường, $form_state['rebuild']được thiết lập bởi một trình xử lý đệ trình, vì nó thường là logic trong trình xử lý đệ trình xác định xem một biểu mẫu được thực hiện hay yêu cầu một bước khác. Tuy nhiên, trình xử lý xác thực có thể đã được đặt $form_state['rebuild']để khiến quá trình xử lý biểu mẫu bỏ qua trình xử lý gửi và thay vào đó xây dựng lại biểu mẫu, ngay cả khi không có lỗi xác thực.
  • redirect: Được sử dụng để chuyển hướng các hình thức trên trình. Nó có thể là một chuỗi chứa URL đích hoặc một mảng các đối số tương thích với drupal_goto(). Xem drupal_redirect_form()để biết thông tin đầy đủ.
  • bộ đệm: Nếu được đặt TRUEthành cấu trúc biểu mẫu gốc, chưa xử lý sẽ được lưu vào bộ đệm, cho phép toàn bộ biểu mẫu được xây dựng lại từ bộ đệm. Một quy trình công việc biểu mẫu điển hình liên quan đến hai yêu cầu trang; đầu tiên, một biểu mẫu được xây dựng và hiển thị để người dùng điền vào. Sau đó, người dùng điền vào biểu mẫu và gửi nó, kích hoạt một yêu cầu trang thứ hai trong đó biểu mẫu phải được xây dựng và xử lý. Theo mặc định $form$form_stateđược xây dựng từ đầu trong mỗi yêu cầu trang này. Thông thường, cần thiết hoặc mong muốn duy trì các biến $form$form_statebiến từ yêu cầu trang ban đầu đến yêu cầu xử lý đệ trình. 'bộ đệm' có thể được đặt thành TRUE để thực hiện việc này. Một ví dụ nổi bật là một biểu mẫu hỗ trợ Ajax, trong đóajax_process_form()cho phép bộ đệm ẩn biểu mẫu cho tất cả các biểu mẫu có chứa một phần tử với thuộc tính #ajax. (Trình xử lý Ajax không có cách nào để tự xây dựng biểu mẫu, do đó phải dựa vào phiên bản được lưu trong bộ nhớ cache.) Lưu ý rằng sự tồn tại $form$form_statetự động xảy ra đối với các biểu mẫu (nhiều bước) có đặt cờ 'xây dựng lại', bất kể giá trị cho 'bộ nhớ cache'.
  • lưu trữ: $form_state['storage']không phải là một khóa đặc biệt và không có hỗ trợ cụ thể nào được cung cấp cho nó trong API biểu mẫu. Theo truyền thống, đó là vị trí lưu trữ dữ liệu dành riêng cho ứng dụng để liên lạc giữa các chức năng trình, xác thực và trình tạo biểu mẫu, đặc biệt là ở dạng nhiều bước. Việc triển khai biểu mẫu có thể sử dụng bất kỳ (các) khóa nào trong $form_state(ngoài các khóa được liệt kê ở đây và các khóa được bảo lưu khác được sử dụng bởi nội bộ API của Mẫu) cho loại lưu trữ này. Cách được đề xuất để đảm bảo rằng khóa được chọn không xung đột với khóa được sử dụng bởi API mẫu hoặc các mô-đun khác là sử dụng tên mô-đun làm tên khóa hoặc tiền tố cho tên khóa. Ví dụ, mô-đun Node sử dụng$form_state['node'] trong các hình thức chỉnh sửa nút để lưu trữ thông tin về nút đang được chỉnh sửa và thông tin này vẫn có sẵn trên các lần nhấp liên tiếp của nút "Xem trước" cũng như khi nút "Lưu" cuối cùng được nhấp.

Các hàm khác nhận $form_statelàm đối số là hook_form_alter ()hook_form_FORM_ID_alter () .

Ví dụ về mã sử dụng đối số đó, bạn có thể xem bình luận_form_submit () , chứa mã sau:

function comment_form_submit($form, &$form_state) {
  $node = node_load($form_state['values']['nid']);
  $comment = comment_form_submit_build_comment($form, $form_state);
  if (user_access('post comments') && (user_access('administer comments') || $node->comment == COMMENT_NODE_OPEN)) {
    // Save the anonymous user information to a cookie for reuse.
    if (user_is_anonymous()) {
      user_cookie_save(array_intersect_key($form_state['values'], array_flip(array('name', 'mail', 'homepage'))));
    }

    comment_save($comment);
    $form_state['values']['cid'] = $comment->cid;

    // Add an entry to the watchdog log.
    watchdog('content', 'Comment posted: %subject.', array('%subject' => $comment->subject), WATCHDOG_NOTICE, l(t('view'), 'comment/' . $comment->cid, array('fragment' => 'comment-' . $comment->cid)));

    // Explain the approval queue if necessary.
    if ($comment->status == COMMENT_NOT_PUBLISHED) {
      if (!user_access('administer comments')) {
        drupal_set_message(t('Your comment has been queued for review by site administrators and will be published after approval.'));
      }
    }
    else {
      drupal_set_message(t('Your comment has been posted.'));
    }
    $query = array();
    // Find the current display page for this comment.
    $page = comment_get_display_page($comment->cid, $node->type);
    if ($page > 0) {
      $query['page'] = $page;
    }
    // Redirect to the newly posted comment.
    $redirect = array('node/' . $node->nid, array(
        'query' => $query,
        'fragment' => 'comment-' . $comment->cid,
      ));
  }
  else {
    watchdog('content', 'Comment: unauthorized comment submitted or comment submitted to a closed post %subject.', array('%subject' => $comment->subject), WATCHDOG_WARNING);
    drupal_set_message(t('Comment: unauthorized comment submitted or comment submitted to a closed post %subject.', array('%subject' => $comment->subject)), 'error');
    // Redirect the user to the node they are commenting on.
    $redirect = 'node/' . $node->nid;
  }
  $form_state['redirect'] = $redirect;
  // Clear the block and page caches so that anonymous users see the comment
  // they have posted.
  cache_clear_all();
}

Để hiểu những gì $form_state['values']chứa, bạn cần xem các giá trị được thêm vào $formtrong comment_form () . Ví dụ, $form_statechứa $form_state['values']['name']$formchứa $form['author']['name']. Nói chung, nếu $form['field']là một trường biểu mẫu, thì $form_statesẽ chứa $form_state['values']['field'].


Nếu chúng tôi muốn thay đổi giá trị biểu mẫu hoặc vô hiệu hóa các nút trường đa trị bằng hook_form_alter, biến nào sẽ được thay đổi $ form hoặc $ from_state? (Khi được triển khai bằng AJAX hoặc không có AJAX). $ Form_state có được sử dụng cụ thể cho ajax không?
kiranking

1
@kiranking Thông thường, một cuộc gọi lại AJAX trả về một phần của $formmảng; đó là trình xây dựng biểu mẫu kiểm tra nội dung của $form_state. Đây là những gì tôi thấy trong tất cả các cuộc gọi lại AJAX được thực hiện bởi các mô-đun thực hiện đúng.
kiamlaluno
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.