13

Drupal 6 フォーム コードをいくつか変更して、ネイティブ フォーム検証を組み込んでいます。コードは次のようになりますが、検証は機能しません。関数 thisFormName_form_validate に入ることさえありません。Drupalian で何か良いアイデアを持っている人はいますか?

function thisFormName_form_alter(&$form, $form_state, $form_id) {
  $form['email_address'] = array(
    '#type' => 'textfield',
    '#title' => t('Enter your email address (optional)'),
    '#default_value' => $object['email_address'],
    '#weight' => 4,
    '#size' => 60,
    '#maxlength' => 128,  
    '#description' => t('Enter email address.'),
  );


function thisFormName_form_validate($node, &$form) {
  if ($form_state['values']['email_address'] == '') 
  {
    form_set_error('', t('Email must be valid format if entered.'));

  }
}
4

2 に答える 2

13

フォームの変更を使用しているため、自分でフォームを作成しないため、検証ハンドラーを自分で追加する必要があります。

function myModule_form_alter(&$form, $form_state, $form_id) {
  $form['email_address'] = array(
    '#type' => 'textfield',
    '#title' => t('Enter your email address (optional)'),
    '#default_value' => $object['email_address'],
    '#weight' => 4,
    '#size' => 60,
    '#maxlength' => 128,  
    '#description' => t('Enter email address.'),
  );
  $form['#validate'][] = 'my_validation_function';
}


function my_validation_function(&$form, &$form_state) {
  if ($form_state['values']['email_address'] == '') {
    form_set_error('', t('Email must be valid format if entered.'));
  }
}

form_nameDrupal は、デフォルトで+として定義された検証のみを使用します_validate。を使用しているため、これは当てはまりませんhook_form_alter

于 2010-03-04T11:41:46.957 に答える
5

編集: 基本的に googletorps と同じ答えです。私のものを投稿している間、彼に気づきませんでした。別の説明のためにここに残しておきますが、彼は正しく、最初の (+1) でした。


あなたの関数の命名には何か怪しいものがあります:

  • すべてのフック実装と同様に、hook_form_alter関数の名前はフォームではなく、カスタム モジュールにちなんで付ける必要があります (例: yourModule_form_alter)。この場合、すべてのフォームに対してトリガーされます。特定のフォームにのみフックする場合はhook_form_FORM_ID_alter、「フック」をモジュール名に置き換え、「FORM_ID」を操作するフォームの ID (名前) に置き換えます。

  • フォームの検証関数のコールバックは、関数名の配列として にリストされています$form['#validate']。明示的に追加する必要がないのは、自分で生成したフォームの便利なショートカットにすぎませんが、フォームにちなんで名付けられた関数を使用し、最後に「_validate」を追加します。あなたの場合、別のモジュールからのフォームを変更しているため、検証関数を明示的に追加する必要があります。

したがって、コードは次のようになります。

function yourModuleName_theFormID_form_alter(&$form, $form_state, $form_id) {
  $form['email_address'] = array(
    '#type' => 'textfield',
    '#title' => t('Enter your email address (optional)'),
    '#default_value' => $object['email_address'],
    '#weight' => 4,
    '#size' => 60,
    '#maxlength' => 128,  
    '#description' => t('Enter email address.'),
  );
  // Add custom validation callback
  $form['#validate'][] = 'yourModuleName_theFormID_validate';


function yourModuleName_theFormID_validate(&$form, &$form_state) {
  if ($form_state['values']['email_address'] == '') {
    form_set_error('', t('Email must be valid format if entered.'));
  }
}
于 2010-03-04T11:48:01.040 に答える