11

Drupal Commerceのチェックアウトフォームを編集して、ユーザーにメールアドレスを2回入力するように要求しようとしています。フォームを送信するとき、Drupalはメールが一致するかどうかを確認し、一致form_set_error()しない場合は電話をかける必要があります。今のところ、カスタム検証関数をフォームにアタッチしようとしていますが、これは機能しません。(私のモジュールはcheckout_confirm_emailと呼ばれます。このモジュールは私たち自身が使用するためだけのものなので、名前にはあまり力を入れていません)。

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ステートメントは出力されません。

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

4

6 に答える 6

13

次のように、#validateプロパティをフォーム送信ボタンに添付する必要があります。

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

そしてそれはうまくいくでしょう、そして私の例があなたのフォームツリーと完全に一致する必要はありませんあなたは送信ボタン配列を検索してそれにこの例を適用するべきです

于 2013-03-13T02:02:33.123 に答える
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.'));
  }
}
于 2013-05-28T02:38:32.717 に答える
4

ここで任意の検証関数を使用できます https://api.drupal.org/api/drupal/includes!form.inc/7

リストされた検証は次のようになります

  • date_validate-日付タイプを検証して、無効な日付を防止します(たとえば、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')
 ); 
于 2013-08-23T05:37:50.237 に答える
3

drupalAPIの関数_form_validateを使用できます

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

例:

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.'));
    }
}
于 2015-04-01T10:10:37.920 に答える
2

私はこの行を変更しました:

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

これに:

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

そしてそれはうまくいきます!

于 2013-09-09T14:41:12.390 に答える
-1

次のコードを使用します。

$form['submit']['#validate'][] = 'checkout_confirm_email_form_validate'
于 2014-04-15T12:48:44.697 に答える