Điểm:0

Ném lỗi cho trường bắt buộc trong hook_form_alter?

lá cờ cn

Tôi có một loại nút có thể được tạo bởi người dùng được xác thực. Trong biểu mẫu tạo nút, tôi đã thêm hộp kiểm điều khoản dịch vụ thông qua móc biểu mẫu như sau:

function themename_form_alter(&$form, &$form_state, $form_id) {
  if ($form_id == 'node_nodetype_form') {
    $form['field_tos_accept'] = mảng(
      '#type' => 'hộp kiểm',
      '#title' => t('Tôi đồng ý với điều khoản dịch vụ.'),
      '#cân nặng' => '999',
      '#required' => ĐÚNG,
    );
  }
}

Điều này mang lại cho tôi khả năng có hộp kiểm này trong biểu mẫu tạo nút, nhưng không phải ở biểu mẫu chỉnh sửa nút vì nó không cần thiết ở đó. Khi tôi thêm

'#required_error' => t('Vui lòng chấp nhận điều khoản dịch vụ.'), 

Điều này - theo cách hiểu của tôi - sẽ đưa ra thông báo lỗi khi biểu mẫu được gửi. Nhưng thay vào đó, trạng thái bắt buộc của trường ngăn không cho biểu mẫu được gửi. Vì vậy, cũng không có thông báo lỗi nào được đưa ra.

Có cách nào để đặt cái này trong form_alter không? Hay tôi chỉ nên xác thực trạng thái hộp kiểm qua JS? Điều gì sẽ được coi là thực hành tốt nhất? Cảm ơn bạn rất nhiều trước!

apaderno avatar
lá cờ us
`#required_error` là lỗi hiển thị khi biểu mẫu được xác thực và thành phần biểu mẫu là bắt buộc, nhưng người dùng không nhập bất kỳ giá trị nào. `#required` được dùng để chỉ người dùng phải nhập giá trị cho phần tử biểu mẫu đó. Không ai trong số họ ngăn chặn các hình thức được gửi. Miễn là người dùng cung cấp một giá trị cho phần tử biểu mẫu đó, biểu mẫu sẽ được gửi.
apaderno avatar
lá cờ us
Ngoài ra, nếu bạn chỉ thêm hộp kiểm khi nút được tạo chứ không phải khi nút được chỉnh sửa, thì bạn đang sử dụng nhiều mã hơn so với câu hỏi đang hiển thị.
Berry Dingle avatar
lá cờ cn
@apaderno Tôi chỉ sử dụng đoạn mã trên trong tệp themename.theme của mình. Nhưng vì tôi nối vào dạng nút-nút-type chứ không phải vào dạng nút-nút-chỉnh sửa, nên nó chỉ được hiển thị trong biểu mẫu thêm/tạo nút chứ không phải trong biểu mẫu chỉnh sửa. Bạn nói đúng về việc nộp bài. Trạng thái bắt buộc không ngăn việc gửi biểu mẫu, nhưng kích hoạt xác thực trường HTML5 mặc định mà tôi không thấy vì tôi đã tạo một nút chuyển đổi từ đầu vào hộp kiểm mặc định. Đoán tôi sẽ làm điều đó trong JS và đưa ra lỗi khi nhấp vào nút gửi, nhưng hộp kiểm không được chọn.
apaderno avatar
lá cờ us
Biểu mẫu để chỉnh sửa một nút là cùng một biểu mẫu được sử dụng để tạo nó, biểu mẫu được triển khai bởi lớp `Drupal\node\NodeForm`. Nếu bạn chỉ muốn thêm một phần tử biểu mẫu khi nút được tạo, bạn nên thêm mã tương tự như mã sau: `$node = $form_state->getFormObject()->getEntity(); if ($node && $node->isNew()) { /* Nút đang được tạo. */ }`
Điểm:1
lá cờ cn

Có cách nào để đặt cái này trong form_alter không? Hay tôi chỉ nên xác thực trạng thái hộp kiểm qua JS?

bạn có thể thay thế #cần thiết bằng cách đặt trình xử lý xác thực tùy chỉnh trong móc thay đổi biểu mẫu, nếu bạn muốn tạo thông báo lỗi phía máy chủ:

$form_state->setErrorByName('field_tos_accept', $error_message);

Khi tôi thêm '#required_error', điều này - theo hiểu biết của tôi - sẽ đưa ra thông báo lỗi khi biểu mẫu được gửi.

#required_error' được giới thiệu vào năm 2011, nhưng khi Drupal 8 được phát hành, nó dường như đã ngừng hoạt động trong các trình duyệt hỗ trợ xác thực biểu mẫu HTML5 và vì vậy nó chưa bao giờ thực sự được chấp nhận.

Tuy nhiên, bạn có thể sử dụng thuộc tính biểu mẫu HTML5 hợp thức hóa để tắt xác thực biểu mẫu phía máy khách, thì thuộc tính này hoạt động trở lại và bạn nhận được thông báo lỗi tùy chỉnh mà không có trình xử lý xác thực tùy chỉnh:

function themename_form_alter(&$form, &$form_state, $form_id) {
  // đối với các biểu mẫu thực thể $form_id bao gồm
  // ENTITY_TYPE_BUNDLE_FORM_MODE_form
  // GÓI chỉ khi thực thể có gói
  // FORM_MODE chỉ khi không mặc định
  // Ví dụ:
  // node_article_edit_form - biểu mẫu chỉnh sửa nút cho loại nội dung bài viết
  // node_page_form - node tạo form cho trang kiểu nội dung
  // các nút sử dụng để tạo biểu mẫu chế độ biểu mẫu mặc định
  if ($form_id == 'node_nodetype_form') {
    $form['#attributes']['novalidate'] = 'novalidate';
    $form['field_tos_accept'] = [
      '#type' => 'hộp kiểm',
      '#title' => t('Tôi đồng ý với điều khoản dịch vụ.'),
      '#cân nặng' => '999',
      '#required' => ĐÚNG,
      '#required_error' => t('Vui lòng chấp nhận điều khoản dịch vụ.'), 
    ];
  }
}

Nhìn thấy https://developer.mozilla.org/en-US/docs/Web/HTML/Element/form#attr-novalidate

Berry Dingle avatar
lá cờ cn
Ồ, cảm ơn bạn rất nhiều! Đây chính xác là những gì tôi đang tìm kiếm và nó hoạt động như mong muốn. Một lần nữa, cảm ơn bạn rất nhiều!

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.