ユーザーの詳細フォームに検証を追加したい。
#validateを使用して検証関数を追加しようとしましたが、何も起こりません。
これはコードです:
function hotphone_checkout_form_commerce_checkout_form_checkout_alter(&$form,&$form_state)
{
$form['#validate'][] = 'mymodule_validate_check';
}
function mymodule_validate_check(&$form, &$form_state)
{
dpm('hererere', $form_state);
die();
}
何が悪いのですか?
これを行うための現在の方法は、Commerce APIのとおり、チェックアウトフォーム全体に検証ハンドラを追加する代わりに、チェックアウトペイン定義を拡張して独自の検証ハンドラを指定します。
カスタム検証に合格した場合、デフォルトのペイン検証ハンドラーにフォールバックします。
この例では、カスタム検証ハンドラーを配送ペインに追加します。
_/**
* Implements hook_commerce_checkout_pane_info_alter
*/
function MODULE_commerce_checkout_pane_info_alter(&$checkout_panes) {
if(isset($checkout_panes['commerce_shipping'])){
$checkout_panes['commerce_shipping']['callbacks']['checkout_form_validate'] = 'MODULE_commerce_shipping_pane_validate';
}
}
/**
* Checkout pane validation override to ensure valid shipping method for address
*/
function MODULE_commerce_shipping_pane_validate(&$form, &$form_state, $checkout_pane, $order) {
// Do some validation tests here... omitted for brevity.
if (!$valid) {
drupal_set_message(t('Some validation error message'), 'warning');
return FALSE;
}
// Fallback to default validator.
if (function_exists('commerce_shipping_pane_checkout_form_validate')) {
return commerce_shipping_pane_checkout_form_validate($form, $form_state, $checkout_pane, $order);
} else {
// Passed validation.
return TRUE;
}
}
_
checkout_form_validate($form, &$form_state, $checkout_pane, $order)
:チェックアウトフォームのペインの要素を介して入力されたデータを検証し、すべてのデータが検証されたかどうかを示すTRUEまたはFALSEを返します
より詳しい情報:
これを試して:
function hotphone_checkout_form_commerce_checkout_form_checkout_alter(&$form,&$form_state)
{
$form['buttons']['continue']['#validate'][] = 'mymodule_validate_check';
}
//custom validation
function hotphone_checkout_form_validate_check($form, $&form_state) {
//suppose you want to validate the field in customer profile billing
$value = $form_state['values']['customer_profile_billing']['field_name'];
if ($value == '') {
form_set_error('customer_profile_billing][field_name', t('Please enter valid values'));
}
}
これは私にとってうまくいった別の方法です:
function MODULE_form_alter ( &$form, &$form_state, $form_id ) {
switch ( $form_id ) {
case 'commerce_checkout_form_checkout':
$form['buttons']['continue']['#validate'][] = 'MODULE_customer_profile_billing_pane_validate';
break;
}
}
function MODULE_customer_profile_billing_pane_validate ( &$form, &$form_state ) {
$needed_by_date = $form_state['input']['customer_profile_billing']['field_bill_date_needed_by']['und'][0]['value']['date'];
$needed_by_time = strtotime( $needed_by_date );
$time_now = strtotime( date( 'Y-m-d' ) );
if ( $needed_by_time < $time_now ) {
form_set_error(
'customer_profile_billing][field_bill_date_needed_by',
'The <b>Needed by Date</b> must not be in the past.'
);
}
}
「drupal commerce way」は、デビッドトーマスの1つです。
これは、新しいペインを宣言したり、既存のペインを変更したくない場合(たとえば、契約条件の単純なチェックボックスを追加する場合)は、従来の「hook_form_alter」を使用することも可能ですが、カスタムの検証関数を作成する必要があることに注意してください。 $ form_state ['rebuild']をTRUEに設定します。または、検証エラーがスローされても、チェックアウトは次のページに進みます...
このような検証関数の簡単な例を次に示します。
function mymodule_terms_and_conditions_validate(&$form, &$form_state) {
if (empty($form_state['values']['terms_and_conditions'])) {
// do not go the next step of the checkout !
$form_state['rebuild'] = TRUE;
}
}