2013-03-13 10 views
10

Drupal Commerceでチェックアウトフォームを編集しようとしています。ユーザーに電子メールアドレスを2回入力する必要があります。彼らがフォームを提出すると、Drupalは電子メールが一致するかどうかを確認し、一致しない場合はform_set_error()に電話する必要があります。今のところ、フォームにカスタム検証関数を追加しようとしていますが、これは動作しません。 (私のモジュールはcheckout_confirm_emailと呼ばれています。このモジュールは私たちのためだけですので、私はその名前に多大な努力を払っていませんでした)。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ステートメント出力Array ([0] => checkout_confirm_email_form_validate)。関数はフォーム配列の一部ですが、検証関数のdsm文は決して出力しません。

私は実際にしばらくの間立ち往生しています。私は例を探しましたが、私は何が間違っているのか分かりません。誰でも?

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

そして、それはそれは私の例では、あなたが検索するフォームツリーと同じ試合である必要はありません動作します:あなたはこのように送信ボタンをフォームに#validateプロパティを添付する必要が

答えて

12

この例を適用する

+0

これは '$の形であるべき[ '#を提出'] ['#validate '] [] '? – user151841

+0

#は要素の属性ではない#いいえ –

4

form_set_error()の代わりにform_error($ form、t( 'Error message。'))を使用します。

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

この目的のためにform_errorがform_set_errorより優れているのはなぜですか? – moopet

+0

はい、なぜですか?説明してください! – nerdoc

4

あなたは、列挙された検証が

  • date_validateになり、ここで https://api.drupal.org/api/drupal/includes!form.inc/7

    任意の検証機能を使用することができます - 無効な日付を防止するための日付タイプを検証し (例えば、2006年2月30日) 。

  • element_validate_integer - 整数要素の要素検証ハンドラ。
  • element_validate_integer_positive - 数要素のフォーム要素検証ハンドラ - フォーム要素の検証ハンドラ
  • element_validate_number正の整数でなければならない要素の
  • password_confirm_validate - password_confirm要素を検証します。

使い方

$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

の例私は、この行に変更:これに

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

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

をそして、それは作品です!あなたは

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

exemple drupalのAPIから関数_form_validateを使用することができます

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

は、次のコードを使用し

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.')); 
    } 
} 
2

+0

この場合、$ form ['submit'] ['validate'] []?を設定する必要がありますか? – sheldonkreger

+0

@sheldonkregerいいえ、form_validateはフックです。何を言っているのは、フォーム検証イベントで呼び出されるカスタムコールバック関数を定義することです – Matoeil

関連する問題