2013-03-13 63 views
10

Tôi đang cố chỉnh sửa biểu mẫu thanh toán trong Drupal Commerce, để yêu cầu người dùng nhập địa chỉ email của họ hai lần. Khi họ gửi biểu mẫu của họ, Drupal nên kiểm tra xem liệu các email đó có khớp không và gọi số form_set_error() nếu không. Hiện tại, tôi chỉ đang cố gắng đính kèm một chức năng xác nhận tùy chỉnh vào biểu mẫu mà tôi không thể làm việc được. (Module của tôi được gọi là checkout_confirm_email. Module này chỉ dành riêng cho việc sử dụng của chúng tôi, vì vậy tôi không đặt nhiều nỗ lực vào tên).Cách sử dụng xác thực biểu mẫu trong Drupal 7

function checkout_confirm_email_form_alter(&$form, &$form_state, $form_id) { 
if($form_id == 'commerce_checkout_form_checkout') { 
    $form['#validate'][] = 'checkout_confirm_email_form_validate'; 
    dprint_r($form['#validate']); 
    dsm("I printed"); 
} 
} 

function checkout_confirm_email_form_validate($form, &$form_state) {  
    dsm("Never prints..."); 
} 

dprint_r đầu ra statment Array ([0] => checkout_confirm_email_form_validate). Vì vậy hàm này là một phần của mảng biểu mẫu, nhưng câu lệnh dsm trong hàm xác nhận không bao giờ in.

Tôi đã thực sự bị kẹt trong một thời gian. Tôi đã tra cứu các ví dụ, và tôi không thể nhìn thấy những gì tôi đang làm sai. Bất kỳ ai?

Trả lời

12

Bạn cần phải đính kèm các tài sản #validate mẫu nút gửi như thế này:

$form['submit']['#validate'][] = 'checkout_confirm_email_form_validate' 

Và nó sẽ làm việc sau đó nó không cần thiết mà ví dụ của tôi là trận đấu giống cây hình thức của bạn, bạn nên tìm kiếm mảng nút gửi và áp dụng ví dụ này cho nó

+0

này nên được '$ form [ '# nộp '] [' # validate '] [] '? – user151841

+0

Không # là cho thuộc tính không cho các yếu tố –

4

Thay vì form_set_error() tôi sẽ sử dụng form_error ($ form, t ('Thông báo lỗi'));

function checkout_confirm_email_form_alter(&$form, &$form_state, $form_id) { 
    if($form_id == 'commerce_checkout_form_checkout') { 
    $form['#validate'][] = 'checkout_confirm_email_form_validate'; 
    dpm($form['#validate']); 
    dsm("I printed"); 
    } 
} 

function checkout_confirm_email_form_validate(&$form, &$form_state) { 
    // Not sure the exact email field 
    if(empty($form['submitted']['mail']['#value'])){ 
    dsm("Should see me now and return to the form for re-submission."); 
    form_error($form, t('Username or email address already in use.')); 
    } 
} 
+0

Tại sao form_error tốt hơn form_set_error cho mục đích này? – moopet

+0

Có, tại sao? Vui lòng giải thích! – nerdoc

4

Bạn có thể sử dụng bất kỳ chức năng validate đây https://api.drupal.org/api/drupal/includes!form.inc/7

Các kiểm chứng thực được liệt kê sẽ

  • date_validate - Xác nhận loại ngày để ngăn chặn ngày không hợp lệ (ví dụ, 30 tháng 2 năm 2006) .
  • element_validate_integer -Phần tử xử lý xác thực phần tử cho yếu tố nguyên.
  • element_validate_integer_positive - Mẫu yếu tố xử lý xác nhận
    cho các yếu tố nguyên mà phải là số dương
  • element_validate_number - Mẫu yếu tố xác nhận handler cho yếu tố số.
  • password_confirm_validate - Xác thực phần tử password_confirm.

Ex của việc sử dụng

$form['my_number_field'] = array(
    '#type' => 'textfield', 
    '#title' => t('Number'), 
    '#default_value' => 0, 
    '#size' => 20, 
    '#maxlength' => 128, 
    '#required' => TRUE, 
    '#element_validate' => array('element_validate_number') 
); 
2

tôi đã thay đổi dòng này:

$form['submit']['#validate'][] = 'checkout_confirm_email_form_validate' 

này:

$form['actions']['submit']['#validate'][] = 'checkout_confirm_email_form_validate'; 

Và đó là công trình!

-1

Sử dụng đoạn mã sau:

$form['submit']['#validate'][] = 'checkout_confirm_email_form_validate' 
2

bạn có thể sử dụng chức năng _form_validate từ API drupal

https://api.drupal.org/api/drupal/includes!form.inc/function/_form_validate/7 

dụ:

function my_form_form($form, &$form_state) { 
     //code to generate the form 
} 


function my_form_form_validate($form, &$form_state) { 
    //use of API function valid_email_adress 
    if ((valid_email_address($form_state['values']['field_candid_email']))===false) 
     form_set_error('field_candid_email', t('Le champ courriel est invalide.'));  

    if (!(is_numeric($form_state ['values'] ['field_candid_montant']))) {  
     form_set_error('field_candid_montant', t('Le champ montant demandé doivent être de type numérique.')); 
    } 
} 
+0

Trong trường hợp này, bạn cần phải đặt: $ form ['submit'] ['validate'] []? – sheldonkreger

+0

@sheldonkreger no, form_validate là một hook. những gì bạn đang đề cập đến là định nghĩa một hàm gọi lại tùy chỉnh để được gọi tại sự kiện xác nhận biểu mẫu – Matoeil

Các vấn đề liên quan