2010-03-04 29 views
13

Tôi đang cố sửa đổi một số mã biểu mẫu Drupal 6 và kết hợp một số xác thực biểu mẫu gốc. Mã trông như thế này, nhưng xác thực không hoạt động. Tôi thậm chí không bao giờ nhận được vào function thisFormName_form_validate. Bất kỳ Drupalians có một số ý tưởng tốt?Xác thực biểu mẫu Drupal không hoạt động đối với tôi

function thisFormName_form_alter(&$form, $form_state, $form_id) { 
    $form['email_address'] = array(
    '#type' => 'textfield', 
    '#title' => t('Enter your email address (optional)'), 
    '#default_value' => $object['email_address'], 
    '#weight' => 4, 
    '#size' => 60, 
    '#maxlength' => 128, 
    '#description' => t('Enter email address.'), 
); 


function thisFormName_form_validate($node, &$form) { 
    if ($form_state['values']['email_address'] == '') 
    { 
    form_set_error('', t('Email must be valid format if entered.')); 

    } 
} 

Trả lời

13

Vì bạn đang sử dụng hình thức thay đổi, do đó bạn không tạo ra các hình thức cho mình, bạn nên thêm các xử lý xác nhận bản thân:

function myModule_form_alter(&$form, $form_state, $form_id) { 
    $form['email_address'] = array(
    '#type' => 'textfield', 
    '#title' => t('Enter your email address (optional)'), 
    '#default_value' => $object['email_address'], 
    '#weight' => 4, 
    '#size' => 60, 
    '#maxlength' => 128, 
    '#description' => t('Enter email address.'), 
); 
    $form['#validate'][] = 'my_validation_function'; 
} 


function my_validation_function(&$form, &$form_state) { 
    if ($form_state['values']['email_address'] == '') { 
    form_set_error('', t('Email must be valid format if entered.')); 
    } 
} 

Drupal sẽ chỉ theo mặc định sử dụng xác nhận được định nghĩa là form_name + _validate. Đây không phải là trường hợp vì bạn đang sử dụng hook_form_alter.

+3

+1 - Không nhận thấy bạn đã trả lời này - xin lỗi vì đăng tải dự phòng của câu trả lời tương tự. –

5

EDIT: Về cơ bản, câu trả lời giống với googletorps. Đã không nhận thấy anh ấy trong khi đăng tải của tôi. Để lại nó ở đây cho lời giải thích thay thế, nhưng anh ấy là đúng và là người đầu tiên (+1).


Có gì đó tanh về chức năng đặt tên của bạn:

  • Như với tất cả triển khai móc, chức năng hook_form_alter của bạn nên được đặt theo tên của mô-đun tùy chỉnh của bạn, chứ không phải sau khi các hình thức (ví dụ yourModule_form_alter), trong trường hợp nào nó sẽ kích hoạt cho tất cả các hình thức. Nếu (có vẻ như), bạn chỉ muốn móc vào một biểu mẫu cụ thể, sử dụng hook_form_FORM_ID_alter, thay thế 'móc' bằng tên mô đun của bạn và 'FORM_ID' bằng id (tên) của biểu mẫu bạn muốn thao tác.

  • Lệnh gọi lại hàm xác thực cho biểu mẫu được liệt kê dưới dạng một mảng tên hàm trong $form['#validate']. Đó chỉ là lối tắt tiện lợi cho các hình thức do chính bạn tạo mà bạn không rõ ràng phải thêm vào đó, nhưng sử dụng một hàm được đặt tên sau biểu mẫu, thêm '_validate' ở cuối. Trong trường hợp của bạn, bạn đang thay đổi một biểu mẫu đến từ một mô-đun khác, vì vậy bạn cần phải thêm hàm xác nhận một cách rõ ràng.

Vì vậy, mã của bạn sẽ giống như thế này:

function yourModuleName_theFormID_form_alter(&$form, $form_state, $form_id) { 
    $form['email_address'] = array(
    '#type' => 'textfield', 
    '#title' => t('Enter your email address (optional)'), 
    '#default_value' => $object['email_address'], 
    '#weight' => 4, 
    '#size' => 60, 
    '#maxlength' => 128, 
    '#description' => t('Enter email address.'), 
); 
    // Add custom validation callback 
    $form['#validate'][] = 'yourModuleName_theFormID_validate'; 


function yourModuleName_theFormID_validate(&$form, &$form_state) { 
    if ($form_state['values']['email_address'] == '') { 
    form_set_error('', t('Email must be valid format if entered.')); 
    } 
} 
Các vấn đề liên quan