Làm cách nào để sử dụng form_set_error () đúng cách?


8

Trong mô-đun Drupal 7 của tôi, tôi có một biểu mẫu và trình xử lý xác nhận của nó. Tôi gọi biểu mẫu của tôi từ một trường.tpl.php với print render(drupal_get_form('my_form')); nó hoạt động như mong đợi

Vấn đề là trong trường hợp giá trị đầu vào sai.

Nó yêu cầu hai lần gửi không chính xác trước khi hiển thị thông báo lỗi: Lần đầu tiên, có viền đỏ xung quanh đầu vào sai của tôi và lần thứ hai, thông báo lỗi được hiển thị (với viền đỏ).

Vì vậy, cách sử dụng form_set_error()đúng?


Không có drupal_set_error()chức năng. Bạn có chắc là bạn không cố ý form_set_error()?
kiamlaluno

Bạn đúng rồi! Ý tôi là form_set_error ()! Tôi cố gắng cập nhật bài viết đầu tiên.
druvik

Câu trả lời:


6

Trình tạo biểu mẫu không được gọi trong tệp mẫu, vì chúng được gọi quá muộn. Khi bạn đang gọi render(drupal_get_form('my_form')), mã hiển thị các thông báo lỗi đã được thực thi và các thông báo lỗi cuối cùng được báo cáo từ trình xử lý xác thực được lưu trong phiên hiện tại từ drupal_set_message () , được gọi từ form_set_error().

Mã để in thông báo lỗi nằm trong tệp page.tpl.php .

<?php if ($breadcrumb): ?>
  <div id="breadcrumb"><?php print $breadcrumb; ?></div>
<?php endif; ?>

<?php print $messages; ?>

Mã trong drupal_set_message()đó lưu các tin nhắn để hiển thị là mã sau đây:

  if ($message) {
    if (!isset($_SESSION['messages'][$type])) {
      $_SESSION['messages'][$type] = array();
    }

    if ($repeat || !in_array($message, $_SESSION['messages'][$type])) {
      $_SESSION['messages'][$type][] = $message;
    }

    // Mark this page as being uncacheable.
    drupal_page_is_cacheable(FALSE);
  }

Đồng ý. Tôi hiểu rằng sử dụng form_set_error()trong một tệp mẫu là sai cách. Vậy, cách nào là đúng?
druvik

1
drupal_get_form()không nên được gọi bên trong một tệp mẫu, mà bên trong một mô-đun.
kiamlaluno

Ok, tôi đã đặt nó trong một mô-đun và đã sử dụng Display Suite để hiển thị nó trong trang của mình. Cảm ơn.
druvik

Bạn nên đánh dấu đây là câu trả lời đúng nếu nó giúp bạn hiểu.
Malks

8

Thay vào đó, bạn nên nhìn vào form_set_error

nếu bạn có một yếu tố như thế này:

function my_custom_module_form() {
  $form = array();
  $form['my_element'] = array(
    '#type' => 'textfield',
    '#title' => 'My Text field',
    '#default_value' => 'Some default text.',
  );
  return $form;
}

trong hàm gọi lại xác thực của bạn làm điều này nếu bạn thấy rằng các giá trị $form_state['values']không hợp lệ

function my_custom_module_form_validate($form, &$form_state) {
  // Do some checking on $form_state['values'], if you don't like it.
  form_set_error('my_element', 'This is the error message that will be displayed.');
}

Trong thực tế, đó là chức năng tôi sử dụng. (Tôi sửa lỗi từ bài viết đầu tiên của tôi).
druvik

1

form_set_error()nên được gọi bên trong hook_validate()chức năng của bạn như được trả lời bởi LSU_JBob.


Một trình xử lý xác nhận không phải là một thực hiện hook_validate().
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.