web-dev-qa-db-ja.com

Drupal 7でフォーム検証を使用する方法

Drupal Commerceでチェックアウトフォームを編集して、ユーザーにメールアドレスを2回入力するように要求しようとしています。フォームを送信するとき、Drupalはチェックする必要がありますメールが一致するかどうかを確認し、一致しない場合はform_set_error()を呼び出します。今のところ、フォームにカスタム検証関数を添付しようとしていますが、これは機能しません。(My Myモジュールは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ステートメントは出力されません。

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

11
c.altosax

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

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

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

13

ここで任意の検証関数を使用できます 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')
 ); 
4
nmeegama

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

関数_form_validatefrom drupal APIを使用できます

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

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

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

これに:

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

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

2
R0bertinski