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ステートメントは出力されません。
私は実際にしばらく立ち往生しています。例を調べましたが、何が間違っているのかわかりません。誰でも?
次のように、#validateプロパティをフォーム送信ボタンに添付する必要があります。
$form['submit']['#validate'][] = 'checkout_confirm_email_form_validate'
そしてそれはうまくいくでしょう、そして私の例があなたのフォームツリーと完全に一致する必要はありませんあなたは送信ボタン配列を検索してそれにこの例を適用するべきです
ここで任意の検証関数を使用できます https://api.drupal.org/api/drupal/includes!form.inc/7
リストされている検証は次のようになります
使用例
$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')
);
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.'));
}
}
私はこの行を変更しました:
$form['submit']['#validate'][] = 'checkout_confirm_email_form_validate'
これに:
$form['actions']['submit']['#validate'][] = 'checkout_confirm_email_form_validate';
そしてそれはうまくいきました!