Tôi đang gặp phải một tình huống mà tôi hy vọng ai đó sẽ có thể đưa ra một số lời khuyên và hướng dẫn vì cách tiếp cận của tôi hiện không hiệu quả.
Chúng tôi đang xây dựng biểu mẫu web chứa trường địa chỉ email. Khi người dùng điền vào trường này, chúng tôi sẽ lấy địa chỉ email của họ và thực hiện tra cứu tài khoản trong chức năng validateForm của trình xử lý biểu mẫu web tùy chỉnh của chúng tôi.Việc gửi biểu mẫu không được lưu trong cơ sở dữ liệu của chúng tôi.
Nếu người dùng có tài khoản được liên kết với địa chỉ email được cung cấp, chúng tôi sẽ lấy kết quả và cập nhật số trường trong $webform_submission như sau:
chức năng công khai validateForm(mảng &$form, FormStateInterface $form_state, WebformSubmissionInterface $webform_submission) {
// Lấy địa chỉ email
$email_address = !empty($form_state->getValue('user_email')) ? Html::escape($form_state->getValue('user_email')) : NULL;
nếu (isset($email_address)) {
// Lấy bản ghi liên hệ được liên kết với email
$contact_record_obj = Tiện ích::getContactObjFromEmailAddress($email_address);
if(isset($contact_record_obj)) {
// Cập nhật dữ liệu $webform_submission
$webform_submission->setElementData("first_name", $contact_record_obj->firstName);
$webform_submission->setElementData("last_name", $contact_record_obj->lastName);
$webform_submission->setElementData("business_phone", $contact_record_obj->businessPhone);
// Lưu dữ liệu $webform_submission?
$webform_submission->save();
}
}
}
Tôi đã đặt các điểm ngắt trên mỗi dòng nơi setElementData đang được gọi và tôi có thể thấy rằng mảng dữ liệu trong $webform_submission đang được cập nhật với thông tin được truy lục để tra cứu email.
Sau đó, tôi đã đặt các điểm dừng vào hàm submitForm để kiểm tra xem $webform_submission có được chuyển đến hàm đó hay không và tôi nhận thấy rằng tất cả dữ liệu được đặt trong hàm validateForm đã bị xóa.
hàm công khai submitForm(mảng &$form, FormStateInterface $form_state, WebformSubmissionInterface $webform_submission) {
// Lấy dữ liệu $webform_submission.
$form_submission_data = $webform_submission->getData();
}
Số lượng các câu hỏi
Tại sao các giá trị trong $webform_submission được đặt lại giữa các lệnh gọi hàm validateForm và submitForm?
ValidForm có phải là nơi chính xác để cập nhật các giá trị của trường biểu mẫu không?
alterForm có vẻ như là một nơi hợp lý hơn để cập nhật/thay đổi giá trị trường biểu mẫu nhưng tôi không chắc làm cách nào để chặn lệnh gọi alterForm được thực hiện bất cứ khi nào tôi chỉnh sửa biểu mẫu web khi đăng nhập vào Drupal.
Bất kỳ trợ giúp hoặc đề xuất sẽ được đánh giá cao.